[
  {
    "path": ".gitignore",
    "content": "build\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: c\ncompiler:\n  - gcc\n  - clang\nbranches:\n  except:\n    - artwork\n    - debian\n    - gh-pages\n    - packaging\n    - valamang\nbefore_install:\n  - sudo apt-get update -qq\n  - sudo apt-get install update-manager-core software-properties-common\n  - sudo sed -i 's/^\\(Prompt=\\).*/\\1lts/' /etc/update-manager/release-upgrades\n  - sudo do-release-upgrade -d -f DistUpgradeViewNonInteractive\n  - sudo add-apt-repository -y ppa:vala-team/ppa\n  - sudo apt-get update -qq\n  - eval $(sed -n '/^On Debian based systems install/{n;n;p}' README.md) valadoc\nscript: mkdir build && cd build && cmake -DVALADOC_VERBOSE=ON .. && make && make docs-valama\nnotifications:\n  irc:\n    channels:\n      - \"irc.freenode.org#valama\"\n    on_success: change\n    on_failure: always\n    use_notice: true\n    skip_join: true\n"
  },
  {
    "path": ".tx/config",
    "content": "[main]\nhost = https://www.transifex.com\ntype = PO\nminimum_perc = 80\n\n[valama.valama]\nfile_filter = po/<lang>.po\nsource_file = po/valama.pot\nsource_lang = en\n\n"
  },
  {
    "path": "AUTHORS",
    "content": "Linus Seelinger <S.Linus@gmx.de>\nDominique Lasserre <lasserre.d@gmail.com>\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "#\n# CMakeLists.txt\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\ncmake_minimum_required(VERSION \"2.8.4\")\n\ninclude(\"${CMAKE_SOURCE_DIR}/cmake/project.cmake\")\n\nif(CMAKE_MAJOR_VERSION GREATER \"2\")\n  cmake_policy(SET CMP0048 NEW)\n  project(\"${project_name}\" VERSION \"${${project_name}_VERSION}\" LANGUAGES \"C\")\nelse()\n  project(\"${project_name}\" \"C\")\nendif()\nstring(TOLOWER \"${project_name}\" project_name_lower)\n\nset(bindir \"bin\")\nset(datarootdir \"share\")\nset(libdir \"lib\")\nset(includedir \"include\")\nset(datadir \"${datarootdir}/${project_name_lower}\")\nset(uidir \"${datadir}/ui\")\nset(localedir \"${datarootdir}/locale\")\nset(appdir \"${datarootdir}/applications\")\nset(gsettingsdir \"${datarootdir}/glib-2.0/schemas\")\nset(pixrootdir \"${datarootdir}/pixmaps\")\nset(pixdir \"${pixrootdir}/${project_name_lower}\")\nset(docdir \"${datadir}/doc\")\nset(mandir \"${datarootdir}/man\")\nset(mimedir \"${datarootdir}/mime/packages\")\nif(CMAKE_INSTALL_PREFIX)\n  set(install_prefix \"${CMAKE_INSTALL_PREFIX}/\")\nelse()\n  set(install_prefix)\nendif()\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake/vala\")\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")\n\n\nfind_package(Vala \"0.20\" REQUIRED)\n\n\noption(TRANSLATION \"Build translation.\" ON)\noption(ICONS \"Generate icons.\" ON)\noption(TESTS \"Run tests after after build.\" ON)\noption(GUANAKO \"Build guanako library.\" ON)\nif(CMAKE_BUILD_TYPE STREQUAL \"Release\")\n  option(DOCS \"Build documentation.\" ON)\nelse()\n  option(DOCS \"Build documentation.\" OFF)\nendif()\noption(VALADOC_VERBOSE \"Verbose (private/internal) document generation.\" OFF)\noption(VALADOC_EXTRA \"Generate documentation also for all depending packages.\" OFF)\nif(VALADOC_VERBOSE OR VALADOC_EXTRA)\n  set(DOCS ON)\nendif()\noption(CREATE_CHANGELOG \"Create changelog from git log.\" OFF)\noption(LOCAL \"Add some functionality to execute directly from source directory.\" ON)\noption(POSTINSTALL_HOOK \"Execute hook scripts (gsettings update) after installation.\" ON)\n\nif(GUANAKO)\n  set(project_root \"${project_name_lower}\")\n  set(project_root_version \"${${project_name}_VERSION}\")\n  add_subdirectory(\"guanako\")\n  list(REMOVE_ITEM required_pkgs \"guanako\")\n  list(APPEND vapifiles \"${CMAKE_BINARY_DIR}/guanako/guanako.vapi\")\nendif()\nif(ICONS)\n  add_subdirectory(\"icons\")\nendif()\nif(TRANSLATION)\n  add_subdirectory(\"po\")\nendif()\n\n# Custom library version checks.\nset(definitions)\nset(vapidirs)\nfind_package(PkgConfig)\n# Unix or Windows\nif(WIN32)\n  list(APPEND definitions \"WIN32\")\nelseif(UNIX)\n  list(APPEND definitions \"UNIX\")\nelse()\n  list(APPEND definitions \"NOT_UNIX\")\n  list(APPEND definitions \"NOT_WIN32\")\nendif()\n# config\nlist(REMOVE_ITEM required_pkgs \"config {nocheck,nolink}\")\n# libvala-X.Y\nif(VALA_SHORTVER STREQUAL \"0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_20\")\nelseif(VALA_SHORTVER STREQUAL \"0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_20\")\nelseif(VALA_SHORTVER STREQUAL \"0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_20\")\nelseif(VALA_SHORTVER STREQUAL \"0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_26\")\nelseif(VALA_SHORTVER STREQUAL \"0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_28\")\nelseif(VALA_SHORTVER STREQUAL \"0.30\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(APPEND definitions \"VALAC_0_28\")\nelse()\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND required_pkgs \"libvala-${VALA_SHORTVER}\")\n  list(APPEND definitions \"VALAC_0_20\")\nendif()\n# gtk+-3.0\npkg_check_modules(GTK3.0 REQUIRED \"gtk+-3.0 >= 3.10\")\ncompare_version_strings(\"${VALA_SHORTVER}\" \"0.20\" valares)\nif(valares LESS 1)\n  message(STATUS \"Use gtk+-3.0 vapi from valac 0.22 to support new gtk+-3.0 \"\n                 \"3.10 symbols.\")\n  list(APPEND vapidirs \"--vapidir=${CMAKE_SOURCE_DIR}/extravapi/gtk+-3.0\")\nendif()\n#gtksourceview-3.0\npkg_check_modules(GTKSV3.0 REQUIRED \"gtksourceview-3.0 >= 3.10\")\ncompare_version_strings(\"3.12\" \"${GTKSV3.0_VERSION}\" gtksvres)\ncompare_version_strings(\"3.13.90\" \"${GTKSV3.0_VERSION}\" gtksvres1)\nif((\"${GTKSV3.0_VERSION}\" VERSION_GREATER \"3.14.3\") OR (\"${GTKSV3.0_VERSION}\" VERSION_EQUAL \"3.14.3\"))\n  message (STATUS \"Update files for GtkSourceView 3.14.3\")\n  list(APPEND definitions \"GTK_SOURCE_VIEW_3_14_3\")\nelseif((\"${GTKSV3.0_VERSION}\" VERSION_GREATER \"3.13.90\") OR (\"${GTKSV3.0_VERSION}\" VERSION_EQUAL \"3.13.90\"))\n  message (STATUS \"Update file for GtkSourceView 3.14\")\n  list(APPEND definitions \"GTK_SOURCE_VIEW_3_14\")\nelseif(gtksvres LESS 1)\n  list(APPEND definitions \"GTK_SOURCE_VIEW_3_12\")\nelse()\n  compare_version_strings(\"0.24\" \"${VALA_SHORTVER}\" valares)\n  if(valares LESS 1)\n    message(STATUS \"Use gtksourceview-3.0 vapi from valac 0.22 to not fail\"\n                   \"with deprecated symbols with gtksourceview-3.0 < 3.12.\")\n    list(APPEND vapidirs \"--vapidir=${CMAKE_SOURCE_DIR}/extravapi/gtksourceview-3.0\")\n  endif()\nendif()\n# gdl-3.0\npkg_check_modules(GDL3.0 REQUIRED \"gdl-3.0 >= 3.3.91\")\ncompare_version_strings(\"3.9.91\" \"${GDL3.0_VERSION}\" gdlres)\nif(gdlres LESS 1)\n  list(APPEND definitions \"GDL_3_9_91\")\n  compare_version_strings(\"0.20\" \"${VALA_SHORTVER}\" valares)\n  if(valares LESS 1)\n    message(STATUS \"Use enhanced gdl-3.0 vapi to support new features with \"\n                   \"gdl-3.0 >= 3.9.91.\")\n    list(APPEND vapidirs \"--vapidir=${CMAKE_SOURCE_DIR}/extravapi/gdl-3.0\")\n  endif()\nendif()\n# glib-2.0\npkg_check_modules(GLIB2.0 REQUIRED \"glib-2.0\")\n# gladeui-2.0\npkg_check_modules(GLADEUI2.0 REQUIRED \"gladeui-2.0\")\nlist(APPEND vapidirs \"--vapidir=${CMAKE_SOURCE_DIR}/vapi\")\npkg_check_modules(WKGTK \"webkit2gtk-4.0\")\nif (WKGTK_FOUND)\n\tlist(REMOVE_ITEM required_pkgs \"webkit2gtk-3.0\")\n\tlist(APPEND required_pkgs \"webkit2gtk-4.0\")\n\tlist(APPEND definitions \"WEBKIT2_GTK_4.0\")\n\telse()\n\tmessage(STATUS \"Use webkit2gtk-3.0 vapi from valac 0.25.1\")\n\tlist(APPEND vapidirs \"--vapidir=${CMAKE_SOURCE_DIR}/extravapi/webkit2gtk-3.0\")\nendif()\n\nset(default_vala_flags\n  \"--thread\"\n  \"--target-glib\" \"${GLIB2.0_VERSION}\"\n  \"--enable-experimental\"\n  \"--fatal-warnings\"\n)\n\ninclude(ValaPkgs)\nvala_pkgs(VALA_C\n  PACKAGES\n    ${required_pkgs}\n  DEFINITIONS\n    ${definitions}\n  OPTIONAL\n    ${optional_pkgs}\n  SRCFILES\n    ${srcfiles}\n  VAPIS\n    ${vapifiles}\n  OPTIONS\n    ${default_vala_flags}\n    ${vapidirs}\n)\n\n\n# Set common C-macros.\nadd_definitions(-DPACKAGE_NAME=\"${project_name}\")\nadd_definitions(-DPACKAGE_VERSION=\"${${project_name}_VERSION}\")\nadd_definitions(-DGETTEXT_PACKAGE=\"${project_name_lower}\")\nadd_definitions(-DPACKAGE_DATA_DIR=\"${install_prefix}${datadir}\")\nadd_definitions(-DPACKAGE_UI_DIR=\"${install_prefix}${uidir}\")\nadd_definitions(-DLOCALE_DIR=\"${install_prefix}${localedir}\")\nadd_definitions(-DPIXMAP_DIR=\"${install_prefix}${pixdir}\")\nadd_definitions(-DVALA_VERSION=\"${VALA_SHORTVER}\")\n\nadd_executable(\"${project_name_lower}\" ${VALA_C})\ntarget_link_libraries(\"${project_name_lower}\"\n  ${PROJECT_LDFLAGS}\n  ${GLADEUI2.0_LDFLAGS}\n  \"-lm\"\n)\nadd_definitions(\n  ${PROJECT_C_FLAGS}\n  ${GLADEUI2.0_CFLAGS}\n)\nif(GUANAKO)\n  include_directories(\"${PROJECT_BINARY_DIR}/guanako\")\n  target_link_libraries(\"${project_name_lower}\" \"guanako\")\nendif()\n\n\n# Create the docs.\nfind_package(Valadoc)\nif(VALADOC_FOUND)\n  include(ValaDocs)\n\n  if(VALADOC_EXTRA)\n    set(extra_valadoc_opts\n      \"--private\"\n      \"--internal\"\n    )\n  else()\n    set(extra_valadoc_opts)\n  endif()\n  if(VALADOC_EXTRA)\n    foreach(pkgstr ${required_pkgs})\n      string(REGEX REPLACE \"^([^ \\t]+).*\" \"\\\\1\"  pkg \"${pkgstr}\")\n      list(APPEND extra_valadoc_opts \"--deps=${pkg}\")\n    endforeach()\n  endif()\n  if(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n    set(valadoc_debug \"--verbose\")\n  else()\n    set(valadoc_debug)\n  endif()\n\n  if(DOCS)\n    set(make_all \"ALL\")\n  else()\n    set(make_all)\n  endif()\n  set(valadoc_pkgs)\n  foreach(pkgstr ${required_pkgs} ${optional_pkgs})\n    string(REGEX REPLACE \"^([^ \\t]+).*\" \"\\\\1\"  pkg \"${pkgstr}\")\n    list(APPEND valadoc_pkgs \"${pkg}\")\n  endforeach()\n  valadoc_gen(\"${project_name}\"\n    ${make_all}\n    PACKAGES\n      ${valadoc_pkgs}\n    DEFINITIONS\n      ${definitions}\n    SRCFILES\n      ${srcfiles}\n      ${vapifiles}\n    OPTIONS\n      ${vapidirs}\n      \"--vapidir\" \"${VALA_DATADIR}/vapi\"\n      \"--vapidir\" \"${CMAKE_SOURCE_DIR}/vapi\"\n      \"--vapidir\" \"${VALA_VAPIDIR}\"\n      \"--target-glib\" \"${GLIB2.0_VERSION}\"\n      ${extra_valadoc_opts}\n      ${valadoc_debug}\n  )\n  if(GUANAKO)\n    add_dependencies(\"docs-${project_name_lower}\" \"guanako\")\n  endif()\nelse()\n  set(DOCS OFF)\nendif()\n\n\n# Run tests.\nif(TESTS)\n  add_subdirectory(\"tests\")\nendif()\n\n\nif(CREATE_CHANGELOG)\n  find_package(Perl)\n  if(PERL_EXECUTABLE)\n    execute_process(COMMAND \"${PERL_EXECUTABLE}\" \"${CMAKE_SOURCE_DIR}/cmake/gitlog-to-changelog.pl\"\n                    WORKING_DIRECTORY \"${PROJECT_SOURCE_DIR}\"\n                    OUTPUT_FILE \"Changelog\")\n  endif()\nendif()\n\nif(CMAKE_BUILD_TYPE STREQUAL \"Release\")\nelse(CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n  set(CMAKE_VERBOSE_MAKEFILE ON)\nendif()\n\n\n# Generate and install manual page.\ndatestring(MONTH_DATE \"%B %Y\")\nset(DATADIR \"${install_prefix}${datadir}/\")\nset(manfile \"data/${project_name_lower}.1\")\nconfigure_file(\"${manfile}.in\" \"${manfile}\")\ninstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${manfile}\" DESTINATION \"${mandir}/man1\")\n\n\n# Gsettings schemas\nif(LOCAL)\n  set(local_build \"LOCAL\")\nelse()\n  set(local_build)\nendif()\ngsettings_install(${local_build} FILES \"data/org.valama.gschema.xml\")\n\n\ninstall(TARGETS ${project_name_lower} DESTINATION \"${bindir}\")\n\n# Additional files.\ninstall(DIRECTORY \"pixmaps/\" DESTINATION \"${pixdir}\")\ninstall(FILES \"data/layout.xml\" DESTINATION \"${datadir}\")\ninstall(DIRECTORY \"data/templates\" DESTINATION \"${datadir}\")\ninstall(DIRECTORY \"data/buildsystems\" DESTINATION \"${datadir}\")\ninstall(FILES \"data/valama.xml\" DESTINATION \"${mimedir}\")\n\n# Install user interface files if used and copy them to build directory.\nset(uifiles_build)\nforeach(uifile ${uifiles})\n  add_custom_command(\n    OUTPUT\n      \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n    COMMAND\n      \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\" \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n    DEPENDS\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\"\n    COMMENT \"\"\n  )\n  list(APPEND uifiles_build \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\")\n  install(FILES ${uifile} DESTINATION \"${uidir}\")\nendforeach()\nadd_custom_target(\"ui_copy_${project_name_lower}\" DEPENDS ${uifiles_build})\nadd_dependencies(\"${project_name_lower}\" \"ui_copy_${project_name_lower}\")\n\n# Uninstall target\nadd_custom_target(uninstall\n  COMMAND\n    \"${CMAKE_COMMAND}\" -D \"CUSTOM_SOURCE_DIR:FILEPATH=${CMAKE_SOURCE_DIR}\"\n                       -D \"POSTREMOVE_HOOK:BOOL=${POSTINSTALL_HOOK}\"\n                       -D \"GSETTINGSDIR:FILEPATH=${install_prefix}${gsettingsdir}\"\n                       -P \"${CMAKE_SOURCE_DIR}/cmake/SimpleUninstall.cmake\"\n)\n\n\n# Print some information about build.\ndatestring(current_date \"%F %T\")\nmessage(\"\")\nmessage(\"---------------------------------------------\")\nmessage(\"                          ${current_date}\")\nif(GUANAKO)\n  set(guanako_text \"  (Guanako ${Guanako_VERSION})\")\nelse()\n  set(guanako_text)\nendif()\nmessage(\"${project_name} ${${project_name}_VERSION}${guanako_text}\")\nmessage(\"\")\nif(CMAKE_BUILD_TYPE)\n  message(\"Build type: ${CMAKE_BUILD_TYPE}\")\n  string(TOUPPER \"${CMAKE_BUILD_TYPE}\" release_upper)\n  set(c_flags \"${CMAKE_C_FLAGS_${release_upper}}\")\nelse()\n  message(\"Build type: Default\")\n  set(c_flags \"${CMAKE_C_FLAGS}\")\nendif()\nmessage(\"\")\nmessage(\"Installation prefix:    ${CMAKE_INSTALL_PREFIX}\")\nforeach(def ${definitions})\n  list(APPEND default_vala_flags \"-D;${def}\")\nendforeach()\nbase_list_to_delimited_string(vala_flags\n  DELIM \" \"\n  BASE_LIST \"${default_vala_flags}\"\n)\nmessage(\"C compiler:             ${CMAKE_C_COMPILER}\")\nmessage(\"C compiler version      ${CMAKE_C_COMPILER_VERSION}\")\nif(\"${c_flags}\" STREQUAL \"\")\n  set(c_flags \"(none)\")\nendif()\nmessage(\"C flags:                ${c_flags}\")\nmessage(\"Vala compiler:          ${VALA_EXECUTABLE}\")\nmessage(\"Vala compiler version:  ${VALA_VERSION}\")\nif(\"${vala_flags}\" STREQUAL \"\")\n  set(vala_flags \"(none)\")\nendif()\nmessage(\"Vala flags:             ${vala_flags}\")\nmessage(\"GLib version:           ${GLIB2.0_VERSION}\")\nmessage(\"\")\nif(DOCS)\n  if(VALADOC_VERBOSE AND VALADOC_EXTRA)\n    message(\"Build documentation:    extra/verbose\")\n  elseif(VALADOC_VERBOSE)\n    message(\"Build documentation:    verbose\")\n  elseif(VALADOC_EXTRA)\n    message(\"Build documentation:    extra\")\n  else()\n    message(\"Build documentation:    normal\")\n  endif()\nelse()\n  message(\"Build documentation:    no\")\nendif()\nif(TRANSLATION_BUILD)\n  message(\"Build translations:     yes\")\nelse()\n  message(\"Build translations:     no\")\nendif()\nif(GETTEXT_PACKAGE_NAME)\n  if(GETTEXT_PACKAGE_VERSION)\n    message(\"Gettext package:        ${GETTEXT_PACKAGE_NAME} (${GETTEXT_PACKAGE_VERSION})\")\n  else()\n    message(\"Gettext package:        ${GETTEXT_PACKAGE_NAME}\")\n  endif()\nendif()\nif(TESTS)\n  message(\"Tests:                  enabled\")\nelse()\n  message(\"Tests:                  disabled\")\nendif()\nif(CMAKE_VERBOSE_MAKEFILE)\n  message(\"Verbose build:          yes\")\nelse()\n  message(\"Verbose build:          no\")\nendif()\nmessage(\"\")\nmessage(\"---------------------------------------------\")\nmessage(\"\")\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "COPYING",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "Changelog",
    "content": "2014-08-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tInclude Valama Changelog.\n\n\tCMake: Create Changelog with FSF gitlog-to-changelog.\n\n\tValama: Add extravapi directory to project.\n\n\tValama: Allow + in file names.\n\n2014-08-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama file structure: Add missing tooltips.\n\t * Add tooltips and set search entry text to symbol name (so a \"all-files\"\n\t   button doesn't clear the search).\n\t * Disable some debug messages.\n\n\tGuanako: Synchronize parser and scanner from upstream.\n\t * Unfortunately versions are incompatible between 0.26 (and before)\n\t   maintaining both versions until 0.24 support drops.\n\n\tCMake: Add webkit2gtk-3.0 vapi to support vala < 0.26\n\t * Update valama.vlp.\n\t * Add libsoup-2.4 as dependency.\n\n\tValama: Add rudimental valadoc browser.\n\n\tGuanako: Fix package listing.\n\t * Sort package names case insensitive.\n\t * Don't include last (empty) line from pkg-config output (null string).\n\n\tValama: Increase package dialog window size.\n\n\tValama: Fix alignment of package list.\n\t * Remove leading whitespaces from pkg-config package list descriptions.\n\n\tValama: Fix valadoc comment.\n\n\tValama Autotools: Fix distclean.\n\t * Copy clean, just with distclean target this time.\n\n\tValama: Check for Makefile existance for clean command.\n\t * For make clean command obviously the Makefile needs to exist.\n\t * Update CMake distclean check.\n\n\tValama: Add global threads option for make commands.\n\t * Add configurable (no config implemented yet) option to control make options\n\t   in one place.\n\n\tValama: Fix first build system selection.\n\t * Set default build system in welcome_screen (according to template).\n\n\tValama Autotools: Don't add packages without pc file.\n\n\tValama Autotools: Remove creation date from configure.ac.\n\t * Synchronize this with CMake build system. As long as there is no check for\n\t   same content a time doesn't make sense (only shows when you compile the\n\t   project).\n\n\tValama Autotools: Fix build path.\n\t * Bug introduced by f3fcc1e.\n\n\tValama Autotools: Drop prepared flag.\n\n2014-08-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Fix plain build system.\n\t * Set buildpath in preparation method.\n\t * Use base method in BuilderCMake and BuilderAutotools as well.\n\n2014-08-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Workaround to support fullscreen again.\n\t * Workaround via hidden button to fix regression introduced by a720b9a.\n\t   It's now possible to get out of the fullscreen mode again (keybinding\n\t   only).\n\n\tValama: Simplify menu.\n\t * Remove most nested parts.\n\t * Use new menu button for extra widgets (reporter, search, etc.).\n\n2014-08-14  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Fix build system selection in welcome screen.\n\t * Support plain build system.\n\t * Select default build system from template and enable library checkbox.\n\t * Create less new objects (reuse and avoid unnecessary creation).\n\n2014-08-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Fix resetting of project settings.\n\t * Support reset of is-library and buildsystem selections.\n\n\tCMake: Synchronize buildsystem files.\n\n\tCMake: Fix xgettext comment extraction.\n\t * Adjust changed gschema.xml path.\n\n2014-08-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Move toolbar and menu into window header.\n\t * Saves some space at the top but menu is too clunky, needs to go into\n\t   more buttons and a larger drop down menu, less nested menu items.\n\t * Split into left and right toolbar.\n\n\tSupport Valama building Valama\n\t * Remove packages with custom vapis (config, gladeui-2.0) from package\n\t   list and add compiler flags manually.\n\n\tTravis: Exclude valamang branch from testing.\n\n\tGuanako: Search for pkg by name.\n\n\tValama: Don't add same vapi twice.\n\n\tGuanako: Support custom vapis as packages.\n\n\tSupport custom vapi for package.\n\t * Support empty extracheck with just a custom vapi.\n\n\tFix debug output (remove comma at EOL)\n\n\tAdd prefix (Guanako/Valama) to console messages.\n\t * Fix some message types (error, warning).\n\n2014-08-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSynchronize CMake buildsystem.\n\n\tFix gee versioned dependency in valama.vlp.\n\n2014-08-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tProject file: Support choices in extrachecks\n\t * Simplify valama.vlp a bit.\n\t * No nested choices supported yet.\n\n2014-08-01  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDrop gdl < 3.8 support.\n\t - Current version in Debian unstable is 3.8 so still keep support for this\n\t   version (current gtk+-3.0 version is 3.12).\n\n\tCMake: New libvala, old gtksourceview support\n\t * Support libvala >= 0.24 with gtksourceview 3.10.\n\n\ttravis-ci: Easily add PPA\n\t - Install software-properties-common to use add-apt-repository command.\n\n\tUpdate installation description.\n\t - Use libvala-0.24 as default, update travis-ci accordingly (use PPA again).\n\n\tUpdate Valama vlp file.\n\t - Set defines according to CMakeLists.txt.\n\t - Update extra vapi paths.\n\n\tUpdate versioned dependencies.\n\t - gtk+-3.0 and gtksourcview-3.0 >= 3.10 (from 3.4)\n\n\tCMake: Search for global valac first.\n\t - Fix regression introduced by 19347ef. Don't try to find a smarter solution\n\t   than the OS.\n\n\tFix travis build and some gdl CMake checks.\n\t - Use Ubuntu 14.04 to test build (run distribution upgrade before test).\n\t - Add gtk+-3.10 support for valac 0.20.\n\t    - Use vapidir option to overwrite system vapis (instead of custom vapi\n\t      which may conflict with system vapi coming as dependency).\n\t    - Use own directory for each extra vapi to not pull in all vapis.\n\t - Support old gdl versions again (fix regression introduced by 9177d13).\n\n2014-07-31  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #152 from inizan-yannick/master\n\tSpecify Gtk.SourceView in code to avoid conflicts with new Vala.SourceView\n\n2014-07-31  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tupdate .travis.yml\n\n\tupdate .travis.yml\n\n\tupdate README.md with newer packages. update .travis.yml with newer repository.\n\n\tSpecify Gtk.SourceView in code to avoid conflicts with new Vala.SourceView.\n\n2014-05-28  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #147 from inizan-yannick/master\n\tUpdate Guanako for vala-0.26\n\n2014-04-02  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tdefine VALA_0_26 for Vala.ArrayType\n\n2014-03-31  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tfix findVala.cmake correctly\n\n2014-03-28  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #144 from inizan-yannick/master\n\tremove unsupported vala versions\n\n2014-03-26  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tfix define variables\n\n2014-03-25  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tremove unsupported vala version, vala-0.26 added. fix #128. fix super source view for Gtk >= 3.12. translations updated.\n\n2014-03-21  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tupdate french translations.\n\n2014-03-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #142 from inizan-yannick/master\n\tInitialize buildpath for each buildsystem\n\n2014-03-15  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tInitialize buildpath for each buildsystem, fix the bug in cmake.vala, at preparate function.\n\n2014-03-11  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tMerge remote-tracking branch 'upstream/master'\n\n2014-03-07  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #139 from august0815/elemntary\n\tElementary template\n\n2014-02-23  Mario  <augustulus\\freenet.de>\n\n\tver. 0.1a\n\n\t.\n\n\t.\n\n\tVer.0.1\n\n\tElementary Template\n\n2014-02-10  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Do not complete after curly brackets\n\n2014-01-26  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #135 from steveno/master\n\tAdd some missing dependencies on Fedora 20\n\n2014-01-26  Steven Oliver  <oliver.steven@icloud.com>\n\n\tAdd missing dep to Fedora instructions\n\tNeed package to convert icons\n\n\tAdd missing dep to Fedora instructions\n\n2014-01-21  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tconsider posix as package. fix build system choice: builder is correctly set.\n\n2014-01-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #134 from inizan-yannick/master\n\tpackage selection dialog updated.\n\n2014-01-21  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tfix CMakeLists.txt for valadoc\n\n\tAdd library support for Autotools (no for cmake), with a template. ProjectSettings: add a CheckButton for library project, and a ComboBoxText for build system selection. WelcomeScreen: add a package selection dialog.\n\n2014-01-20  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tchoose build system in project wizard.\n\n\tpackage selection dialog updated. don't include package if .pc file is missing.\n\n2014-01-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: No null sourcerefs in refactoring method\n\n2014-01-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Fixed instability caused by last commit\n\n2014-01-17  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Highlight other references of symbol at cursor\n\n2014-01-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Hopefully fix incomplete quit (#133)\n\n\tValama: Remove GTK < 3.10 support\n\n\tMerge pull request #130 from inizan-yannick/master\n\t'icon_size' properties must be set with an enum, not int with lastest vala versions.\n\n2014-01-05  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tSupport of GladeUI construction. Support of Autotools. Addition of templates for Gst Audio/Video.\n\n2013-12-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Use LinkedList instead of ArrayList where possible\n\n2013-12-24  inizan-yannick  <inizan.yannick@gmail.com>\n\n\t'icon_size' properties must be set with an enum, not int with lastest vala versions.\n\n2013-12-23  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Redesigned project settings\n\n\tValama: Lots of cleaning up, introducing GTK 3.10\n\t * Reworked welcome screen (clean internal structure), new design using GTK 3.10\n\t * Removed old dialogs\n\t * Using GtkHeaderBar\n\t * Preparing build system selection\n\n2013-12-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Improved boolean expression completion\n\n2013-12-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Removed old dialog, clearing search entry clears marks and results\n\n2013-12-09  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: fix #114, thanks to inizan-yannick\n\n2013-10-12  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge pull request #118 from ppareit/master\n\tFix search for selected text when search window is already open #42\n\n2013-10-11  Pieter Pareit  <pieter.pareit@gmail.com>\n\n\tFix issue #42, search for selected text when search window is already open.\n\n2013-10-07  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFurther work on reference finding\n\n\tValama: Do not autocomplete after semicolon (Fixes #119)\n\n2013-10-04  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Improved reference finding\n\n2013-10-02  Linus Seelinger  <S.Linus@gmx.de>\n\n\tLittle reference fix, removed obsolete z_position from clutter display\n\n\tFixed some collateral damage of earlier changes\n\n2013-10-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README: clutter-gtk-1.0 dependency\n\n2013-10-01  Linus Seelinger  <S.Linus@gmx.de>\n\n\tForgot a file. Well done, linus, well done.\n\n\tExperimental project structure viewer using Clutter\n\t * Added clutter-gtk dependency (uncritical, as llvmpipe can kick in if there is no gpu acceleration)\n\t * Added experimental structure viewer (shows (some) references, drag&drop)\n\t * Experimental CodeVisitor implementation\n\n2013-09-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix build on gdl < 3.5.5, valac >= 0.20 systems (travis).\n\t * Fix compare_version_strings handling for gdl/gtk.\n\n\tFix gdl and gtk version checks.\n\t * Adjust gdl check to 3.3.91 because of post release bump to 3.4.\n\t * Fix check for valac >= 0.20 and gdl < 3.5.5 (regression).\n\n\tCMake: Fix version string comparison (by James Bigler).\n\t * Fix compilation on gtk+ >= 3.10, gdl >= 3.10, etc.\n\n\tUpdate CMake checks for gee-0.8 >= 0.10.5.\n\n\tMerge pull request #117 from inizan-yannick/patch-1\n\tVersion 0.10.5 of gee-0.8 or newer is needed (read_only_view of MultiMap).\n\tThanks to Yannick Inizan!\n\n2013-09-28  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tUpdate README.md\n\tversion 0.10.5 of gee-0.8 or newer is needed\n\n2013-09-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd Ubuntu installation instruction. Closes #116\n\n2013-09-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCase insensitive ordering of packages list.\n\n\tGuanako: Add initialization method for static members.\n\n\tGuanako: Cache vapi dirs.\n\n\tProjectBrowser: Display directory and document icons.\n\t * Just a little eye candy, project browser needs to be reworked.\n\n2013-09-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Synchronize  build system.\n\n\tMerge jakobwesthoff/Vala_CMake\n\t * Add option for conditional compilation. (Jörg Thalheim)\n\t    - Update CMakeLists and guanako/CMakeLists.txt accordingly.\n\t * Fix ARGS_DIRECTORY handling. (Gary Kramlich)\n\n2013-09-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tTemplate, build system caching and improved loading.\n\t * Support multiple template and build system directories.\n\t * Also search in $USERDATADIR/valama/{templates,buildsystems} for templates /\n\t   build systems.\n\t * Cache available packages (Guanako), locales, templates and build systems\n\t   and provide read only view on them. (There is a bug for maps, related to\n\t   #666728)\n\t * Provide default (builtin) empty template.\n\t * Support creating ValamaProject/ProjectFile from data string.\n\n2013-09-12  Linus Seelinger  <S.Linus@gmx.de>\n\n\tInitial line-by-line execution support\n\t * Guanako: Frankenstein: Line-by-line breakpoints. Still a little stupid, but works unless there are multiple statements per line.\n\t * Valama: GUI for line-by-line execution\n\n\tInitial reference finding support\n\t * Guanako: Support finding references of an object\n\t * Valama: Made search widget more flexible, show reference finding results\n\n\tInitial refactoring support\n\t * Guanako: Support iterating through expressions\n\t * Valama: Allow jumping to a symbol's declaration\n\t * Valama: Improved current file structure behaviour\n\n\tGuanako: Non-alphabetic prefixed proposals first\n\n\tGuanako: Initial support for embedded statements, escaped values\n\n\tValama: Made completion thread more reliable\n\n\tCompletion improvements\n\t * Guanako: Support return statements, various minor improvements\n\t * Valama: Determine current line in a more intelligent way (supports multiple statements in one line etc)\n\n2013-09-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Don't crash on circular deps, keep ordering of deps. Closes #113\n\t * No performance optimizations. get_package_dependencies_int could include\n\t   package_name in deps list to save some runtime performance. Additionally\n\t   add_packages code could be cleaned up. Shouldn't be a bottleneck though\n\t   because package list + deps are not that big.\n\t * datatype_to_string: Track InvalidType with conflicting vapis.\n\t   Currently no hint on user interface.\n\n\tRun SymbolBrowser update only once when multiple pkgs were added.\n\n2013-09-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #110 from inizan-yannick/master\n\tUse combobox to add (multiple) new packages. Thanks to Yannick Inizan!\n\n\tRuntime of selecting (\"commiting\") new packages is always O(n) (where n is\n\tmaximum number of packages). This shouldn't be an issue because there aren't\n\ttoo much packages but can be improved by keeping a list of selected packages\n\twith O(mlog(m)) performance costs by inserting/deleting (where m is number of\n\tcurrently selected packages) and O(1) costs with \"commiting\" new packages.\n\n2013-09-06  inizan-yannick  <inizan.yannick@gmail.com>\n\n\tpackage selection by checkbox, change accordingly project.vala\n\n2013-09-05  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: expression_to_string(..) fallback to to_string()\n\t * Fixes subset of #112.\n\n2013-09-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReduce buffering of application/build output.\n\t * Use smallest possible buffer size which is G_MAX_CHAR_SIZE = 10.\n\t   Unfortunately this does not completely disable buffering. Related to #15.\n\n\t   Possibly it's better to use a vte-terminal instead of spawn-async +\n\t   textview. Additional advantage is to directly have a terminal available on\n\t   build errors.\n\n2013-09-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tNew gdl-3.0 release: 3.9.91 (update defines)\n\n\tMerge pull request #111 from placidrage/master\n\tFixed finding valac with version in filename. Thanks to Joe R. Nassimian!\n\n2013-09-01  Joe R. Nassimian  <nassimian.joseph@gmail.com>\n\n\tFixed finding vala with version in filenames\n\tBuild failed on systems when version was appended to valac-.\n\n\tThe problem was solved by using the second and more complete definition of the find_program command.\n\thttp://cmake.org/cmake/help/v2.8.8/cmake.html#command:find_program\n\n2013-09-01  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Improved array completion\n\n2013-08-31  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Fixed symbol accessibility outside methods\n\n2013-08-29  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama:\n\t * Fixed method signature remaining visible\n\t * Update search results even if all files are included (newly openend files must be included, too!)\n\n2013-08-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tPush transifex configuration.\n\n\tCMake: Enable DOCS with VALADOC_* enabled implicitly.\n\n\ttravis-ci: Remove quiet options to see build failure.\n\n\tAdd travis-ci hook.\n\n\tUse ui directory for ui files by default.\n\n\tSupport empty directories by default.\n\t * Already support it while parsing vlp file.\n\n2013-08-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix deprecated gsettings path. Closes #108\n\n2013-08-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README: Name IRC channel\n\n\tFix guessing of source language. Thanks to Julien Legras.\n\n2013-08-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tWelcomeScreen: Use ~ as abbreviation for home directory.\n\n\tUse absolute path to save recent project files.\n\n\tCMake: Support imagemagick, drop manpage compression, quoting, VERBATIM\n\t * Support imagmagick's convert as fallback if rsvg-convert is not available.\n\t * Drop manual page compression.\n\t * Quote all strings.\n\t * Use VERBATIM for all custom commands.\n\t * Use additional (version independent) vala/vapi vapidir for valadoc\n\n\tFix UiTemplateSettings FileChooserButton bookmarked locations.\n\t * Fix also deprecated ui_create_project_dialog.\n\n\tUpdate cmake/project.cmake (only indentations).\n\n\tremove_recursively: Improve error messages.\n\t * Show exactly which file failed with which error.\n\t * Cmake buildsystem: Show distclean error in build output window.\n\n\tReset cached not available defines with distclean target.\n\n\tRemember new and already checked but not enabled defines.\n\t * Recognize already enabled defines from bare Ganako CodeContext.\n\t * Remember already checked (but not enabled) defines. Currently no\n\t   possibility to force recheck (which e.g. makes sense after installing\n\t   some libraries on system after launching Valama).\n\n2013-08-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Synchronize buildsystem.\n\n2013-08-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Improve gsettings installation.\n\t * Verify schemas (only with LOCAL option).\n\t * Copy schemas to build directory when origian schemas changed (only with\n\t   LOCAL option).\n\n2013-08-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: *word does not allow empty string any more; work on completion outside methods\n\n2013-08-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #107 from juliomino/master\n\tAdd fullscreen support. Closes #89. Thanks to Julien Legras!\n\n2013-08-19  Julien Legras  <juliomino@gmail.com>\n\n\tAdd fullscreen support (valama Issue #89)\n\n2013-08-17  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Copy ui files to build directory whenever they changed.\n\n2013-08-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Copy ui files to build directory.\n\n2013-08-15  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Completion for classes and namespaces declaration; Fixed a possible crash\n\n2013-08-14  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Fix occasional crash caused by invalid error positions\n\n\tGuanako: Little performance tuning/cleanup in get_symbol_at_pos\n\n2013-08-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix build error: Remove uninstall target of Guanako\n\n2013-08-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tIndent cmake/project.cmake\n\n\tMerge jakobwesthoff/Vala_CMake\n\t * Check for valac-Major.Minor too so this work on more distros.\n\t   (Tomáš Chvátal)\n\n\tSynchronize CMake templates.\n\n\tBasic support for ui/glade files.\n\n2013-08-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Keep completion proposals open after selecting one\n\n\tGuanako: Little fix for autocompletion of subroutine parameters\n\n2013-08-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README (new libvala version supported)\n\t * Remove hint to edit cmake/project.cmake and cmake/guanako.cmake manually because this should now work without any changes.\n\n\tUse proper solution for #695972 since gdl >= 3.8.\n\t * stock-id update works well since gdl 3.8.1 (add new define GDL_3_8).\n\n\tInclude mnemonic strings fully into gettext string.\n\t * Important because difference of word starting is locale dependant.\n\n2013-08-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGTK_STOCK transition (partially).\n\t * Since Gtk 3.10 GTK_STOCK is deprecated so replace it. See also migration\n\t   document[1].\n\t   Some stock values are currently hardcoded (only transitional):\n\t    - libgdl has not deprecated stock items yet so keep using\n\t      Gdl.DockItem.with_stock. There is Gdl.DockItem.with_pixbuf_icon but\n\t      perhaps there will come an icon_name property.\n\t    - libgtksourceview has changed with 3.9.3 which is currently not\n\t      installed on my system, so wait for proper transition.\n\n\t    Some icons are gone from dialogs. If they are important they have to\n\t    be added manually.\n\n\t NOTE: Do not forget to track theme changes and change icons loaded by\n\t       Gtk.IconTheme.load_icon.\n\n\t[1]: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub\n\n2013-08-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSupport Vala 0.21.1 (libvala-0.22).\n\t * Fix recognition of odd minor version numbers.\n\n\tTests: Invalid project files.\n\n2013-07-31  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Working on menus\n\t * Added compile dropdown menu in toolbar\n\t * Added a separator in view menu\n\t * Cut out some middleman functions\n\n2013-07-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Vala compile rules improvement.\n\t * Neither recompile all Vala source files twice nor recompile all C files\n\t   every time only a single Vala file has changed.\n\n2013-07-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #102 from Overscore/master\n\tUpdate French translation. Thanks to Overscore!\n\n2013-07-21  Overscore  <github@lorang.net>\n\n\tUpdate fr.po\n\n2013-07-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDrop FixedTreeSet.\n\t * Every distribution should no provide a fixed libgee version.\n\n\tDrop gee-1.0 support.\n\n2013-07-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tExtend symbolsig_to_string (no failures with all vapis).\n\t * No failures with currently supported symbols (methods and classes). Full\n\t   coverage of distributed vapis for those symbols.\n\n\t NOTE: Though the symbolsig_to_string method (and submethods) becomes\n\t       difficult to maintain for different (atm 3) outputs (and we support\n\t       currently only a limited subset of symbols) a small AST (per symbol)\n\t       could be a scalable solution.\n\t       A small parser can then format the symbol's AST representation with\n\t       markup etc.\n\n2013-07-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tWelcomeScreen: Place logo with CSS. Fix double click event.\n\t * Use CSS definition to place logo to easily add additional UI elements at\n\t   the same place (e.g. buttons etc.).\n\t * Open project with button release not already press event.\n\n2013-07-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tWelcomeScreen: Completely work with ids to switch creation steps.\n\n2013-07-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix po files.\n\n\tWelcomeScreen refactoring (2).\n\t * Use TemplatePage class for project settings.\n\t * Remove deprecated and unused WelcomeScreen.add_page. All new template pages\n\t   now has to use TemplatePage as base class.\n\n\tWelcomeScreen refactoring.\n\t * Use TemplatePage class for file chooser (opener).\n\t * Add some symbols to TemplatePage.\n\n\tHandle request_close in main routine.\n\t * Don't save project file twice.\n\n2013-07-09  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README: ldconfig call on system wide installation\n\n2013-07-09  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCover multy byte chars for root path.\n\t * Add some tests:\n\t    - utf8_paths\n\t    - bytecharindex\n\t * Make some public methods static.\n\n\t * Case insensitive file extension for template images. (Manually permute\n\t   possibilities.)\n\n2013-07-08  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tRun symbol update threaded.\n\n2013-07-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMove symbol to string conversion to Guanako.\n\t * Build complete symbol (e.g. method) signature from Vala.Symbol. Don't use\n\t   Vala.DataType.to_qualified_string() to be more flexible. E.g. add some\n\t   markup or line breaks later etc.\n\t * Currently only method signature is complete.\n\n2013-07-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse rsvg-convert instead of imagemagick to convert svg to png.\n\n\tSynchronize CMake build system files.\n\n2013-06-30  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix crash introduced by 8c0cd64.\n\t * Possibility that SourceLocation.column is after EOL so check it too.\n\n\tSupport sorting in symbol browser.\n\n2013-06-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUiSourceViewer: Workaround if error bounds out of (visible) range.\n\t * Thanks to Florian Brosch. Code is copied from a vala editor draft.\n\n\tUiReport: Fix source code jump.\n\t * Fix regression introduced by 2c1ff3b. Get rid of duplicate data structure\n\t   (list of errors) and store Reporter.Error directly in ListStore (which\n\t   requires the Reporter.Error to be an GObject).\n\n2013-06-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix tests if guanako is not already installed.\n\n\tAdd one missing project file test to cover all relevant branches.\n\n\tSynchronize valaparser from 6747b2f7.\n\n2013-06-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd some ProjectFile tests.\n\t * ProjectFile tests:\n\t    - get_absolute_path\n\t    - get_relative_path\n\t    - Loading different project file versions.\n\t * Note: Those tests require the test program to be executed directly from\n\t         tests/ directory.\n\n\t * ProjectFile constructor now throws LoadingError on failure.\n\n\t * CMake:\n\t    - copy_dirs: Recursively copy directory content.\n\t    - get_files_recursively: Recursively list all file content in specified\n\t                             directory\n\n2013-06-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tContinue restructuring project management related files.\n\t * project.vala | project_file    | package_managment | buildsystem/base\n\t    ------------|-------------------------------------|-----------\n\t                |                 | package_exists   <|------\n\t                |                 | package_flags    <|------\n\t         -------|-----------------|>VersionRelation   |\n\t         -------|>VLP_VERSION_MIN |                   |\n\t         -------|>LoadingError    |                   |\n\n\tProjectBuilder: Fix exit code.\n\n2013-06-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAlmost full support for plain build system.\n\t * Defining (and lookup) of const strings (e.g. PACKAGE_NAME, etc.) is not\n\t   implemented yet. The lookup is perhaps a Guanako feature.\n\n\t * NOTE: Plain build system does not cache anything at all so it's not\n\t         recommended for anything than very small projects.\n\n2013-06-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUiReport: Fix synchronized sorting.\n\n\tValama: guess_pkg_by_define: Don't display error on false try.\n\n\tCMake: gsettings_install: Fix LOCAL option. Closes #94\n\t * Fix \"improvement\" of ed53979a.\n\n2013-06-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUiReport: Support sorting of columns.\n\n\tDisable stylechecker.\n\n2013-06-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGettext.cmake: Use parent directory as default working dir.\n\n\tFix build system file display.\n\n2013-06-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Set buildsystem after loading\n\n2013-06-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix project file update on package changes.\n\t * Fix object permissions for ProjectFile. Though those are not perfect\n\t   because Collection.add, Collection.remove etc. is still (and was already)\n\t   possible. So in future use read_only_view to only allow read only access\n\t   (for plugins) to some collections.\n\t * Use TreeMap<string, PackageInfo> instead of TreeMultiMap for packages map.\n\t   No hints in source code found why a multimap is necessary. It does not make\n\t   sense because package names are distinct. Multiple same packages with\n\t   different versions won't work anyway (name clashes).\n\t * Project.add_package_by_name now returns null if package was already added\n\t   to project.\n\n\tFix docstrings. Closes #93\n\n2013-06-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Major clean-up in project.vala. Looked like Sauerkraut before. Writing back package changes will be fixed later.\n\n\tValama: Removed obsolete current symbol widget (completely, i hope)\n\n2013-06-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Make tests target dependent of guanako and valama targets.\n\t * Fixes parallel build issue but not problems with single source files used\n\t   by multiple targets.\n\n\tReduce clutter template deprecated warnings.\n\t * One warning is still remaining: Actor.animate\n\n2013-06-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd tests (based on libgee tests).\n\t * Add tests for following methods:\n\t     - comp_version\n\t     - split_path (already fix some issues)\n\t * Use libgee's testcase.vala for some GLib.Tests abstractions.\n\n\t * CMake integration not completed because some files are required both for\n\t   tests and also Valama executable itself. And some source files currently\n\t   are compiled twice. This leads to some unnecessary recompile issues.\n\n\t * NOTE: Build system test features aren't used at all to keep tests\n\t         independent of build system (but functionality is limited therefore).\n\t         E.g. tests will completely fail on a single failure and it's not\n\t         possible to disable tests without modifying source code (it's easy\n\t         though).\n\n2013-06-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSome string <-> VersionRelation abstractions.\n\n2013-06-17  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDon't try to guess already enabled defines.\n\n\tDon't save custom_vapis back to project file if enabled by extracheck.\n\n\tValama: Support custom vapis (project file).\n\t * Support package checks to enable defines based on package version and/or\n\t   use custom vapis based on version (or independent of it).\n\t * Allow to disable dependency tracking for packages/vapis (project format\n\t   change).\n\t * Guanako:\n\t    - Add static method to get list of vapi/deps directories: get_vapi_dirs\n\t    - Add static method to look for vapi/deps file:\n\t      get_vapi_path, get_deps_path\n\t    - Add get_vapis method to get used vapis (analogous to get_source_files).\n\t * Drop some macros: PIXMAP_DIR, VALA_VAPI_DIR, VALA_DATA_DIR\n\n\tValama: Extend project format: defines, custom vapis\n\t * Incompatible with previous format.\n\n2013-06-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Gettext (desktop files): Support build in source directory.\n\n2013-06-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: FindVala: Fix if no suitable vala version found.\n\n2013-06-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #90 from cicku/patch-1\n\tFix Fedora dependency in README.md. Thanks to Christopher Meng!\n\n2013-06-10  Christopher Meng  <cickumqt@gmail.com>\n\n\tUpdate README.md\n\tFix the incorrect dep name.\r\n\t\r\n\tNote I'll package it soon.\n\n2013-06-07  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate image URL.\n\n2013-06-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Support whitespaces in source path for intltool command.\n\t * Just use relative paths...\n\n2013-06-01  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Gettext: Don't fail on if no desktop files or po files exist.\n\n2013-05-30  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate German translation.\n\n\tUpdate pot file.\n\n\tUpdate Readme.\n\n\tCMake: Fix gsettings file with non-absolute filename.\n\n\tCMake: Finish intltool gsettings/desktop file support.\n\n\tCMake: gsettings/gettext support. Requires intltool.\n\n\tGsettings: Rename app.valama to apps.valama.\n\n\tCMake: .desktop file i18n support. Requires intltool.\n\n2013-05-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #88 from Overscore/master\n\tFrench translation update. Thanks to Overscore!\n\n2013-05-28  Overscore  <github@lorang.net>\n\n\tUpdate fr.po\n\n2013-05-28  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Some completion def improvements (especially creation methods)\n\n2013-05-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix build for gee-1.0.\n\n2013-05-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Fixed local variables\n\n\tGuanako: Minor syntax def fixes; Propose all base types\n\n\tGuanako: Fixed variable completion\n\n2013-05-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate CMake buildsystem files.\n\n2013-05-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFixup German string.\n\n\tAdd .gitignore.\n\t * Currently only ignore CMake build directory: build\n\n\tMerge pull request #84 from Overscore/master\n\tUpdate French translation. Thanks to Overscore!\n\n2013-05-24  Overscore  <github@lorang.net>\n\n\tFix up French translation\n\n2013-05-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Improve Gettext support.\n\t * Fix some minor issues and make customization with xgettext options easier.\n\n2013-05-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Sync valaparser from upstream libvala.\n\n2013-05-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix toolbar build and execute button labels. Closes #86\n\n\tUpdate German translation.\n\t * Fixes one issue and merge into other files.\n\n\tUpdate pot file and add some gettext comments.\n\t * Merge translation files.\n\n\tCMake: Use pot target instead of pot_file.\n\n\tGuanako: Fix pkgconfig file.\n\t * Don't include {nocheck} packages.\n\t * CMake: Don't replace ${} vars in .pc file.\n\n2013-05-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate Readme: \"Added\" image\n\n2013-05-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tImproved and solidified Frankenstein\n\t * GUI warning instead of crash when receiving wrong ID's from client\n\t * Force rebuild when changing stuff\n\n2013-05-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tVarious Frankenstein improvements\n\t * Highlight reached stops and timers\n\t * Remember selection\n\t * Avoid duplicate stops/timers\n\t * Unown DBus name on destructor (destructor does not get called on\n\t   project change though)\n\n2013-05-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix valadoc generation (strip {...} from pkg). Closes #82\n\n\tMerge pull request #79 from Overscore/master\n\tFrench translation updates (eliminate fuzzies and fix mistakes). Thanks to\n\tOverscore! (multiple revisions rebased)\n\n2013-05-19  Overscore  <github@lorang.net>\n\n\tUpdate fr.po\n\tCorrected fuzzies and other mistakes\n\n2013-05-18  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Fixed FrankenTimers, corrected some stderrs\n\n2013-05-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix project save/load cycle on non-en systems.\n\t * Make VersionRelation.to_string method return values locale independent.\n\n\tNew version relations: AFTER (>) and BEFORE (<)\n\n2013-05-18  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Make Frankenstein instance dependent (using PIDs) fixes #75\n\n2013-05-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMove fixup vapis from cmake/vapi to more general extravapi/.\n\t * Preparations to use custom vapis not only with cmake.\n\n2013-05-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFrankenStein and plain build system improvements.\n\t * FrankenStein:\n\t    - Catch all exceptions.\n\t    - Use StringBuilder.\n\t    - Use constant string for main block.\n\t * Plain build system:\n\t    - Support defines and vapis.\n\t    - Dynamically set glib target version.\n\t    - Support \"plain\" as identifier (additionally to \"valama\").\n\n\t * TODO: - Don't read entire files into memory on frankensteinification. This\n\t           takes a lot of time (and memory). Only act on files where an action\n\t           is required.\n\t         - Run frankenstein initialization asynchronously.\n\n2013-05-17  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCMake: Update gsettings_install documentation.\n\t * Btw.: uninstall target was added with 06ba881 .\n\n\tUpdate README (local gsettings installation).\n\n\tCMake: Install and compile gsettings schemas.\n\t * Execute installation/removal hooks (option).\n\t * Compile gsettings schema locally. (Use XDG_DATA_DIRS environment variable.)\n\n\tFixup German translation string.\n\n\tShow error tags only for correct file. Closes #77\n\n2013-05-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Set Gtk Application to NON_UNIQUE (fixes #74)\n\n\tValama: Added GSettings file, install target\n\n\tValama: Introduce GSettings support; Remember window size\n\n2013-05-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate po/fr.po (unfuzzy some fuzzies).\n\n\tHandle error annotations with SourceViewer. Closes #66\n\t * Move annotation code from Reporter to SourceViewer.\n\t * Draw on Guanako update and on new file.\n\t * Use init method in SourceViewer to connect signals.\n\n\tMore descriptive label for project open and save menu items.\n\n\tRevert \"Valama: Show error annotations immediately (closes #66)\"\n\tThis reverts commit d60c8501915404c9a1ad2878c36b5dd1f83d808a.\n\n2013-05-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tForgot a file\n\n\tImproved completion performance\n\n\tValama: Show error annotations immediately (closes #66)\n\n2013-05-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuild output: Intelligent auto scroll.\n\n2013-05-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Improve build system integration over UI\n\t * Implement clean and distclean for cmake build system.\n\t * Add remove_recursively method (rm -rf).\n\t * Menu changes:\n\t     * Project menu\n\t        - Settings\n\t     * Build menu:\n\t        - Build: make\n\t        - Rebuild: make clean && make\n\t        - Clean build: make distclean && make\n\t        - Clean: make clean\n\t        - Clean all: make distclean\n\t     * Run menu:\n\t        - Execute\n\t        - Stop\n\n2013-05-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #69 from Overscore/master\n\tFix French translation file.\n\n\tUpdate German translation and add some gettext comments.\n\t * CMake: Fix the comment feature. Use // TRANSLATOR: ...\n\n2013-05-08  Overscore  <github@lorang.net>\n\n\tUpdate fr.po\n\n\tUpdate fr.po\n\n2013-05-08  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #67 from Overscore/master\n\tFrench translation update. Thanks to Overscore!\n\n\tcmake: Add option \"UPDATE_PO\" to disable .po update.\n\t * Option is enabled as default. Turn it off with: cmake -DUPDATE_PO=OFF ..\n\t * gettext_create_translations: Add boolean config value NOUPDATE to handle\n\t   this functionality.\n\n2013-05-08  Overscore  <github@lorang.net>\n\n\tUpdate fr.po\n\n2013-05-07  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSet key bindings to F5, F7 to run/compile. Closes #65\n\n\tUpdate .pot file.\n\n\tSupport directory creation in project browser.\n\t * Set tooltips to project browser buttons.\n\n2013-05-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate pot file.\n\n2013-05-05  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDetach dock layout handling from MainWidget instance.\n\t * Preparation for #64.\n\n\tImprove file creation dialog and removal of files.\n\t * Create file dialog:\n\t    - Name directory where to create file. Fixes #61 (2).\n\t    - Support path in filename (create missing directories Automatically).\n\t    - Directly open created file.\n\t * File removal:\n\t    - Run guanako source file removal threaded.\n\t    - Don't try to close buffers multiple times.\n\n2013-05-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValama: Support default files to open at initial project loading.\n\t * \"opened-files\" key is supported for project files but won't get rewritten\n\t   to file. So this is only relevant on very first project load up (which is\n\t   loading from template). Partly solution for #61 (1).\n\t   TODO: Support this for templates only and not for normal projects.\n\t * No layout support for srcdock at the moment but this would fully fix the\n\t   #61 (1) issue.\n\n2013-05-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Allow parallel read-only access to context. Closes #50\n\t * Use internal CodeContext to a allow parallel read-only access.\n\t * refs are not necessary to modify context so don't use them.\n\n2013-04-30  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Remove loop_update; Guanako: Fixed a loop in proposal sorting\n\n\tGuanako: Support numbers and strings as parameters\n\n\tValama: Improved current symbol source annotation\n\n\tGuanako: Initial commit of rebuilt syntax file\n\n2013-04-30  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tQuit MainLoop loop_update on quitting application. Close #55\n\n\tCMake fine tuning. Fix some issues with valadoc and CMake.\n\t * Enable documentation as default for release builds (if valadoc is\n\t   available).\n\t * Support multiple independent documentation builds inside a single CMake\n\t   project.\n\t * Avoid manual valac arguments and add library functionality to\n\t   UseVala.cmake.\n\n2013-04-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README and don't fail if imagemagick is not installed.\n\t * Add Fedora dependencies.\n\n\tAdd mime file (.vlp).\n\t * Run e.g. `update-mime-database /usr/share/mime` to update the mime\n\t   database.\n\n\tAdd manpage.\n\n\tRun flow analyzer also on file update.\n\t * Does not fix #49 fully but all warnings are shown.\n\t   Existing problem: Due to the vanish_file limitations methods not used in\n\t   updated file but in other files are treated as 'unused methods'. Old\n\t   symbols don't get removed from Vala AST so with a file update the old new\n\t   methods aren't used (apparently).\n\n\tFix Pair.\n\t * Correctly inherit Pair from Gee.Map.Entry and not Gtk.Entry...\n\n2013-04-28  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Allow variable offset in source annotations.\n\t * Used to avoid overlapping error annotations.\n\n\tValama: Fixed wrong insertion if the user is faster than the autocompletion\n\n2013-04-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix comp_version and also check for epochs.\n\t * Rename comp_proj_version to comp_version.\n\n2013-04-26  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Show completion proposals on whitespaces if the line is not empty\n\n2013-04-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tRun flow analyzer check on initial run. Closes: #49\n\n2013-04-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Made completion run thread more reliable\n\n\tValama: Source annotations horizontally follow the scrolled view\n\n2013-04-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix setting of defines.\n\t * Guanako: New method commit_defines() to commit new defines to context.\n\t   (Might be not useful at all.)\n\n2013-04-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: set_reporter: Fix regression for Reporter subclasses.\n\n\tGuanako: set_reporter: Typechecking enabled.\n\n2013-04-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Source annotations: Fixed a warning, calculate height from actual text size\n\n2013-04-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReporter: Make errlist virtual.\n\t * Use GObject class constructors to make this working (we use GObject.new to\n\t   create new instances).\n\n2013-04-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Show current symbol info as annotation. Allow persistent annotations.\n\n2013-04-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd row and column information to source view.\n\n\tReporter: Reset errlist with new instance. Closes: #48\n\n2013-04-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Animated SuperSourceView annotations, allow different colors\n\n\tValama: Show highlight animation when jumping to an error/warning\n\n\tValama: Support source code annotations (e.g. for error texts)\n\t * Abstracted animations in SuperSourceView\n\t * New animation type: Annotation\n\t * Integrated in error reports\n\n2013-04-18  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: SuperSourceView: Draw animations on top of the text\n\n\tValama: Introduced SuperSourceView to enhance GtkSourceView\n\t * Currently, SuperSourceView can show a cairo-based highlighting animation\n\t   on specific line.\n\t * Integrated this in the search widget\n\n2013-04-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix 3.6.2 > gdl-3.0 >= 3.5.5 with valac < 0.19.\n\t * Gdl API should now fully supported since 3.4 with valac >= 0.18.\n\n\tImprove defines heuristic.\n\t * Now usable (works for all defines in Valama project).\n\t * Still issues after enabling new defines (and after remove defines).\n\n2013-04-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix gdl defines. Closes #47\n\t * gdl API change came with 3.5.5 and not with 3.6.2.\n\n\tFix compilation for valac >= 0.19 and gdl < 3.5.5.\n\n\tVersioned defines guessing preparations.\n\t * Guess OS platform (Unix/Windows). Set during compile time with CMake.\n\n\tSupport for gdl switcher hacks with new upstream version.\n\t * New gdl version currently not released (only in master).\n\t * Switcher hacks are grip showing/hiding and some tab style properties.\n\n2013-04-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix valadoc generation.\n\t * Forgot to enable defines also for valadoc...\n\n2013-04-08  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #46 from uzytkownik/master\n\tDon't force installation into /usr. Thanks to uzytkownik.\n\n2013-04-08  Maciej Piechotka  <uzytkownik2@gmail.com>\n\n\tDon't force the installation into /usr\n\n2013-04-08  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSupport gee-1.0 again.\n\n\tRemove deprecated Thread.set_priority.\n\t * Deprecated since glib 2.32.\n\n2013-04-07  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Make it more thread-safe.\n\t * Lock context on public read/write operations.\n\n\tCmake: Extend find_package(Vala) macro and setup useful vars.\n\t * Setup with pkg-config information: - VALA_SHORTVER\n\t                                      - VALA_LIBPKG\n\t                                      - VALA_VAPIDIR\n\t                                      - VALA_DATADIR\n\t                                      - VALA_VAPIGEN\n\t                                      - VALA_GEN_INTROSPECT\n\t                                      - VALA_VALA_GEN_INTROSPECT\n\t * Use those variables to set Valama and Guanako constants to make build more\n\t   generic.\n\t * Valama: Drop Config.VALA_DATADIR (if it is necessary use the value from\n\t           Guanako directly).\n\n2013-04-06  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Finally fixed array handling (I hope)\n\n2013-04-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Use own Vala.Reporter, support complete context update.\n\t * Move Valama.ReportWrapper to Guanako.Reporter and use derived Reporter\n\t   class within Valama to display errors immediately (debug output).\n\t   Guanako.Reporter holds persistent list of all Errors.\n\t * Fix complete update of context.\n\t * Guanako: Allow changing glib version (use set_glib_version then call\n\t   update).\n\t * Valama: Update context after all defines were processed after initial\n\t   buffer update.\n\n2013-04-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Set glib version with constructor.\n\n2013-03-31  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix saving/loading ui/project meta information.\n\n2013-03-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReportWrapper: Add experimental warnings also to exp list.\n\n\tReportWrapper: Support experimental warning type (workaround).\n\t * Dirty workaround by string lookup (for \"are experimental\" at the end).\n\t * ReportWrapper: Don't call Report.set_verbose_errors because verbosity is\n\t   not used anyway.\n\t * Guanako: Support if set_report_wrapper was not called.\n\n\tSymbolBrowser: Simplify previous change.\n\n\tSymbolBrowser: Disconnect initial update handler correctly.\n\t * Note: Does not update new project symbols (after buffer changes). See: #40\n\n2013-03-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tStart Guanako update after setting new define (not working).\n\n\tUiSourceViewer: Add status bar to source items.\n\t * Syntax highlighting customization possible (not remembered over different\n\t   sessions or even a buffer close/open cycles).\n\n2013-03-27  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Hide completion proposals on non-valid keys\n\n2013-03-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix forgotten package_list and replace with packages.get_keys().\n\n2013-03-27  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Don't show completion proposals on space, delete etc.\n\n2013-03-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCheck package versions with pkg-config.\n\t * Check package versions with pkg-config and display detailed information in\n\t   template selector.\n\t * Support removal of package choices (only individual packages at the\n\t   moment).\n\t    - Clear choice if empty.\n\t * Use TreeMultiMap for ValamaProject.packages list. That makes\n\t   ValamaProject.package_list obsolete so remove it.\n\t * Escape all variable text in markup labels and use StringBuilder.\n\n2013-03-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuildSystem: Enable defines based on heuristic.\n\t * Currently very basic check only based on package name. No version and\n\t   version relation check at the moment.\n\t * Guanako: Fix return value of add_define.\n\t * ValamaProject: Add helper method for guanko_project.get_context_packages().\n\n2013-03-26  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Unified quit method\n\n2013-03-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd ValamaProject.buildsystem BuildSystem object.\n\t * Share the same build system over all modules.\n\n2013-03-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Made Valama a Gtk.Application\n\n2013-03-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix removal of used defines.\n\t * Vala.Parser now builds separate define list for each Vala.SourceFile from\n\t   scratch.\n\n\tBuildOutput: Hide info_bar at startup.\n\n2013-03-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Added an InfoBar to build output\n\n2013-03-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValamaProject: Update used defines and emit signal on changes.\n\t * Note: Due to a bug in Guanako added defines won't get removed.\n\n2013-03-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Setting completion threads' priority to LOW\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Fixed search highlights\n\n2013-03-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuilderCMake: Fix issue when choice is not available on system.\n\n2013-03-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse Posix.kill to kill launched application.\n\n\tBuildOutput: Display application exit code correctly now.\n\t * BuildSystem: Show when command received signal.\n\n2013-03-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAlmost completed BuildSystem transition (regression).\n\t * Note: Application launch does not fully work with new design yet\n\t         (regression).\n\n\t * BuilderPlain not tested at all.\n\t * Exit status fully supported (beside application launcher).\n\t * Error handling vs. return status not completed yet.\n\t * Minor fixes (e.g. close launched application when quitting Valama).\n\n2013-03-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuildOutput: Don't replace complete buffer with each newline.\n\t * Also only focus element one time.\n\n2013-03-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: ARGH, NEVER USE STRUCTS!!!  Syncing breakpoint sourcemarks and frankenstein line values finally works.\n\t * I simply replaced the struct I had used before by a class.\n\t   Now assigning values back to Frankenstein works.\n\t   No idea why. Structs are evil.\n\n2013-03-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuild system abstraction: initialization\n\t * Only CMake initialization done.\n\n2013-03-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Keep breakpoint marks in sync with guanako's data\n\n2013-03-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako: Get list of all defines in source code.\n\t * NOTE: Heavy overhead by including a modified version of Vala.Parser and\n\t         Vala.Scanner. See also #696325\n\n2013-03-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tForgot to add the file.\n\n\tGuanako: Added FixedTreeSet to work around a memory leak\n\n2013-03-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tGuanako add default defines (GLIB_X_Y, VALA_X_Y).\n\n\tSet LD_LIBRARY_PATH for local installation to find Guanako.\n\n2013-03-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSave and load project meta information.\n\t * Save IdeModes state. Not fully working (hidden dock items due to state\n\t   aren't restored after loading). Perhaps this should really go to the ui\n\t   stuff.\n\n\t   The xml loading (and saving) procedure is always the same so it would make\n\t   sense to have an abstraction of it (entry point, etc.) or some helper\n\t   methods.\n\n2013-03-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSave user interface meta information.\n\t * Currently only locked state. Perhaps this should better go directly to\n\t   layout.xml.\n\n\tMake Valama again compatible for gee-1.0.\n\n2013-03-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\tConflicts:\n\t\tguanako/guanako.vala\n\n\tGuanako: Allow aborting the old completion run (Should improve performance when typing on slower systems)\n\n2013-03-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReplace deprecated contains with has_key.\n\n2013-03-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tGuanako: Completion runs packed in a class (Valama: Small symbol browser fix)\n\n2013-03-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tWelcomeScreen: Move clicked project to top.\n\n2013-03-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Fixed and simplified symbol icon handling\n\n2013-03-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix markup in Label.label issue.\n\n\tUiCurrentSymbol: Fix container removal of internal_widget.\n\n\tSort recent manager list.\n\n\tFix grid row of project folder location.\n\n\tEntry: Make error label optional.\n\t * Don't use label for project name in creation step.\n\t   Later change the background color / border color of the entry. I didn't got\n\t   this atm with css \"background-color\" (does only affect selected text\n\t   background) or \"border-color\" does not change anything.\n\n\tCurrent symbol: Always display a label.\n\t * Show label before Guanako update finished.\n\t * Update display without delay (after computation is finished).\n\n\tEscape unknown markup input.\n\n\tAdd view menu item for current symbol.\n\n\tWelcomeScreen: Allow opening of projects always.\n\t * Not only when recent list is not empty.\n\n2013-03-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Working on arrays vs current symbol fix. Sorry for merge screw-up -.-\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n2013-03-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd valadoc comments to WelcomeScreen.\n\n\tRefactoring WelcomeScreen: Make it modular.\n\t * WelcomeScreen is now completely modular.\n\t    - Use a notebook for new project creation steps.\n\t    - Fix some minor issues.\n\t    - Change initial layout a bit (make it more compact).\n\t    - Last page with project name and project location not optimal (doesn't\n\t      look nice). Moved error label in own grid row to not extend the whole\n\t      grid with an invalid character.\n\t    - At the moment it is possible to add new pages with helper class\n\t      TemplatePage or add widgets directly. The latter is more complicated\n\t      because all the low level signal stuff has to be done manually and there\n\t      are also other drawbacks regarding selection state. So most likely the\n\t      widget possibility will be removed later.\n\t * Save/update recent manager information immediately (after project name\n\t   change). Update list in WelcomeScreen screen.\n\t    - Save information to ~/.cache/valama/recent_projects.xml (add .xml\n\t      extension).\n\t * Order list of templates by name.\n\t * Scale template icon to 33x33.\n\t * Entry: Make default text of error label customizable.\n\n2013-03-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\tConflicts:\n\t\tcmake/project.cmake\n\n\tIntroduced current symbol info widget; Fixed array completion\n\t * Guanako: Introduce current symbol stack\n\t * Guanako: Array handling fixed\n\t * Valama: Current symbol widget\n\n2013-03-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse stricter compiler settings withing Valama to don't miss warnings.\n\n2013-03-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuild symbol browser after first Guanako update.\n\t * Show simple loading animation before Guanako update has finished.\n\n2013-03-17  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCatch all errors.\n\n\tDon't hardcode element-*-16.png icons.\n\n\tDon't save project twice after switching back to welcome screen.\n\n\tui_load_project: Save current project before loading new one.\n\n\tShow save dialog also when closing application.\n\t * Does silently save all buffers when close with window manager.\n\n\tAdd show save dialog for modified buffers.\n\t * Only show dialog when gdl element is closed not with application quit.\n\n\tUse proper workaround for stock-id changes.\n\t * Thanks to Evan Nemerson for the proper solution:\n\t   https://bugzilla.gnome.org/show_bug.cgi?id=695972#c1\n\n2013-03-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix stock_id changes not recognized with new gdl-vapi.\n\t * Also add some comments which GNOME bug is involved where.\n\n2013-03-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix closing and reopening of source items.\n\n\tMake first source item not closable.\n\n\tFix closing of buffers and add some debug output.\n\n2013-03-14  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAllow removal of all file types (source, build system, data).\n\n\tReset welcome_screen to first grid when project load succeeded.\n\n\tRun the VIM syntax checker over comments and strings.\n\n\tReduce I/O load.\n\t * Accumulate files for substitutions to seek only one time.\n\t * Also make sure the temporary file for the substitution does not exist\n\t   already.\n\n\tSupport substitutions in template.\n\t * Substitution is NOT save and can cause lots of unnecessary io operations.\n\t    - At the moment only the basics are implemented. Necessary checks to\n\t      generate temporary file and intelligent substitution accumulation for\n\t      single files is missing but will come soon (see the new two FIXMEs).\n\t * Initialize all private setters in ValamaProject with constructor.\n\n2013-03-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDon't update complete report widget on non-source files.\n\t * Reduce debug output on source_viewer.current_srcfocus changes.\n\t * Use current_sourceview_changed consequently instead of property emission.\n\n\tGenerate dirs/files to save (automatically) only before saving.\n\t * Add lots of data files to .vlp.\n\t   - Currently there is no check for valid plaintext files.\n\t * Allow creation of (sub)directories with ui_create_project (allow / and \\).\n\t * Recursive directory lookup would be nice and shorten .vlp.\n\n2013-03-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tvlp: Automatically reduce separate files and prefer directories.\n\t * Try to avoid <foobar-files> and use <foobar-directories> instead to shorten\n\t   project file.\n\t * Fix get_relative_path null issue.\n\t * Use private _foo fields because ref is not allowed with properties.\n\n\tsymbols and project browser: Use signals on package changes.\n\n\tSupport data files. Closes #9\n\t * Add support for data files.\n\t * All kind of files can now be added (newly created).\n\n\tSynchronize cmake buildsystem data files.\n\n2013-03-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tcmake: Distinguish between libs to link and to check. Closes #39\n\t * Extend cmake integration and cmake code itself (ValaPkgs):\n\t   Support {nolink} and {nocheck} options (and combinations {nolink,nocheck}).\n\t    - nolink: Do not compile with cflags and libs.\n\t    - nocheck: Do not check with pkg-config (implies nolink).\n\n\t   Manually added packages have no option but the nocheck option will be added\n\t   if there is no .pc file for those packages (exact_package_name.pc).\n\t   Packages added as dependency of manually added packages have the option\n\t   nolink except there is no .pc file. In that case the nocheck option is\n\t   added.\n\n\t * List all packages in cmake/project.cmake.\n\n2013-03-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReplace deprecated Map.contains with Map.has_key.\n\n\tAllow removal and adding of new packages over UI.\n\n2013-03-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCorrectly quote search patterns.\n\n\tFix internal visibility state of dock elements and don't lock items.\n\n2013-03-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUiSearch: Fix edge case if current buffer is null (no opened buffer).\n\n\tDifferentiate between IdeMode hiding and manual hiding.\n\n\tAdd workaround for gdl <= 3.5.5 for hidden (attached) dock elements.\n\n2013-03-09  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReload gdl-element visibility on layout changes.\n\n2013-03-05  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tImprove PkgChoice and PackageInfo correlation.\n\t * Add PkgChoice field in PackageInfo to easily switch between both data\n\t   structures.\n\t * Again split up project loading in two parts:\n\t    - Loading of project file.\n\t    - Initilizing of project data (source files, completion etc.).\n\t * Make the partly loaded ValamaProject a field in ProjectTemplate. Later this\n\t   will be used to fully load the project when selected.\n\t * Add (optional) description to package choice.\n\t * Fix ordering of PackageInfo objects (use custom compare_func).\n\t * get_choice: Also usable if Guanako project is not initialized.\n\t   Version checks are still missing and CodeContext check is not necessary.\n\n2013-03-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse %u for formatted enum value output (bug_msg).\n\n\tAllow versioned package dependencies (at the moment only internal).\n\n\tcmake: Dynamically set glib version.\n\n\tcmake: Add gdl-3.0 vapi from valac 0.20.\n\t * Fix issue with old vapi and new gdl version: gdl >= 3.6.2 and valac <= 0.18\n\t * Only use local vapi if necessary.\n\n\tMake CopyRecursiveFlags enum a Flags enum and fix a size count issue.\n\n\tRemove debuglevel option and allow optional argument for --debug/-d.\n\n2013-03-03  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDetailed template information in UiTemplateSelector.\n\t * Add accels to UiTemplateSelector: \"i\" to show info and \"Esc\" to go back to\n\t   template list.\n\t * Add Vala version information to template (optional).\n\t * Add long description to template (optional). Long description supports\n\t   Pango markdown formatting.\n\n\t * Hide build output progressbar at the beginning (fixes dirty workarround).\n\t * Wrap long lines and add some comments.\n\n2013-03-03  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tHide build output progressbar and stretch it to dock item width.\n\n2013-03-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDisplay text output with monospace font.\n\n\tFix some hide/locking issues and save layout before Gtk.main_quit.\n\n\tImprove xml file parsing, better error catching.\n\t * Easily use locales in template file.\n\t * Fix package display if started directly with .vlp.\n\t * Add option --force-old to don't fail immediately if .vlp or .info file\n\t   version is too old.\n\t * Template info widget (inplace) is in progress.\n\n2013-03-02  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Moved get_available_packages to Guanako; Show missing packages in template selector\n\n2013-03-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReduce line length in source file.\n\n\tValac warnings reduced (unused variables removed).\n\n\tFixup docstrings.\n\n\tUiElement: Track visibility and share status over connected items.\n\t * Add menu and toolbar helper methods for UiElement show/hide elements.\n\t * Add all items to view menu.\n\t * Allow all items to close.\n\n\tTrack visibility of dock_item (UiElement).\n\t * Use this with UiSearch and toggle elements.\n\n2013-03-01  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReset from lock/unlock signals with saved state.\n\n\tDon't execute show_search signal handler multiple times. Closes #33\n\t * Handler gets only executed if status really has changed. Use internal state\n\t   variable to track dock_item state.\n\n\tReadme: no need to manually edit cmake files for gee/libvala.\n\n2013-03-01  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: App output uses unified channel readed\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Improved/simplified build output\n\n2013-03-01  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReplace built-in-directive VALA_X_Y with custom VALAC_X_Y\n\t * Because built-in is only for one version (==) and custom variant is >=.\n\n2013-02-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAllow package alternatives (extend vlp).\n\t * Currently only under the hood (no gui option).\n\t * Allow gee-0.8 or gee-1.0 and libvala-0.18 or libvala-0.20.\n\t * Fix cmake issues with local Guanako vapi (globbing and relative path\n\t   issues).\n\n2013-02-28  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Search: Selected text as default search\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\tConflicts:\n\t\tsrc/ui/search.vala\n\n\tValama: Improved search, added current_sourceview_changed signal\n\t * Search: Added title toolbar and current/all files button\n\t * SourceViewer: Added current_sourceview_changed signal that only gets\n\t   emitted when the current source file is actually changed\n\n2013-02-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate required version information.\n\n\tClean up preprocessor directives and some obsolete cmake options.\n\t * Make use of built in defines VALA_X_Y.\n\t * Use LIB_X_Y instead of LIB_LESS_X_Y (now >= X_Y instead of < X_Y).\n\t * Output some warnings in special not recommended library version situations.\n\t * Fix gdl-3.0 <= 3.6.2 and vala <= 0.20 issue.\n\n2013-02-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMake search widget toggable with menu item or toolbutton.\n\t * Add new signal \"show_search\" in UiSearch to synchronize Button and menu\n\t   item.\n\t * Add menu item for gdl grip hide/locking.\n\t * Add accelerators for gdl grip hide/locking and search show/hide.\n\t * Add -DGDL_LESS_3_6 to decide between new is_closed() or old flags field.\n\t * Standardize menu naming (item_MENUPART_NAME).\n\n2013-02-27  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Added application output widget\n\n2013-02-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tName gnome-icon-theme-symbolic as dependency.\n\n2013-02-27  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Added search button. Accelerator does not work yet.\n\n2013-02-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMake GLib a standard using directive (guanako).\n\n2013-02-27  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Recompile after mode change\n\n\tValama: Improved build handling (auto-build before launch if necessary)\n\n\tValama: Switched accelerators to GDL constants; Added accelerators for building/launching (F keys don't seem to work??)\n\n\tValama: Cured Valama's paranoia by correctly handling .vala vs .vapi; minor warning fixes\n\n2013-02-26  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Added method to focus a Gdl.DockItem; Auto-focus build output\n\n\tValama: Fixed welcome/main screen switching\n\n2013-02-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tcurfilestruct: Check all for all accessibility types (e.g. protected).\n\n2013-02-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tImprove UiReport.\n\t * Add toolbutton to switch between errors of single file and errors of whole\n\t   project. Rebuild list only if needed.\n\t * ReportWrapper: Also track deprecated elements and notes. Use two lists: One\n\t   internal list to build up new results and one public list. This will keep\n\t   the public list in consistent state.\n\t * Add new signal guanako_update_started and emit right before guanako update.\n\t * Add new (temporary) option --debuglevel. Currently valac errors have\n\t   level 2.\n\n\t * Todo items:\n\t    - Currently there is no difference between experimental and normal\n\t      warnings. Could be difficult to map SourceReference to CodeNode (which\n\t      is needed to get exp info).\n\t    - Result may not be sorted (by lines or files). Set or Hash->Set may help.\n\t    - Currently no gui element to filter (possibility is provided with flags\n\t      enum).\n\t    - Use -d/--debug with an optional argument and replace --debuglevel.\n\n\t * Problems:\n\t    - Vala context update behaves very differently in producing errors when\n\t      doing small changes in a single file.\n\n2013-02-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tImprove gdl (un)locking capatibility integration.\n\t * Improve UiElement class.\n\t    - Drop element_name field and replace it with generic get_name() method.\n\t    - Connect locking and unlocking signals directly within base constructor.\n\t    - Add (un)locking signals to MainWidget. In order to connect from\n\t      UiElement to MainWidget, split initialization in two parts:\n\t        * The first part builds up base stuff like main dock, main menu, main\n\t          toolbar.\n\t        * The second part initialize alle UiElements, menu items and tool\n\t          buttons. This step will be the plugin loading part in future.\n\t    - Add option to disable (un)/locking capatibility by setting locking\n\t      field (use this with UiSourceViewer);\n\t * Make IdeModes enum a flag enum to combine multiple values easily. Add some\n\t   helper methods.\n\t * Change ProjectBrowser label to currently used project.\n\t * Drop no longer needed UiElementPool.\n\t * Work arround gtk issue with Widget.remove assertion.\n\t * Reanable menu.\n\t * Use standardized names for gdl items (wdg_*).\n\t * Add some docstrings.\n\n2013-02-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Hide breakpoints widget when not in DEBUG mode\n\n\tValama: Improved GUI - general gnomeification ;) (Loosely following design proposal https://live.gnome.org/Design/Apps/IDE)\n\t * Deactivated menu bar (Once the about dialog is added to the welcome screen, it should be obsolete)\n\t * Allow returning to welcome screen (Makes open project button obsolete)\n\t * Initial work on a GUI lock (GDL still causes some drawing trouble)\n\t * Abstracted UIElements' public widget (Necessary for lock), UIElements now hold a reference to their Gdl.DockItems\n\n2013-02-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix race condition with g_type_check_instance_is_a.\n\n\tCatch all errors and remove unused var.\n\n2013-02-23  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Improved recent projects display\n\n\tValama: Allow opening existing projects via welcome screen\n\n\tValama: Improved welcome screen\n\n2013-02-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Focus fixes\n\n2013-02-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMinor null check, don't use stdxxx.printf within Valama.\n\n\tjump_to_position will jump to column and open file if necessary.\n\t * Focus grabbing does not work.\n\n2013-02-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Threaded initial guanako update\n\t * Significantly speeds up project loading and should be safe. In case of crashes directly after opening a project, this might need some more work ;)\n\n\tValama: Fixed guanako update signal; Current file structure jumps to current symbol\n\n2013-02-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCatch all errors/warnings; reload current structure on Guanako update.\n\t * Add new project signal guanako_update_started which is emitted on start of\n\t   Guanako update.\n\n2013-02-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: One more little recent files fix\n\n\tValama: Little recent projects fix\n\n\tValama: Initial work on a welcome screen\n\n2013-02-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix no-update issue of current_file_structure (by Linus).\n\t * Make wdg_current_file_structure static and global to fix update issue.\n\t * Add some debug output to current_file_structure.\n\n\tFix CMakeLists.txt typo (gtk-3.0 -> gtk+-3.0).\n\n\tFix gdl appearance (fixes by Linus) and handle --layout as ro.\n\t * Gdl appearance fixes:\n\t   - Show all widgets before laoding layout. Otherwise only closed items would\n\t     be visible.\n\t   - Show main window before adding widgets to open it full screen to not\n\t     screw up gdl layout.\n\t * Make --layout file read only again.\n\t * Show some better debug and error messages (gdl layout loading).\n\n2013-02-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Moving GDL stuff to widget\n\n\tValama: Fixed undo/redo buttons\n\n2013-02-20  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Further moving to main widget\n\n2013-02-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFixup missing type -> map_icon mappings. Remove some debug output.\n\n\tComplete symbol iterations and add lots of icons.\n\t * Note: Some private/public icons are identical. They are copied from Anjuta.\n\n2013-02-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDisplay also enum, errordomain etc. in current_file_structure widget.\n\n\tAdd typename string attribute to Guanako iterators.\n\t * Note: iter_symbol has the current type name. iter_statement_callback has\n\t         the previous type name (type of statement).\n\t * Add string to pixmap method.\n\t * Use icons in symbolbrowser.\n\t * Rename iter_callback_return to IterCallbackReturns and make all enum values\n\t   uppercase.\n\n2013-02-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Initial work on turning the current UI into a widget\n\n2013-02-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCode cleanup. Added command line options to all files/dirs.\n\t * Guanako:\n\t    - Remove gtk dependency. Guanako.Project constructor can now throw erros.\n\t    - Possibility to load syntax from custom file.\n\t    - Move debug_msg in Guanako namespace.\n\t * Valama:\n\t    - New options: syntax, templates, buildsystems, layout to pass custom\n\t      files / dirs locations. This will make a local run directly from source\n\t      code possible (no installation required anymore).\n\t    - Separate window_main completely from source_viewer. source_viewer is\n\t      docked as all other widgets.\n\t    - Move IDEModes to project context and rename it to IdeModes. Field is\n\t      renamed from IDEMode to idemode.\n\t    - Update some valadoc comments.\n\t    - Update README.\n\n2013-02-18  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Unified method for jumping to a specific location\n\n2013-02-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd lock to private build of symbols.\n\n\tMake breakpoint buttons more sensitive. Capture some edge cases.\n\n2013-02-18  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Improved current file structure usability\n\n2013-02-17  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Activate current symbol in current file structure\n\n2013-02-17  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd option --reset-layout to load system layout.\n\n\tUse TreeSet as sorted list for files and packages.\n\t * Guanako: Add sourcefiles property for manually added source files.\n\n2013-02-17  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Minor GUI improvements\n\n\tValama: Forgot to remove unnecessary stuff\n\n\tValama: Added icons to current file structure stuff\n\n2013-02-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Improved text tags\n\n2013-02-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDon't try to unlink files not associated with guanako project.\n\n\tMake it < gtk 3.6 compatible again.\n\n2013-02-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\tConflicts:\n\t\tsrc/ui/search.vala\n\n\tValama: Further work on search widget\n\n2013-02-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge and fix other absolute/relative path issues.\n\n\tUse absolute paths.\n\n2013-02-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Search: Improved results viewer, allow jumping to result\n\n2013-02-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tcmake: Regenerate docs only on source file changes.\n\n2013-02-15  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Initial work on a (threaded) search widget\n\n2013-02-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tRemove localization of autogenerated project.cmake.\n\n2013-02-15  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Little fix in breaktpoints UI\n\n2013-02-14  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Separating source viewer from WindowMain\n\n2013-02-14  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix command line parsing -> project load.\n\n\tReorganize source file structure.\n\n\tUpdate layout.\n\n2013-02-14  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Fixed a few Gtk warnings\n\n\tValama: Current file structure browser (need a good name for it :) ) allows jumping to the selected symbol\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\tConflicts:\n\t\tguanako/guanako.vala\n\n2013-02-13  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Added bookmark-like display of current source file (Not completed yet)\n\n2013-02-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCatch missing errors and replace deprecated VBox.\n\n\tWork arround #693127 and make vapi fix obsolete.\n\n2013-02-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'catchemall'\n\tConflicts:\n\t\tguanako/guanako_frankenstein.vala\n\t\tsrc/build_project.vala\n\t\tsrc/main.vala\n\t\tsrc/project.vala\n\t\tsrc/ui_main.vala\n\n\tClean up some other whitespace code issues and use *msg methods in Valama.\n\n2013-02-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tCatch all errors, add debug_msg to Guanako and add debug parameter.\n\t * Also clean up the code (incl. templates) a bit.\n\t * Set buildsystem of templates to cmake.\n\n2013-02-13  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Initial support for IDE modes\n\n2013-02-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse debug option instead of \"macro\" in Valama part.\n\n2013-02-13  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tForgot to add a file.\n\n2013-02-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate project file directly after first load and after setting changes.\n\t * Make sure to save project name / other settings immediately to prevent data\n\t   loss if Valama crashes etc.\n\n2013-02-13  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tGuanako/Valama: FrankenStein works now!\n\t * Still only valama buildsystem\n\t * Added GUI for handling FrankenStops and FrankenTimers\n\t * FrankenStein might fail to compile in case of invalid stop/timer positions\n\n2013-02-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix cmake missing target issue of templates.\n\n\tUpdate template project files with version info.\n\n\tAdd version information to project file. Closes #31\n\n\tDisable doc generation by default. Closes #30\n\t * This is a bug in valadoc which ignores conditionals.\n\n2013-02-12  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdjusted a disclaimer\n\n\tGuanako: Began work on Frankenstein (DBus-based breakpoints, performance measurement etc)\n\n\tGuanako: Fixed upper/lower case sorting\n\n\tGuanako: Improved performance (more efficient sorting). Eats CPU cores for breakfast now.\n\n2013-02-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Initial work on abstracting the buildsystem\n\n2013-02-10  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Stopping the application works now\n\n2013-02-09  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Starting application via GUI and added an output signal (stopping does not work yet)\n\n2013-02-09  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse getter method for gdl item child.\n\t * This fix will be released with valac 0.19+.\n\t   Unfortunately older vapis has to be updated manually. Any workarround to\n\t   resolve this without too much effort (e.g. inherit gdl classes) within\n\t   Valama code is welcome.\n\t * Cut some long lines.\n\n\tFix file names in disclaimer.\n\n2013-02-08  linus  <linus@Zuse.(none)>\n\n\tValama: Added (useful) compiling via GUI, show progress (cmake based)\n\n2013-02-07  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tEnable threading as default.\n\t * No changes in application behaviour because this flag isn't used anywhere.\n\n\tBuild docs by default if valadoc was found.\n\n\tvalac-0.16 no longer supported.\n\n2013-02-07  linus  <linus@Zuse.(none)>\n\n\tValama: Threaded building of completion proposals\n\n\tGuanako: Made a lock smaller\n\n\tGuanako: Fixed threading crashes / freezes, cleaner structure\n\n\tGuanako: Initial multithreaded autocompletion\n\n2013-02-05  linus  <linus@Zuse.(none)>\n\n\tValama: Improved guanako update timeout; path fix\n\n2013-02-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tBuild paths with correct seperator.\n\n2013-02-04  linus  <linus@Zuse.(none)>\n\n\tValama: Error report works correctly with multiple source files\n\n2013-02-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMake docking gdl 3.4 compatible.\n\t * There are still some warnings but it doesn't seem there are any drawbacks.\n\t   gdl 3.6 and higher still works fine.\n\n\tMake it 0.16 compatible again (text iterators).\n\n\tInstall text icon correctly.\n\t * Add new DESTINATION argument to convert_svg_to_png.\n\t * On buffer iteration foreach_buffer use SourceBuffer (and not only\n\t   buffertext).\n\n\tReporter: Don't update if no valid buffer exists (e.g. at the beginning).\n\n\tMerge branch 'cmdline'\n\n\tAdd command line parsing functionality.\n\n2013-02-04  linus  <linus@Zuse.(none)>\n\n\tValama: Fixed repeated guanako updates\n\n\tValama: Initial real-time error highlighting (Still needs support for all opened SourceViews)\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Cleaned up the completion provider, proposals should now be positioned correctly. Really should go to bed now.\n\n2013-02-03  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README and some comments regarding gdl issues.\n\n\tFix cmake < 0.20 compatibility. And make 0.16 fully compatible.\n\t * Fix 0.16 gdl issue. Invalid cast from Gdl.DockNotebook to Gtk.Notebook\n\t   necessary.\n\n\tMake Valama compilable with valac < 0.20\n\n\tSynchronize cmake buildsystem template.\n\n\tMerge branch 'staging'\n\n\tAdd valama text logo to about dialog. Improve cmake.\n\t * C file generation now only on Vala file changes.\n\t * Add some debug output for buffer change.\n\n2013-02-02  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Do not update completion info when changes occur within the current line (improves completion performance)\n\n2013-01-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate pot file and German translation.\n\t * Re-add guanako files to translation system.\n\n\tDon't generate .c files each time (touch them).\n\n2013-01-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'valadocs'\n\tConflicts:\n\t\tsrc/main.vala\n\t\tsrc/ui_main.vala\n\n\t * Drop unnecessary CodeView class (wrapper for Gtk.SourceView and\n\t   Gtk.SourceBuffer).\n\n2013-01-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSimplify signal connection and fix warning on first opened buffer.\n\t * Remove srcfocus_changed signal and instead use property notification signal.\n\n\tRemove dependency from window to project.\n\n2013-01-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate code documentation.\n\t * All but Guanako and UiElement derived classes completed.\n\t * Work forward to fix #6.\n\n\tStrictly separate app from window. Add some valadocs documentation.\n\t * Add wrapper for SourceView to add dirty flag.\n\t * Get rid of some valac warnings (access with this to static members).\n\t * Some minor fixes.\n\n2013-01-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix dirty flag of new document.\n\t * Simplify current_* properties.\n\n\tMark unsaved files (change gdl icon accordingly). Closes #20\n\n\tFix scope error (try,finally block).\n\n2013-01-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd dirty flag to all buffers.\n\t * Remove guanako again  from Valama project file (it is not working so far).\n\n2013-01-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMake cmake code more generic (name all source/vapi files explicitly).\n\t * Add guanako/ to Valama project.\n\n\tAdd about dialog.\n\n\tAdd menu, accels and mnemorics; redo and undo implementations.\n\n\tFocus newly opened files.\n\n2013-01-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSplit build system files from templates.\n\t * Template path has changed. New installation of Valama is required to use\n\t   templates.\n\n2013-01-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'project-browser-iters'\n\n\tFix add and remove button behavior (project browser).\n\t * Improve iterator handling.\n\t * Problems:\n\t    - Removal of files does not work (project browser vs. project objects not\n\t      synchronised).\n\t    - How to differentiate between project and buildsystem files?\n\t      In future implementations the buildsystem is a plugin so project browser\n\t      has only to care about source files. Therefore hardcoded workaround is\n\t      ok to fix this until buildsystem plugin comes.\n\t * There are some duplicate code parts (TreePath and TreeIter stuff).\n\n\tBump required cmake version to 2.8.4 to make it more Windows compatible.\n\n2013-01-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFixed the fix (wrong path used -.-)\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tValama: Fixed TextIter related crashes when running guanako updates threaded (Always update threaded, now that it works); Fixed wrong usage of guanako's update_file (Runs far smoother now, doesn't duplicate symbols); Fixed a segfault related to proposal selection\n\n2013-01-18  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tOmit directories on file selector (project browser).\n\t * Also set sensitivity of add and remove buttons correctly.\n\n\tBuild up file tree in project browser with nodes.\n\n2013-01-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse Path.build_path in Guanako project.\n\n\tReplace join_paths method by GLib.Path.build_path.\n\n2013-01-14  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tRemove file types from project file.\n\t * This should be done later with special plugins (every plugin has to know\n\t   which file types are valid.).\n\n2013-01-12  Linus Seelinger  <S.Linus@gmx.de>\n\n\tProject Browser: Only set add/remove buttons to sensitive when an action is defined\n\n2013-01-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSimplify opening of project/buildsystem file.\n\n\tMake buildsystem files available in project browser and sort it.\n\t * Dirty solution to sort lists at the end and not at time of insertion. But\n\t   with a few items it does not hurt.\n\n\tUpdate readme (add license paragraph).\n\n\tUpdate copyright years and set author to Valama development team.\n\t * See AUTHORS (or git blame) for all authors/contributors.\n\n\tUpdate pot and po files (relative paths).\n\n\tFix cmake and gettext to work with relative paths.\n\n2013-01-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tPreserve expansion of Project browser. Add new config items.\n\t * New config items (not really used atm):\n\t   - source-directories\n\t   - source-files\n\t   - file-types\n\t   - buildsystem-directories\n\t   - buildsystem-files\n\t   - buildsystem-file-types\n\n2013-01-07  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate Readme\n\t * gee-0.8 supported\r\n\t * Packaging branch hint.\n\n\tCode cleanup (pushed for LSenf).\n\n\tSwitch back to gee-1.0.\n\t * Switch back because Debian currently hasn't gee-0.8 in repository.\n\t   See #695982\n\t * Project is still and will be compatible to gee-0.8 .\n\n\tProper implementation of method for all opened views (delegate).\n\n\tMerge branch 'master' into multiple-buffers\n\tConflicts:\n\t\tsrc/main.vala\n\t\tsrc/project.vala\n\n\tDon't overwrite files with false content. Closes #25\n\t * Dirty hack but with ViewMap in 8fe440b55f4a323d85514837f0499829b2b35e74\n\t   this can be done the smart way.\n\t * App might crash. Workarround: Disable completion provider.\n\n2013-01-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix vapi paths in project browser.\n\t * Thanks to august0815 for reporting!\n\n2013-01-05  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tHandle source file focus detection completely with MainWindow.\n\t * Completion provider will crash the app.\n\t * Newly opened tabs aren't automatically selected.\n\t * New tabs aren't opened right beside the previous selected tab.\n\n\tSwitch to gee-0.8 and use custom struct for vieworder (no HashMap).\n\n2013-01-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd join_paths method to join paths together.\n\n2013-01-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tcmake: Remove debug output.\n\n\tcmake: Support custom library paths (options) from pkgconfig.\n\t * This will support all non-trivial library flags. E.g.\n\t    $ pkg-config --libs mylib\n\t    -L/usr/local/lib -lmylib\n\n\tUpdate Readme. gdl recommendation and libvala-0.16 hint.\n\n\tMerge branch 'multiple-buffers'\n\tConflicts:\n\t\tsrc/ui_main.vala\n\n\tSet default windowed size. Gdl tabs work properly with >= 3.6.\n\n2013-01-02  Linus Seelinger  <S.Linus@gmx.de>\n\n\tUpdate README.md\n\tAdded GDL to deps\n\n\tLittle GDL fix\n\n\tProject browser: Always expand\n\n2013-01-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'multiple-buffers'\n\tConflicts:\n\t\tsrc/project.vala\n\n\tSupport multiple independent source file buffers. Closes #14\n\t * Basic implementation:\n\t    - All source files belong to an extra Gdl.Dock.\n\t    - Currently there is no proper buffer_close signal handling (check if buffer\n\t      is dirty -> dialog). Atm closing doesn't do anything.\n\t    - \"Interrupt\" of closing a buffer is not properly implemented (tab\n\t      position can change).\n\t    - Not saved (\"New document\") view is not usable (completion and saving is\n\t      not working)\n\t * Some minor improvements.\n\n2013-01-01  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFixed adding packages via project_browser\n\n2012-12-31  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded a missing ui file\n\n\tFixed a vala 0.16 compatibility issue. Building still does not work though (issue reported)\n\n\tGuanako: Fixed dependency handling in remove_package; Valama: Show a warning dialog when vapis are not found\n\n2012-12-30  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFixed UiReport error counting (Funny segfaults...)\n\n\tRemoved threads from UI updates\n\n2012-12-29  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFirst After-Christmas-Commit! :) Guanako: Support interfaces implemented by classes; Syntax rules: Simplified signal rules\n\n2012-12-23  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tInclude config.vapi in sources, do not allow removing it via project_browser\n\n2012-12-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMake symbol browser and report element not-closable.\n\t * Temporary solution because there is no possibility to open/add those ui\n\t   elements once closed.\n\n\tMerge branch 'gdl'\n\n2012-12-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tImplement Gdl elements. Closes #13\n\t * All four ui elements are now gdl items so it is possible to move them\n\t   arround.\n\t   An exception is the source view item which is locked to make sure at least\n\t   one item is connected to the main window (only a design decision). With\n\t   multiple supported source buffers this can be extended to only be locked if\n\t   one single source buffer is open.\n\n\t   New class MainWindow now replaces Window class and provides an abstract\n\t   docking interface.\n\n\t   - Layout is saved on window close to ~/.config/valama/layout.xml;\n\t     global layout is available as a fallback in share/valama/layout.xml\n\n\t   On window resize the layout gets screwed up. A layout reload could fix that\n\t   in some cases. So in future revisions this could be done. (But even in\n\t   Anjuta this isn't implemented.)\n\n\t   Current solution is probably not very extendable (for new ui elements)\n\t   (plugin support).\n\n2012-12-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #18 from Overscore/master\n\tFrench translation update. Thanks to Overscore!\n\n2012-12-22  Overscore  <github@lorang.net>\n\n\tFrench translation update\n\n2012-12-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix coding style.\n\t * Also remove some no longer needed comments.\n\n2012-12-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Clone call parameters for \"?\" options\n\n\tMerge branch 'master' of github.com:Valama/valama\n\n\tGuanako: Simplified CallParameter class\n\n\tGuanako: Fixed return values; Switch compare from bool back to void\n\n\tGuanako: Support array / array element access\n\n2012-12-21  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #16 from Overscore/master\n\tFrench translation update. Thanks to Overscore!\n\n2012-12-21  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Array stuff\n\n2012-12-20  Overscore  <github@lorang.net>\n\n\tFrench translation update\n\n2012-12-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAbstract cmake valadocs generation. Add i18n support to Guanako.\n\t * Currently there is no check if documentation is complete so once added to\n\t   target all (or invoked manually via docs target) it will build docs from\n\t   scratch.\n\t   Same issue for translations.\n\n\tMerge branch 'overscore-i18n-fr'\n\tFrench translation added. Thanks to Overscore!\n\n2012-12-20  Overscore  <github@lorang.net>\n\n\tFrench translation\n\n2012-12-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tRearrange cmake stuff. Complete gettext integration.\n\t * FYI: In last commit I forgot to add cmake/Gettext.cmake (which is now\n\t   completely redesigend to fit in Valama cmake system).\n\n2012-12-19  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd sample German translation.\n\t * Especially cmake macro is not well configured to work smoothly with Valama.\n\t   (Some unneeded functionality provided by macro and some dirty hacks in\n\t   Valama CMakeLists.txt to make it work.) Hardcoded paths etc.\n\t   At this point localization is in theory possible (in fact it is probably to\n\t   early in development to start with i18n) but there won't be any bigger\n\t   changes for translators (only cmake integration will change a bit or more).\n\n\tMake all related strings translateable.\n\n\tPrepare gettext transition. Improve cmake stuff.\n\n2012-12-16  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge pull request #6 from Overscore/master\n\tvalama.desktop fix. Thanks to Overscore.\n\n\tFileTransfeR: Don't move each file in tree on same filesystem.\n\t * Also error if not enough space is available (and transfer goes to different\n\t   filesystem).\n\n2012-12-16  Overscore  <github@lorang.net>\n\n\tAdded 2 semicolon to meet freedesktop standard\n\n2012-12-15  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAllow compilation without guanako already installed.\n\t * Thanks to Overscore to report this issue.\n\n2012-12-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSupport # comments in guanako.lang for gtksourceview.\n\n2012-12-04  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDisable threads for now and enable compiler debug flag.\n\t * There are some problem with gtksourceview and Guanako completion speed so\n\t   disable all threads per default (which actually means only run one other\n\t   thread at the same time).\n\t * Enable debug compiler flag.\n\n2012-12-03  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tOutsource report wrapper and widget.\n\n\tSet target glib version to 2.32 for guanako.\n\n\tUpdate docs: UiElement and FileTransfer\n\n2012-12-02  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAlso install all icons etc. with docs.\n\n\tAuto doc generation (Valadoc). Enhances: #5\n\t * Optional target \"doc\". Build with `make doc` and install normally.\n\n\tAdd basic guanako syntax highlighting (gtksourceview).\n\t * Basic means basic.\n\n2012-12-01  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Support return values in syntax rules; Support arrays\n\n2012-11-30  Linus Seelinger  <S.Linus@gmx.de>\n\n\tSyntax rules: Fix in static / instance handling\n\n2012-11-30  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDon't remove original file object after copying.\n\n2012-11-30  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Do not add source files that already exist\n\n\tGuanako: Sorting function case sensitive\n\n\tSyntax rules: Slight loss of control over git -.-\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tSyntax rules: Fixed assignment and call of static symbols\n\n\tSyntax rules: Fixed assignment to static variables\n\n2012-11-30  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tClose project dialog properly with window manager exit button.\n\n2012-11-29  Linus Seelinger  <S.Linus@gmx.de>\n\n\tValama: Removed auto indent button, as auto indent is not functional at the moment\n\n\tValama: Fixed broken error report\n\n\tGuanako: Eliminate direct access to CodeContext\n\n2012-11-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'ui'\n\n\tFinish recursive movements.\n\t * Note: The movement method is only interesting on movements on different\n\t         filesystems. It is sligthly? slower on movements on same filesystem\n\t         because it moves every file object an not only original file object.\n\t         The only advantage over the File.move is to provide a counter for\n\t         processed files.\n\n\tm\n\n2012-11-29  Linus Seelinger  <S.Linus@gmx.de>\n\n\tGuanako: Optimized sorting performance (Each object is only sorted once)\n\n\tGuanako: Sorting results, avoiding duplications\n\n2012-11-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMaximize window to resolve small window problem temporarily.\n\n\tFix copyright headers and add some missing vim modelines.\n\n\tMerge pull request #3 from Baldrs/master\n\tMonospaced font for editor. Thanks to Baldrs. Closes #3\n\n2012-11-29  baldrs  <Manwe64@gmail.com>\n\n\tChanged font to Monospace, removed useless lines from pervious commit\n\n2012-11-29  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tChange annyoing small window size to a more appropriate one.\n\n\tProvide new FileTransfer class to copy and move files.\n\t * FileTransfer class provides two signal to easily connect progress bar\n\t   (number of files and count of bytes transferred).\n\t   Be careful: Currently it is not possible to move file trees (original\n\t               directories aren't removed.)\n\n2012-11-28  baldrs  <Manwe64@gmail.com>\n\n\tMonospaced font, indent\n\n2012-11-28  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tDon't remove manually added package automatically if vapi wasn't found.\n\n2012-11-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUse (in)valid_input signals on project settings dialog.\n\n\tMake custom Edit class rely on non empty text.\n\t * Add two signals valid_input and invalid_input to signal if text is empty or\n\t   not. This allows to control sensivity of buttons.\n\t   Closes: #2\n\n\tAdd recursive copy operation.\n\n\tCatch unhandled errors.\n\n\tMerge branch 'master' into ui\n\n\tOnly add vapi to context if file exists.\n\n2012-11-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSupport threads with valac 0.16.\n\t * Possible fix for #1.\n\t   But it introduces (at least for me) a new bug on project change. See\n\t   discussion: https://github.com/Valama/valama/issues/1\n\n\tMerge branch 'master' into ui\n\n2012-11-26  Linus Seelinger  <S.Linus@gmx.de>\n\n\tRemoved a binary added by mistake\n\n\tTemplates: E-Mail fix that broke XML parsing\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tTemplates: Added clutter template\n\n2012-11-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tRemove SymbolBrowser update on source file save.\n\n2012-11-26  Linus Seelinger  <S.Linus@gmx.de>\n\n\tTemplates: Added simple_gtk template\n\n2012-11-26  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tExit properly on cancelled create_project dialog.\n\n2012-11-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'ui'\n\tUpdate class names and change some minor whitespaces issues.\n\n\tConflicts:\n\t\tsrc/main.vala\n\n2012-11-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd threading support for ui elements.\n\t * Introduce new base class: UiElement\n\t   Other UI classes like ProjectBrowser or SymbolBrowser are now derived from\n\t   this class.\n\t   The base class provides basic dependency support (only threaded not\n\t   sequentially atm).\n\t   Public functionality is given over update() call. The derived classes has to\n\t   implement a custom build() method to update their own interface. The\n\t   update() method then calls all build() methods of all dependencies of all\n\t   dependencies etc.\n\t   So if the interface (reverse) depends on others, register those reverse\n\t   dependencies with connect(UiElement) method.\n\n\t   Dependency resolution is very basic so be careful to avoid circular\n\t   dependencies.\n\n\t   To change shared ValamaProject of these elements, call update(ValamaProject)\n\t   with a new project.\n\n\t   There exists a pool for all toplevel elements (independent elements) but\n\t   this will probably go or change with GDL.\n\n\t * Some naming conventions: classes are written the \"camel\" way:\n\t   ValamaProject, ProjectBrowser, SymbolBrowser\n\n\t * New macro is supported: DEBUG\n\t   This is enabled by default and there is atm no cmake option that turns it\n\t   off. This will change later (DEBUG off and an cmake option).\n\n2012-11-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tTemplates: Added cmake structure to Plain Vala template, should be fully functional now\n\n\tCreating projects based on templates works; Show project creation dialog if valama is called without arguments\n\n2012-11-25  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tInstall app icon to share/pixmaps/.\n\n2012-11-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tcmake: install templates\n\n\tDeleted a temp file\n\n\tInitial work on project templates\n\n2012-11-24  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'master' into ui\n\n\tLet valama_project.load_project_file() throw LoadingError.\n\t * valama_project can no throw a LoadingErorr which is thrown by\n\t   load_project_file method if xml file (.vlp) parsing does not succeed.\n\t   This is not properly handled if Valama is started with an invalid project\n\t   file. But this should be done with an easier interface for all GUI elements\n\t   because all of them needs the valama_project class.\n\t   So fixing this issue is related to roadmap 1.0: 4. GDL\n\t * Additionally check inode on Unix systems (disable with NOT_UNIX macro) to\n\t   prevent opening same file.\n\n\tLet valama_project.load_project_file() throw LoadingError.\n\t * valama_project can now throw a LoadingErorr which is thrown by\n\t   load_project_file method if xml file (.vlp) parsing does not succeed.\n\t   This is not properly handled if Valama is started with an invalid project\n\t   file. But this should be done with an easier interface for all GUI elements\n\t   because all of them needs the valama_project class.\n\t   So fixing this issue is related to roadmap 1.0: 4. GDL\n\t * Additionally check inode on Unix systems (disable with NOT_UNIX macro) to\n\t   prevent opening same file.\n\n\tSet some regexes to ignorecase.\n\n\tAbstract project dirs and supported source file suffixes.\n\t * valama_project class:\n\t   - project_source_dirs and project_file_types are string[] properties which\n\t     include project dirs (default: src/) and source file suffixes (default:\n\t     .vala).\n\t * Furthermore compare file name on new project load. This does not check\n\t   if projects are *really* different (e.g. because links, mounts).\n\n\tFix project syntax.\n\n2012-11-23  Linus Seelinger  <S.Linus@gmx.de>\n\n\tClean completion proposal insertion; Syntax rules: Support ref / out when passing parameters\n\n\tSupport structs\n\n2012-11-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'ui'\n\n\tOpen existing projects.\n\n2012-11-23  Linus Seelinger  <S.Linus@gmx.de>\n\n\tSyntax rules: Support templates and loops\n\n2012-11-23  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tInstall .desktop file.\n\n\tFix file header description.\n\n\tGenerate thumbnail icons.\n\t * Note: There is no postinst hook to update icon cache. Let the distros decide\n\t   how to manage this.\n\n2012-11-22  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tInitial commit.\n\n\tFinish guanako transition.\n\n2012-11-22  Linus Seelinger  <S.Linus@gmx.de>\n\n\tSyntax rules: Unified method call parameters\n\n\tAvoid huge terminal output when loading a project caused by superfluous completion info updates\n\n\tSyntax rules: Eliminate $Object, $Value improved\n\n\tSyntax rules: Improved assignments and method calls; Guanako: Fixed a segfault\n\n2012-11-20  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix guanako soname (1 vs. version 1.0).\n\n\tFix ftbfs with debhelper 9 (hardening flags).\n\n\tSeparate Guanako as separate library.\n\n2012-11-17  Linus Seelinger  <S.Linus@gmx.de>\n\n\tSyntax rules: Improved if statements and signal connections\n\n2012-11-16  Linus Seelinger  <S.Linus@gmx.de>\n\n\tParser: Also differentiate member binding type INSTANCE\n\n\tParser: Support exclusively getting static symbols (<static> modifier for syntax rules); Syntax rules: initial differentiation of member binding\n\n2012-11-13  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSmooth exception handling for all thrown errors.\n\t * Many code style fixes. Name conventions have to be done separately.\n\n2012-11-12  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tManual corrections to be 100% compatible with master.\n\n\tMerge branch 'master' into exception_handling\n\n2012-11-12  Linus Seelinger  <S.Linus@gmx.de>\n\n\tImproved syntax rules\n\n2012-11-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'master' into exception_handling\n\tConflicts:\n\t\tsrc/main.vala\n\n\tReadd open new file button.\n\n\tAllow adding to toplevel and switch to other file on removal.\n\n\tMerge branch 'master' of github.com:Valama/valama\n\n\tFile creator dialog: Catch if filename length is zero.\n\n2012-11-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAllow creating/deleting files from project_browser\n\n2012-11-10  Linus Seelinger  <S.Linus@gmx.de>\n\n\tMoved insert_text handler into Entry class\n\n2012-11-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tWith previous changes in guanako project browser works fine!\n\n\tMerge branch 'ui'\n\n\tImprove file dialog. Swap valid input check to ui_helpers.\n\n2012-11-10  Linus Seelinger  <S.Linus@gmx.de>\n\n\tParser: One more little name matching fix\n\n\tParser: Fixed name parsing, using regexes\n\n\tBetter handling of loaded source files\n\n2012-11-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd new file button.\n\n2012-11-10  Linus Seelinger  <S.Linus@gmx.de>\n\n\tPackage dialog: Do not show packages that are already selected\n\n2012-11-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tMerge branch 'ui' into exception_handling\n\tConflicts:\n\t\tsrc/main.vala\n\t\tsrc/ui_project_browser.vala\n\t\tsrc/ui_project_dialog.vala\n\n\tAdd new file button.\n\n\tAdd tooltips.\n\n\tUpdate README.md over webinterface (minor)\n\n\tSort Vala packages in package dialog.\n\n\tSettings dialog: Use SpinButtons for project version.\n\n2012-11-09  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSetup all main.vala error catchers.\n\n2012-11-09  Linus Seelinger  <S.Linus@gmx.de>\n\n\tParser: Ignore empty words; Syntax rules: Completed declarations inside functions\n\n\tRemoved a little code dinosaur\n\n\tParser: support arbitrary words; Syntax rules: Support var declarations\n\n2012-11-09  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tSettings dialog: Control hint label only with timer.\n\t * Label if user input (project name) was invalid now now longer disappears if\n\t   valid character was inserted (or removed).\n\n\tMerge branch 'master' into exception_handling\n\tConflicts:\n\t\tsrc/ui_project_dialog.vala\n\n\tAdd discard button to reset settings and group boxes properly.\n\n\tAdd cancel option to settings dialog.\n\n\tMerge branch 'master' of github.com:Valama/valama\n\n\tCatch all thrown exceptions and replace deprecated stuff.\n\t * Gkt.Box is used instead of HBox or VBox. But this will be deprecated soon?\n\t   Gtk.Grid is the way to go in future.\n\t * GLib.Thread.create was not replaced.\n\t * Exception catchers are only pseudo catchers atm.\n\n\tFix README spelling mistake and set Valama version to 0.1.2.\n\n\tUpdate README over webinterface.\n\n\tUpdate README (requirements).\n\n\tOnly save settings if ok is clicked. Check for valid project name.\n\t * Xml file input (.vlp) has to be checked too.\n\n2012-11-07  Linus Seelinger  <S.Linus@gmx.de>\n\n\tParser: Syntax error report in case of missing parameters\n\n\tParser: Use regex; Syntax errors reported instead of some possible segfaults\n\n\tFixed segfault in using directive completion\n\n\tMerge branch 'master' of https://github.com/Valama/valama\n\n\tCompletion: Completed using statements\n\n\tCompletion: Completed using statements\n\n2012-11-06  Linus Seelinger  <S.Linus@gmx.de>\n\n\tSyntax: Whitespace fix; Added using statements\n\n2012-11-04  Linus Seelinger  <S.Linus@gmx.de>\n\n\tVala 0.16 compatibility fix\n\n2012-11-03  Linus Seelinger  <S.Linus@gmx.de>\n\n\tCompletion: Support \"new\" expressions and namespaces\n\n2012-11-02  Linus Seelinger  <S.Linus@gmx.de>\n\n\tWorking on syntax rules and supported types\n\n\tCompletion: Fixed segfault at end of syntax rule; Fixed passing written text inside completion engine\n\n2012-11-01  Linus Seelinger  <S.Linus@gmx.de>\n\n\tCorrect parameter handling\n\n2012-10-28  Linus Seelinger  <S.Linus@gmx.de>\n\n\tReworking completion syntax\n\n2012-09-17  Linus Seelinger  <S.Linus@gmx.de>\n\n\tExperimental auto-indentation based on libvala\n\n2012-09-15  Linus Seelinger  <S.Linus@gmx.de>\n\n\tHandle Enums correctly; GUI version setting\n\n2012-09-14  Linus Seelinger  <S.Linus@gmx.de>\n\n\tComplete outsourcing of syntax rules; auto-complete return statements\n\n2012-09-13  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded missing file ( O:-) )\n\n\tMultithreaded completion updates (Still slightly aggressive)\n\n2012-09-12  Linus Seelinger  <S.Linus@gmx.de>\n\n\tManage project version via IDE; Introduced project config dialog; Fixed early autocompletion abortion\n\n\tKeep project name in project file; write to cmake\n\n\tPass on selected packages to cmake\n\n\tInitial info for methods\n\n2012-09-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tOutsourcing cmake packages list\n\n2012-09-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tValaPkgs.cmake: Support compiler options.\n\n2012-09-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tremoved a funny code dinosaur\n\n\tIgnore missing packages when resolving package dependencies\n\n\tSwitching to conditional compilation\n\n\tIntroduce config file\n\n2012-09-11  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tReplace syntax depending on Vala version 0.16 or 0.17+\n\n2012-09-11  Linus Seelinger  <S.Linus@gmx.de>\n\n\tlibvala 0.16/0.18 compatibility fix\n\n2012-09-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix Ubuntu 12.04 gthread issue and set Vala version to exactly 0.16.\n\n\tUpdate README.md\n\tAdd missing build dependency libgee-dev.\n\n\tMerge branch 'master' of github.com:Valama/valama\n\n\tAdd new function vala_pkgs to simplify vala integration and pkg-config checks.\n\n2012-09-10  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAutocompletion: Added constants; Improved iterators\n\n\tMinor deprecation fix\n\n\tUse Gee.Set when building completion proposals to avoid duplicates\n\n\tAdded icons from Anjuta and use them for autocompletion proposals\n\n\tTake project file as cli argument\n\n\tPackage handling: Include child dependencies\n\n\tCorrectly handle package dependencies\n\n2012-09-09  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded package selection dialog\n\n\tPackages can be removed now, symbols are updated\n\n\tWorking on adding/removing packages\n\n2012-09-08  Linus Seelinger  <S.Linus@gmx.de>\n\n\tProposals can be used now. (wahey!!); Added out/ref to parameters\n\n2012-09-06  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded project saving routine\n\n\tDisplay included packages in GUI; load packages from project file\n\n\tOutsourced project class; enhanced completion rules; simplified symbol resolver\n\n2012-09-05  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tcmake: install data/syntax to /usr/share/valama/syntax\n\n2012-09-05  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded comments to syntax file\n\n\tRead syntax templates from file\n\n\tWorking on completion rules\n\n\tAdded options to syntax templates; Fixed a little whitespace bug\n\n\tUsing recursive syntax templates for autocompletion; propose keywords\n\n2012-08-27  Linus Seelinger  <S.Linus@gmx.de>\n\n\tInitial auto indentation\n\n2012-08-27  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tFix trailing whitespaces.\n\t  * It is recommended to use the pre-commit git sample hook if the\n\t    editor does not detect such issues.\n\n2012-08-25  Linus Seelinger  <S.Linus@gmx.de>\n\n\tRegard using directives in autocompletion\n\n2012-08-24  Linus Seelinger  <S.Linus@gmx.de>\n\n\tImproved error report; Autocompletion based on current environment; Make use of scopes for getting accessible symbols\n\n2012-08-23  Linus Seelinger  <S.Linus@gmx.de>\n\n\tIntroducing template-based autocompletion\n\n2012-08-19  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFixed auto-update symbol and completion infos with nasty workaround\n\n2012-08-17  Linus Seelinger  <S.Linus@gmx.de>\n\n\tSymbol browser updates on file saves\n\n2012-08-17  Linus Seelinger  <linus@linus-K52F.(none)>\n\n\tFixed SemanticAnalyzer usage in guanako\n\n2012-08-10  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd copyright disclaimers and GPLv3 copyright file. Fix indents.\n\n2012-08-08  Linus Seelinger  <S.Linus@gmx.de>\n\n\tFixed foreach iterator visibility\n\n\tSave before building\n\n\tFixed a funny completion problem\n\n\tFixed error output\n\n\tFixed build directory creation\n\n\tMerge branch 'master' of github.com:Valama/valama\n\n\tInclude base classes in proposals; Outsourcing; experimental vapi discoverer (voodoo...)\n\n2012-08-08  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README.md\n\tAdd missing deps.\n\n2012-08-08  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAutocompletion: Handle new statements\n\n\tPropose non-local namespace, symbols and stuff\n\n\tFound the @!€++###§ gremlins.\n\n2012-08-07  Linus Seelinger  <linus@linus-K52F.(none)>\n\n\tImproved project browser; Save and build function; finding strange gremlins inside vala\n\n\tWorking on project browser\n\n2012-08-07  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded file update function\n\n\tImproved bracket handling in autocompletion\n\n2012-08-06  Linus Seelinger  <S.Linus@gmx.de>\n\n\tAdded C dependency; removed old compile script\n\n2012-08-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tAdd cmake integration and move source files to src/ directory.\n\n2012-08-06  Linus Seelinger  <S.Linus@gmx.de>\n\n\tWorking on bracket handling in resolve_symbol\n\n\tMerge branch 'master' of github.com:Valama/valama\n\n\tKilled some warnings\n\n2012-08-06  Linus Seelinger  <linus@linus-medion.(none)>\n\n\tKilled some warnings\n\n2012-08-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tUpdate README.md\n\n2012-08-06  Linus Seelinger  <linus@linus-K52F.(none)>\n\n\tReplaced tabs with whitespaces; working on completion\n\n\tFirst running version ;)\n\n\tInitial commit\n\n2012-08-06  Dominique Lasserre  <lasserre.d@gmail.com>\n\n\tInitial commit\n"
  },
  {
    "path": "README.md",
    "content": "# Valama #\n\n[![Join the chat at https://gitter.im/Valama/valama](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Valama/valama?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n#### *The next gen Vala IDE.* ####\n\nDiscussion and support on IRC channel [#valama](http://webchat.freenode.net/?channels=#valama) (freenode).\n\n![Valama 28.05.2013](https://raw.github.com/Valama/valama/gh-pages/images/valama_2013-05-28.png)\n\n[![Build Status](https://travis-ci.org/Valama/valama.png)](https://travis-ci.org/Valama/valama)\n\n## Manual installation ##\n\n### Requirements\n * cmake (>= 2.8.4)\n * valac (>= 0.20), valac-0.24 or valac-0.26 is recommended\n * pkg-config\n * gobject-2.0\n * glib-2.0\n * gio-2.0\n * gladeui-2.0 (for glade files)\n * gee-0.8 (>= 0.10.5)\n * at least libvala-0.20, libvala-0.24 or libvala-0.26 is recommended\n * gdk-3.0\n * gdl-3.0 (>= 3.8), 3.10 or newer is recommended\n * gtk+-3.0 (>= 3.10)\n * gtksourceview-3.0 (>= 3.10), 3.12 or newer is recommended\n * clutter-gtk-1.0\n * libxml-2.0\n * gthread-2.0\n * webkit2gtk-3.0\n * Intltool (required to generate .desktop and .xml files with localization)\n * GNOME desktop icon theme (symbolic icons) (only required to display icons properly) (recommended)\n * rsvg-convert/imagemagick (only required to generate application icons from svg template) (recommended)\n\nOn Debian based systems install following packages:\n\n    sudo apt-get install build-essential valac-0.24 libvala-0.24-dev cmake pkg-config libgtksourceview-3.0-dev libgee-0.8-dev libxml2-dev libgdl-3-dev libgladeui-dev libclutter-gtk-1.0-dev libwebkit2gtk-3.0-dev intltool gnome-icon-theme-symbolic librsvg2-bin\n\nFor a newer Vala version on Ubuntu based systems, you have to include the [Vala Team PPA](https://launchpad.net/~vala-team/+archive/ppa) first.\n\nOn Fedora based systems install following packages:\n\n    sudo yum install vala-devel cmake gtksourceview3-devel glade3-libgladeui-devel glade-devel libgee-devel libxml2-devel libgdl-devel clutter-gtk-devel webkitgtk-devel webkitgtk3-devel intltool gnome-icon-theme-symbolic librsvg2 librsvg2-tools\n\n#### Ubuntu PPA ####\n\nActivate [Valama daily PPA ](https://launchpad.net/~valama-dev/+archive/valama-daily) and install `valama` package.\n\n\n### Building ###\n 1. `mkdir build && cd build`\n 1. `cmake ..`\n 1. `make -j2`\n\n### Installation ###\n 1. `sudo make install`\n 1. `sudo ldconfig` (to update linker cache for the shared Guanako helper library)\n\nThis will automatically install and compile gsettings schemas. (You can\ndisable installtion/removal hooks during compile time with\n`-DPOSTINSTALL_HOOK=OFF` option.)\n\n#### Local installation ####\nBuild Valama then run with following options directly from build directory:\n\n    XDG_DATA_DIRS=\".:$XDG_DATA_DIRS\" LD_LIBRARY_PATH=guanako ./valama --syntax ../guanako/data/syntax --templates ../data/templates --buildsystems ../data/buildsystems [FILE]\n\nOptionally use `--layout ../data/layout.xml` to use standard layout.\n\n\n## Packaging files for distributions ##\nTo build and install Valama for your distribution look at the [packaging](https://github.com/Valama/valama/tree/packaging) branch. If you don't find your distribution there, you are welcome to contribute your packaging files to this branch (and put you work under GPL-3+).\n\n\n## Contribution ##\nSee the wiki page for some information [Wiki](https://github.com/Valama/valama/wiki) or drop in on [#valama](http://webchat.freenode.net/?channels=#valama) (irc.freenode.net).\n\n## License ##\nValama is distributed under the terms of the GNU General Public License version 3 or later and published by:\n * Linus Seelinger\n * Dominique Lasserre\n\nFor a full list of all contributors see [here](https://github.com/Valama/valama/graphs/contributors) and take a look at [AUTHORS](https://github.com/Valama/valama/blob/master/AUTHORS) file.\n\n## Credits ##\nelement-\\* icons from [Anjuta IDE](https://projects.gnome.org/anjuta/) (GPL2 licensed)\n"
  },
  {
    "path": "cmake/Common.cmake",
    "content": "#\n# cmake/Common.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# The base_list_to_delimited_string function transforms a list into a delimited\n# string.\n# This function is based on the basis_list_to_delimited_string in\n# CommonTools.cmake by the Build system And Software Implementation Standard\n# (BASIS) project by the University of Pennsylvania (Penn).\n#\n# Usage:\n#\n# The first parameter is set to transformed list.\n#\n# DELIM\n#   A string which will be the delimiter between all list elements.\n#\n# BASE_LIST\n#   The list which will be transformed to a single string.\n#\n#\n# Simple example:\n#\n#   set(packages \"abc\" \"def\" \"fhi\" \"jkl\" \"mno\")\n#   base_list_to_delimited_string(transformed_list\n#     DELIM\n#       \"||\"\n#     BASE_LIST\n#       ${packages}\n#   )\n#   message(\"show it:${transformed_list}\")\n#   >> show it:abc||def||fhi||jkl||mno\n#\nfunction(base_list_to_delimited_string output)\n  cmake_parse_arguments(ARGS \"\" \"\" \"DELIM;BASE_LIST\" ${ARGN})\n\n  set(list_string)\n  foreach(element ${ARGS_BASE_LIST})\n    if(list_string)\n      set(list_string \"${list_string}${ARGS_DELIM}\")\n    endif()\n    if(element MATCHES \"${ARGS_DELIM}\")\n      set(list_string \"${list_string}\\\"${element}\\\"\")\n    else()\n      set(list_string \"${list_string}${element}\")\n    endif()\n  endforeach()\n\n  set(\"${output}\" \"${list_string}\" PARENT_SCOPE)\nendfunction()\n\n\n##\n# Convert svg to png and set up installation places. rsvg-convert or\n# imagemagick (with svg support) is required.\n#\n# Usage:\n# The first parameter is set to all png files. Add them later to a custom\n# target. Generated directories are:\n#   ${prefix}/share/icons/hicolor/${size}x${size}/apps/${png_name}.png\n#\n# ICON\n#   svg icon path\n#\n# SIZES\n#   List of all supported sizes.\n#\n# PNG_NAME\n#   Name of png file (without suffix) which is the target file name.\n#\n# DESTINATION\n#   Directory where to install all generated files to (plain).\n#\n#\n# Simple example:\n#\n#   set(sizes 42 43 44)\n#   convert_svg_to_png(png_files\n#     ICON\n#       my_really_cool_icon.svg\n#     SIZES\n#       \"${sizes}\"\n#     PNG_NAME\n#       freshy\n#   )\n#   add_custom_target(my_target_name ALL DEPENDS ${png_files})\n#\n#   # This will build and install my_really_cool_icon.svg to:\n#   #   /usr/share/icons/hicolor/42x42/apps/freshy.png\n#   #   /usr/share/icons/hicolor/43x43/apps/freshy.png\n#   #   /usr/share/icons/hicolor/44x44/apps/freshy.png\n#\nfunction(convert_svg_to_png output)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"\" \"DESTINATION\" \"ICON;SIZES;PNG_NAME\" ${ARGN})\n\n  set(png_list)\n  if(ARGS_ICON)\n    if(ARGS_PNG_NAME)\n      find_program(CONVERT rsvg-convert)\n      if(NOT CONVERT)\n        find_program(CONVERT_IMG convert)\n      endif()\n      if(CONVERT OR CONVERT_IMG)\n        if(NOT datarootdir)\n          set(datarootdir \"share\")\n        endif()\n\n        foreach(size ${ARGS_SIZES})\n          set(tmppath \"icons/hicolor/${size}x${size}/apps\")\n          set(icondir \"${CMAKE_CURRENT_BINARY_DIR}/${tmppath}\")\n          set(iconpath \"${icondir}/${ARGS_PNG_NAME}.png\")\n          if(CONVERT)\n            add_custom_command(\n              OUTPUT\n                \"${iconpath}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E make_directory \"${icondir}\"\n              COMMAND\n                \"${CONVERT}\" \"--background-color\" \"none\" \"--width\" \"${size}\" \"--height\" \"${size}\" \"${ARGS_ICON}\" \"--output\" \"${iconpath}\"\n              DEPENDS\n                \"${ARGS_ICON}\"\n              VERBATIM\n            )\n          else()\n            add_custom_command(\n              OUTPUT\n                \"${iconpath}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E make_directory \"${icondir}\"\n              COMMAND\n                \"${CONVERT_IMG}\" \"-background\" \"none\" \"-resize\" \"${size}x${size}\" \"${ARGS_ICON}\" \"${iconpath}\"\n              DEPENDS\n                \"${ARGS_ICON}\"\n              VERBATIM\n            )\n          endif()\n          list(APPEND png_list \"${iconpath}\")\n          if(ARGS_DESTINATION)\n            install(FILES \"${iconpath}\" DESTINATION \"${ARGS_DESTINATION}\")\n          else()\n            install(FILES \"${iconpath}\" DESTINATION \"${datarootdir}/${tmppath}\")\n          endif()\n        endforeach()\n      else()\n        message(WARNING \"Could not find convert program. Don't generate icons.\")\n      endif()\n    endif()\n  endif()\n\n  set(${output} \"${png_list}\" PARENT_SCOPE)\nendfunction()\n\n\n##\n# Get formatted date string.\n#\n# Usage:\n# The first parameter is set to output date string.\n#\n# FORMAT\n#   Format string.\n#\n#\n# Simple example:\n#\n#   datestring(date\n#     FORMAT \"%B %Y\"\n#   )\n#   # Will print out e.g. \"Date: April 2013\"\n#   message(\"Date: ${date}\")\n#\nmacro(datestring output)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"\" \"FORMAT\" \"\" ${ARGN})\n\n  if(ARGS_FORMAT)\n    set(format \"${ARGS_FORMAT}\")\n  else()\n    set(format \"${ARGN}\")\n  endif()\n\n  if(WIN32)\n    #FIXME: Needs to be tested. Perhaps wrapping with cmd is needed.\n    execute_process(\n      COMMAND\n        \"date\" \"${format}\"\n      OUTPUT_VARIABLE\n        \"${output}\"\n      OUTPUT_STRIP_TRAILING_WHITESPACE\n    )\n  else()\n    execute_process(\n      COMMAND\n      \"date\" \"+${format}\"\n      OUTPUT_VARIABLE\n        \"${output}\"\n      OUTPUT_STRIP_TRAILING_WHITESPACE\n    )\n  endif()\nendmacro()\n\n\n##\n# Install/verify gsettings files and compile schemas.\n#\n# Depends on cmake/GlibCompileSchema.cmake.in (for compiling) and\n# cmake/GlibCompileSchema_verify.cmake.in (for verifying, only wth local\n# option)\n#\n# Usage:\n#\n# LOCAL\n#   If set compile gsettings schemas locally (in\n#   ${CMAKE_BINARY_DIR}/glib-2.0/schemas) directory). Add this directory to\n#   your XDG_DATA_DIRS variable.\n#\n# GSETTINGSDIR\n#   Directory where to install gsettings schemas. Default is:\n#   share/glib-2.0/schemas\n#\n# FILES\n#   List of gsettings schema files to install / compiile.\n#\n#\n# Simple example:\n#\n#   gsettings_install(\n#     LOCAL\n#     GSETTINGSDIR\n#       share/glib-2.0/schemas\n#     FILES\n#       \"data/app.foobar.gschema.xml\"\n#   )\n#\nfunction(gsettings_install)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"LOCAL\" \"GSETTINGSDIR\" \"FILES\" ${ARGN})\n  find_program(GLIBCOMPILESCHEMA \"glib-compile-schemas\" REQUIRED)\n\n  if(NOT \"\" STREQUAL \"${ARGS_FILES}\")\n    if(ARGS_LOCAL)\n      set(GSETTINGSDIR \"glib-2.0/schemas\")\n      configure_file(\n        \"${CMAKE_SOURCE_DIR}/cmake/GlibCompileSchema.cmake.in\"\n        \"${CMAKE_BINARY_DIR}/GlibCompileSchema_local.cmake\"\n        @ONLY\n      )\n      configure_file(\n        \"${CMAKE_SOURCE_DIR}/cmake/GlibCompileSchema_verify.cmake.in\"\n        \"${CMAKE_BINARY_DIR}/GlibCompileSchema_verify.cmake\"\n        COPYONLY\n      )\n      set(gfiles_copied)\n      foreach(gfile ${ARGS_FILES})\n        if(NOT IS_ABSOLUTE \"${gfile}\")\n          set(gfile \"${CMAKE_CURRENT_SOURCE_DIR}/${gfile}\")\n        endif()\n        get_filename_component(filename \"${gfile}\" NAME)\n        set(gfile_copied \"${CMAKE_CURRENT_BINARY_DIR}/glib-2.0/schemas/${filename}\")\n        add_custom_command(\n            OUTPUT\n              \"${gfile_copied}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -D \"GLIBCOMPILESCHEMA:FILEPATH=${GLIBCOMPILESCHEMA}\"\n                                 -D \"GLIB_SCHEMAFILE:FILEPATH=${gfile}\"\n                                 -P \"${CMAKE_BINARY_DIR}/GlibCompileSchema_verify.cmake\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${gfile}\" \"${gfile_copied}\"\n            DEPENDS\n              \"${gfile}\"\n            COMMENT\n              \"Install and verify gsettings schemas locally...\"\n            VERBATIM\n        )\n        list(APPEND gfiles_copied \"${gfile_copied}\")\n      endforeach()\n      add_custom_command(\n          OUTPUT\n            \"glib-2.0/schemas/gschemas.compiled\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -P \"${CMAKE_BINARY_DIR}/GlibCompileSchema_local.cmake\"\n          DEPENDS\n            ${gfiles_copied}\n          COMMENT\n            \"Compile gsettings schemas...\"\n          VERBATIM\n      )\n      add_custom_target(\"gsettings_${project_name_lower}\"\n        DEPENDS\n          \"glib-2.0/schemas/gschemas.compiled\"\n      )\n      add_dependencies(\"${project_name_lower}\" \"gsettings_${project_name_lower}\")\n    endif()\n\n    if(NOT ARGS_GSETTINGSDIR)\n      set(ARGS_GSETTINGSDIR \"share/glib-2.0/schemas\")\n    endif()\n    foreach(gfile ${ARGS_FILES})\n      install(FILES \"${gfile}\" DESTINATION \"${ARGS_GSETTINGSDIR}\")\n    endforeach()\n\n    if(POSTINSTALL_HOOK AND \"$ENV{DESTDIR}\" STREQUAL \"\")\n      if(CMAKE_INSTALL_PREFIX)\n        set(install_prefix \"${CMAKE_INSTALL_PREFIX}/\")\n      else()\n        set(install_prefix)\n      endif()\n      set(GSETTINGSDIR \"${install_prefix}${ARGS_GSETTINGSDIR}\")\n      configure_file(\n        \"${CMAKE_SOURCE_DIR}/cmake/GlibCompileSchema.cmake.in\"\n        \"${CMAKE_BINARY_DIR}/GlibCompileSchema.cmake\"\n        @ONLY\n      )\n      install(SCRIPT \"${CMAKE_BINARY_DIR}/GlibCompileSchema.cmake\")\n    endif()\n  endif()\nendfunction()\n\n\n##\n# Recursively copy directory content.\n#\n# Usage:\n#\n# TARGET\n#   Name of CMake target. Default is 'copy_dirs'.\n#\n# BASEDIR\n#   Name of base directory to build relative paths compared  to TARGETDIR.\n#   Default is ${CMAKE_CURRENT_SOURCE_DIR}.\n#\n# TARGETDIR\n#   Name of base directory where to copy files to. Default is\n#   ${CMAKE_CURRENT_BINARY_DIR}.\n#\n# DIRS\n#   List of directories (or files) to recursively copy.\n#\n#\n# Simple example:\n#\n#     copy_dirs(\n#       TARGET\n#         \"custom_target_name\n#       BASEDIR\n#         \"${CMAKE_CURRENT_SOURCE_DIR}/foo\"\n#       TARGETDIR\n#         \"${CMAKE_CURRENT_BINARY_DIR}/bar\"\n#       DIRS\n#         \"blub̈́*\"\n#         \"/foobar/bar\"\n#     )\n#     # Copy ${}/foo/blub* and /foobar/bar to ${}/bar (= ${}/bar/blub*) and\n#     #                                                  ${}/bar/foobar/bar)\n#     add_custom_target(\"foobar\"\n#       ALL\n#       DEPENDS\n#         \"custom_target_name\"\n#       COMMENT \"Copy some files\"\n#     )\n#\nfunction(copy_dirs)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"\" \"TARGET;BASEDIR;TARGETDIR\" \"DIRS\" ${ARGN})\n\n  if(NOT ARGS_BASEDIR)\n    set(ARGS_BASEDIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\n  endif()\n  if(NOT ARGS_TARGET)\n    set(ARGS_TARGET \"copy_dirs\")\n  endif()\n  if(NOT ARGS_TARGETDIR)\n    set(ARGS_TARGETDIR \"${CMAKE_CURRENT_BINARY_DIR}\")\n  endif()\n\n  set(copyfiles)\n  foreach(globexpr ${ARGS_DIRS})\n    file(GLOB tmpdirs ${globexpr})\n    if(tmpdirs)\n      foreach(tmpdir ${tmpdirs})\n        get_files_recursively(files \"${tmpdir}\")\n        list(APPEND copyfiles ${files})\n      endforeach()\n    else()\n      get_files_recursively(files \"${globexpr}\")\n      list(APPEND copyfiles ${files})\n    endif()\n  endforeach()\n\n  set(copyfiles_d)\n  foreach(copyfile ${copyfiles})\n    file(RELATIVE_PATH copyfile_d \"${ARGS_BASEDIR}\" \"${copyfile}\")\n    set(copyfile_d \"${ARGS_TARGETDIR}/${copyfile_d}\")\n    add_custom_command(\n      OUTPUT\n        \"${copyfile_d}\"\n      COMMAND\n        \"${CMAKE_COMMAND}\" -E copy_if_different \"${copyfile}\" \"${copyfile_d}\"\n      DEPENDS\n        \"${copyfile}\"\n      VERBATIM\n    )\n    list(APPEND copyfiles_d \"${copyfile_d}\")\n  endforeach()\n\n  add_custom_target(\"${ARGS_TARGET}\"\n    DEPENDS\n      ${copyfiles_d}\n    #COMMENT \"Copy data files.\"\n  )\nendfunction()\n\n\n##\n# Recursively get list of files.\n#\n# From refaim on stackoverflow: http://stackoverflow.com/a/7788165/770468\n#\n# Usage:\n# The first parameter is set to list of files. The second one is the path of\n# current directory.\n#\n#\n# Simple example:\n#\n#   # Set ${files} to all files in foo/ directory.\n#   get_files_recursively(files \"foo\")\n#\nmacro(get_files_recursively result curdir)\n  file(GLOB children RELATIVE \"${curdir}\" \"${curdir}/*\")\n  set(files)\n  foreach(child ${children})\n    if(IS_DIRECTORY \"${curdir}/${child}\")\n      get_files_recursively(subfiles \"${curdir}\")\n      list(APPEND files ${subfiles})\n    else()\n      list(APPEND files \"${curdir}/${child}\")\n    endif()\n  endforeach()\n  set(${result} ${files})\nendmacro()\n\n\n##\n# Computes the realtionship between two version strings.  A version\n# string is a number delineated by '.'s such as 1.3.2 and 0.99.9.1.\n# You can feed version strings with different number of dot versions,\n# and the shorter version number will be padded with zeros: 9.2 <\n# 9.2.1 will actually compare 9.2.0 < 9.2.1.\n#\n# Input: a_in - value, not variable\n#        b_in - value, not variable\n#        result_out - variable with value:\n#                         -1 : a_in <  b_in\n#                          0 : a_in == b_in\n#                          1 : a_in >  b_in\n#\n# Written by James Bigler.\n# http://www.cmake.org/Wiki/CMakeCompareVersionStrings (2013/09/29)\n#\nmacro(compare_version_strings a_in b_in result_out)\n  # Since SEPARATE_ARGUMENTS using ' ' as the separation token,\n  # replace '.' with ' ' to allow easy tokenization of the string.\n  string(REPLACE \".\" \" \" a ${a_in})\n  string(REPLACE \".\" \" \" b ${b_in})\n  separate_arguments(a)\n  separate_arguments(b)\n\n  # Check the size of each list to see if they are equal.\n  list(LENGTH a a_length)\n  list(LENGTH b b_length)\n\n  # Pad the shorter list with zeros.\n\n  # Note that range needs to be one less than the length as the for\n  # loop is inclusive (silly CMake).\n  if(a_length LESS b_length)\n    # a is shorter\n    set(shorter a)\n    math(EXPR range \"${b_length} - 1\")\n    math(EXPR pad_range \"${b_length} - ${a_length} - 1\")\n  else()\n    # b is shorter\n    set(shorter b)\n    math(EXPR range \"${a_length} - 1\")\n    math(EXPR pad_range \"${a_length} - ${b_length} - 1\")\n  endif()\n\n  # PAD out if we need to\n  if(NOT pad_range LESS 0)\n    foreach(pad RANGE ${pad_range})\n      # Since shorter is an alias for b, we need to get to it by by dereferencing shorter.\n      list(APPEND ${shorter} 0)\n    endforeach()\n  endif()\n\n  set(result 0)\n  foreach(index RANGE ${range})\n    if(result EQUAL 0)\n      # Only continue to compare things as long as they are equal\n      list(GET a ${index} a_version)\n      list(GET b ${index} b_version)\n      # LESS\n      if(a_version LESS b_version)\n        set(result -1)\n      endif()\n      # GREATER\n      if(a_version GREATER b_version)\n        set(result 1)\n      endif()\n    endif()\n  endforeach()\n\n  # Copy out the return result\n  set(${result_out} ${result})\nendmacro()\n"
  },
  {
    "path": "cmake/FindIntltool.cmake",
    "content": "#\n# cmake/Intltool.cmake\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\nfind_program(INTLTOOL_EXTRACT_EXECUTABLE intltool-extract)\nfind_program(INTLTOOL_MERGE_EXECUTABLE intltool-merge)\nmark_as_advanced(INTLTOOL_EXTRACT_EXECUTABLE)\nmark_as_advanced(INTLTOOL_MERGE_EXECUTABLE)\n\nif(INTLTOOL_EXTRACT_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${INTLTOOL_EXTRACT_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      intltool_version\n    ERROR_QUIET\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  if(intltool_version MATCHES \"^intltool-extract \\\\(.*\\\\) [0-9]\")\n    string(REGEX REPLACE \"^intltool-extract \\\\([^\\\\)]*\\\\) ([0-9\\\\.]+[^ \\n]*).*\" \"\\\\1\" INTLTOOL_VERSION_STRING \"${intltool_version}\")\n  endif()\n  unset(intltool_version)\nendif()\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Intltool\n  REQUIRED_VARS\n    INTLTOOL_EXTRACT_EXECUTABLE\n    INTLTOOL_MERGE_EXECUTABLE\n  VERSION_VAR\n    INTLTOOL_VERSION_STRING\n)\n\nset(INTLTOOL_OPTIONS_DEFAULT\n  \"--quiet\"\n)\n"
  },
  {
    "path": "cmake/Gettext.cmake",
    "content": "#\n# cmake/Gettext.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n#\n# Heavily based on Jim Nelson's Gettext.cmake in Geary project:\n# https://github.com/ypcs/geary\n#\n##\n# Add find_package handler for gettext programs msgmerge, msgfmt, msgcat and\n# xgettext.\n##\n# Constant:\n# XGETTEXT_OPTIONS_DEFAULT: Provide common xgettext options.\n# XGETTEXT_VALA_OPTIONS_DEFAULT: Provide common xgettext options for Vala files.\n# XGETTEXT_GLADE_OPTIONS_DEFAULT: Provide common xgettext options for glade.\n##\n# The gettext_create_pot macro creates .pot files with xgettext from multiple\n# source files.\n# Provide target 'pot' to generate .pot file.\n#\n# Supported sections:\n#\n# PACKAGE (optional)\n#   Gettext package name. Get exported to parent scope.\n#   Default: ${PROJECT_NAME}\n#\n# VERSION (optional)\n#   Gettext package version. Get exported to parent scope.\n#   Default: ${${GETTEXT_PACKAGE_NAME}_VERSION}\n#   (${GETTEXT_PACKAGE_NAME} is package name from option above)\n#\n# OPTIONS (optional)\n#   Pass list of xgettext options (you can use XGETTEXT_OPTIONS_DEFAULT,\n#   XGETTEXT_VALA_OPTIONS_DEFAULT and XGETTEXT_GLADE_OPTIONS_DEFAULT\n#   constants).\n#   Default: ${XGETTEXT_{,VALA,GLADE}_OPTIONS_DEFAULT}\n#\n# SRCFILES (optional/mandatory)\n#   List of source files to extract gettext strings from. Globbing is\n#  supported.\n#\n# GLADEFILES (optional/mandatory)\n#   List of glade source files to extract gettext strings from. Globbing is\n#   supported.\n#\n# DESKTOPFILES (optional/mandatory)\n#   List of .desktop files to extract gettext strings from. Globbing is\n#   supported.\n#   intltool required.\n#\n# GSETTINGSFILES (optional/mandatory)\n#   List of gsettings (.gschema.xml) files to extract gettext strings from.\n#   Globbing is supported.\n#   intltool required.\n#\n# Either SRCFILES or GLADEFILES or DESKTOPFILES or GSETTINGSFILES (or all)\n# have to be filled with some files.\n#\n##\n# The gettext_create_translations function generates .gmo files from .po files\n# and install them as .mo files.\n# Provide target 'translations' to build .gmo files.\n#\n# Supported sections:\n#\n# ALL (optional)\n#   Make translations target a dependency of the 'all' target. (Build\n#   translations with every build.)\n#\n# PODIR (optional)\n#   Directory with .po files.\n#   Default: ${CMAKE_CURRENT_SOURCE_DIR}\n#\n# LOCALEDIR (optional)\n#   Base directory where to install translations.\n#   Default: share/cmake\n#\n# LANGUAGES (optional)\n#   List of language 'short names'. This is in generel the part before the .po.\n#   With English locale this is e.g. 'en_GB' or 'en_US' etc.\n#\n# POFILES (optional)\n#   List of .po files.\n#\n##\n#\n# The following call is a simple example (within project po directory):\n#\n#   include(Gettext)\n#   if(XGETTEXT_FOUND)\n#     set(potfile \"${CMAKE_CURRENT_SOURCE_DIR}/my_project.pot\")\n#     gettext_create_pot(\"${potfile}\"\n#       SRCFILES\n#         \"${PROJECT_SOURCE_DIR}/src/*.vala\"\n#     )\n#     gettext_create_translations(\"${potfile}\" ALL)\n#   endif()\n#\n##\nfind_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)\nfind_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt)\nfind_program(GETTEXT_MSGCAT_EXECUTABLE msgcat)\nfind_program(XGETTEXT_EXECUTABLE xgettext)\nmark_as_advanced(GETTEXT_MSGMERGE_EXECUTABLE)\nmark_as_advanced(GETTEXT_MSGFMT_EXECUTABLE)\nmark_as_advanced(GETTEXT_MSGCAT_EXECUTABLE)\nmark_as_advanced(XGETTEXT_EXECUTABLE)\n\nif(XGETTEXT_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${XGETTEXT_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      gettext_version\n    ERROR_QUIET\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  if(gettext_version MATCHES \"^xgettext \\\\(.*\\\\) [0-9]\")\n    string(REGEX REPLACE \"^xgettext \\\\([^\\\\)]*\\\\) ([0-9\\\\.]+[^ \\n]*).*\" \"\\\\1\" GETTEXT_VERSION_STRING \"${gettext_version}\")\n  endif()\n  unset(gettext_version)\nendif()\n\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Gettext\n  REQUIRED_VARS\n    XGETTEXT_EXECUTABLE\n    GETTEXT_MSGMERGE_EXECUTABLE\n    GETTEXT_MSGFMT_EXECUTABLE\n    GETTEXT_MSGCAT_EXECUTABLE\n  VERSION_VAR\n    GETTEXT_VERSION_STRING\n)\n\nif(XGETTEXT_EXECUTABLE AND GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE AND GETTEXT_MSGCAT_EXECUTABLE)\n  set(XGETTEXT_FOUND TRUE)\n  # Export variable to use it as status info.\n  set(TRANSLATION_BUILD TRUE PARENT_SCOPE)\nelse()\n  set(XGETTEXT_FOUND FALSE)\n  set(TRANSLATION_BUILD FALSE PARENT_SCOPE)\nendif()\n\n\nset(XGETTEXT_OPTIONS_DEFAULT\n  \"-s\"\n  \"--escape\"\n  \"--add-comments=TRANSLATORS:\"  #TODO: Make this configurable.\n  \"--from-code=UTF-8\"\n)\nset(XGETTEXT_VALA_OPTIONS_DEFAULT\n  \"--language\" \"C\"\n  \"--keyword=_\"\n  \"--keyword=N_\"\n  \"--keyword=C_:1c,2\"\n  \"--keyword=NC_:1c,2\"\n)\nset(XGETTEXT_GLADE_OPTIONS_DEFAULT\n  \"--language\" \"Glade\"\n  \"--omit-header\"\n)\nset(XGETTEXT_INTLTOOL_OPTIONS\n  \"--language\" \"C\"\n  \"--keyword=N_:1\"\n)\nset(_INTLTOOL_DESKTOPFILES)\n\n\nif(XGETTEXT_FOUND)\n  macro(gettext_create_pot potfile)\n    cmake_parse_arguments(ARGS \"\" \"PACKAGE;VERSION;WORKING_DIRECTORY\"\n      \"OPTIONS;VALA_OPTIONS;GLADE_OPTIONS;SRCFILES;GLADEFILES;DESKTOPFILES;GSETTINGSFILES\" ${ARGN})\n\n    if(ARGS_PACKAGE)\n      set(package_name \"${ARGS_PACKAGE}\")\n    elseif(GETTEXT_PACKAGE)\n      set(package_name \"${GETTEXT_PACKAGE}\")\n    else()\n      set(package_name \"${PROJECT_NAME}\")\n    endif()\n\n    if(ARGS_VERSION)\n      set(package_version \"${ARGS_VERSION}\")\n    elseif(VERSION)\n      set(package_version \"${VERSION}\")\n    else()\n      set(package_version \"${${package_name}_VERSION}\")\n    endif()\n    # Export for status information.\n    set(GETTEXT_PACKAGE_NAME \"${package_name}\" PARENT_SCOPE)\n    set(GETTEXT_PACKAGE_VERSION \"${package_version}\" PARENT_SCOPE)\n\n    if(NOT ARGS_WORKING_DIRECTORY)\n      set(ARGS_WORKING_DIRECTORY \"../\")\n    endif()\n\n    set(xgettext_options \"--package-name\" \"${package_name}\")\n    if(package_version)\n      list(APPEND xgettext_options \"--package-version\" \"${package_version}\")\n    endif()\n    if(ARGS_OPTIONS)\n      list(APPEND xgettext_options ${ARGS_OPTIONS})\n    else()\n      list(APPEND xgettext_options ${XGETTEXT_OPTIONS_DEFAULT})\n    endif()\n\n    if(ARGS_XGETTEXT_VALA_OPTIONS_DEFAULT)\n      set(xgettext_vala_options ${ARGS_XGETTEXT_VALA_OPTIONS_DEFAULT})\n    else()\n      set(xgettext_vala_options ${XGETTEXT_VALA_OPTIONS_DEFAULT})\n    endif()\n    if(ARGS_XGETTEXT_GLADE_OPTIONS_DEFAULT)\n      set(xgettext_glade_options ${ARGS_XGETTEXT_GLADE_OPTIONS_DEFAULT})\n    else()\n      set(xgettext_glade_options ${XGETTEXT_GLADE_OPTIONS_DEFAULT})\n    endif()\n\n    if(ARGS_SRCFILES OR ARGS_GLADEFILES OR ARGS_DESKTOPFILES OR ARGS_GSETTINGSFILES)\n      set(src_list)\n      set(src_list_abs)\n      foreach(globexpr ${ARGS_SRCFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpsrcfiles)\n        file(GLOB tmpsrcfiles ${globexpr})\n        if (tmpsrcfiles)\n          foreach(absFile ${tmpsrcfiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND src_list \"${relFile}\")\n            list(APPEND src_list_abs \"${absFile}\")\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND src_list \"${relFile}\")\n          list(APPEND src_list_abs \"${globexpr}\")\n        endif()\n      endforeach()\n\n      set(glade_list)\n      set(glade_list_abs)\n      foreach(globexpr ${ARGS_GLADEFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpgladefiles)\n        file(GLOB tmpgladefiles ${globexpr})\n        if (tmpgladefiles)\n          foreach(absFile ${tmpgladefiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND glade_list \"${relFile}\")\n            list(APPEND glade_list_abs \"${absFile}\")\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND glade_list \"${relFile}\")\n          list(APPEND glade_list_abs \"${globexpr}\")\n        endif()\n      endforeach()\n\n      if(ARGS_DESKTOPFILES OR ARGS_GSETTINGSFILES)\n        find_package(Intltool REQUIRED)\n      endif()\n      set(desktop_list)\n      set(desktop_list_abs)\n      set(desktop_list_b)\n      set(desktop_list_b_abs)\n      set(desktop_list_h)\n      set(desktop_list_h_abs)\n      foreach(globexpr ${ARGS_DESKTOPFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpdesktopfiles)\n        file(GLOB tmpdesktopfiles ${globexpr})\n        if (tmpdesktopfiles)\n          foreach(absFile ${tmpdesktopfiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND desktop_list \"${relFile}\")\n            list(APPEND desktop_list_abs \"${absFile}\")\n\n            file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND desktop_list_b \"${relFile_b}\")\n            get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n            list(APPEND desktop_list_b_abs \"${absFile_b}\")\n            file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n            list(APPEND desktop_list_h \"${relFile_h}\")\n            list(APPEND desktop_list_h_abs \"${absFile_b}.h\")\n            add_custom_command(\n              OUTPUT\n                \"${absFile_b}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n              DEPENDS\n                \"${absFile}\"\n              VERBATIM\n            )\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND desktop_list \"${relFile}\")\n          list(APPEND desktop_list_abs \"${globexpr}\")\n\n          file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND desktop_list_b \"${relFile_b}\")\n          get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n          list(APPEND desktop_list_b_abs \"${absFile_b}\")\n          file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n          list(APPEND desktop_list_h \"${relFile_h}\")\n          list(APPEND desktop_list_h_abs \"${absFile_b}.h\")\n          add_custom_command(\n            OUTPUT\n              \"${absFile_b}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n            DEPENDS\n              \"${absFile}\"\n            VERBATIM\n          )\n        endif()\n      endforeach()\n      set(_INTLTOOL_DESKTOPFILES ${desktop_list_b})\n\n      set(gsettings_list)\n      set(gsettings_list_abs)\n      set(gsettings_list_b)\n      set(gsettings_list_b_abs)\n      set(gsettings_list_h)\n      set(gsettings_list_h_abs)\n      foreach(globexpr ${ARGS_GSETTINGSFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpgsettingsfiles)\n        file(GLOB tmpgsettingsfiles ${globexpr})\n        if (tmpgsettingsfiles)\n          foreach(absFile ${tmpgsettingsfiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND gsettings_list \"${relFile}\")\n            list(APPEND gsettings_list_abs \"${absFile}\")\n\n            file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND gsettings_list_b \"${relFile_b}\")\n            get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n            list(APPEND gsettings_list_b_abs \"${absFile_b}\")\n            file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n            list(APPEND gsettings_list_h \"${relFile_h}\")\n            list(APPEND gsettings_list_h_abs \"${absFile_b}.h\")\n            add_custom_command(\n              OUTPUT\n                \"${absFile_b}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n              DEPENDS\n                \"${absFile}\"\n              VERBATIM\n            )\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND gsettings_list \"${relFile}\")\n          list(APPEND gsettings_list_abs \"${globexpr}\")\n\n          file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND gsettings_list_b \"${relFile_b}\")\n          get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n          list(APPEND gsettings_list_b_abs \"${absFile_b}\")\n          file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n          list(APPEND gsettings_list_h \"${relFile_h}\")\n          list(APPEND gsettings_list_h_abs \"${absFile_b}.h\")\n          add_custom_command(\n            OUTPUT\n              \"${absFile_b}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n            VERBATIM\n          )\n        endif()\n      endforeach()\n\n\n      if(ARGS_SRCFILES)\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${xgettext_vala_options} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\" ${src_list}\n          COMMAND\n            # Make sure file exists even if no translatable strings available.\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          DEPENDS\n            ${src_list_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n      )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          VERBATIM\n        )\n      endif()\n      if(ARGS_GLADEFILES)\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${xgettext_glade_options} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\" ${glade_list}\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          DEPENDS\n            ${glade_list_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n        )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          VERBATIM\n        )\n      endif()\n      if(ARGS_DESKTOPFILES)\n        add_custom_command(\n          OUTPUT\n            ${desktop_list_h_abs}\n          COMMAND\n            \"${INTLTOOL_EXTRACT_EXECUTABLE}\" ${INTLTOOL_OPTIONS_DEFAULT} \"--type\" \"gettext/ini\" ${desktop_list_b}\n          DEPENDS\n            ${desktop_list_b_abs}\n          WORKING_DIRECTORY\n            \"${PROJECT_BINARY_DIR}\"\n          VERBATIM\n        )\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${XGETTEXT_INTLTOOL_OPTIONS} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\" ${desktop_list_h}\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          DEPENDS\n            ${desktop_list_h_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n        )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          VERBATIM\n        )\n      endif()\n      if(ARGS_GSETTINGSFILES)\n        add_custom_command(\n          OUTPUT\n            ${gsettings_list_h_abs}\n          COMMAND\n            \"${INTLTOOL_EXTRACT_EXECUTABLE}\" ${INTLTOOL_OPTIONS_DEFAULT} \"--type\" \"gettext/gsettings\" ${gsettings_list_b}\n          DEPENDS\n            ${gsettings_list_b_abs}\n          WORKING_DIRECTORY\n            \"${PROJECT_BINARY_DIR}\"\n          VERBATIM\n        )\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${XGETTEXT_INTLTOOL_OPTIONS} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\" ${gsettings_list_h}\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          DEPENDS\n            ${gsettings_list_h_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n        )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          VERBATIM\n        )\n      endif()\n\n      add_custom_target(pot\n        COMMAND\n          \"${GETTEXT_MSGCAT_EXECUTABLE}\" \"-o\" \"${potfile}\" \"--use-first\" \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\" \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\" \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\" \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n        DEPENDS\n          \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n        WORKING_DIRECTORY\n          \"${CMAKE_CURRENT_SOURCE_DIR}\"\n        COMMENT\n          \"Extract translatable messages to ${potfile}\"\n        VERBATIM\n      )\n    endif()\n  endmacro()\n\n\n  function(gettext_create_translations potfile)\n    cmake_parse_arguments(ARGS \"ALL;NOUPDATE;DESKTOPFILES_INSTALL\"\n        \"PODIR;LOCALEDIR\" \"LANGUAGES;POFILES\" ${ARGN})\n\n    get_filename_component(_potBasename \"${potfile}\" NAME_WE)\n    get_filename_component(_absPotFile \"${potfile}\" ABSOLUTE)\n\n    if(ARGS_ALL)\n      set(make_all \"ALL\")\n    else()\n      set(make_all)\n    endif()\n\n    if(ARGS_LOCALEDIR)\n      set(_localedir \"${ARGS_LOCALEDIR}\")\n    elseif(localedir)\n      set(_localedir \"${localedir}\")\n    else()\n      set(_localedir \"share/locale\")\n    endif()\n\n    set(langs)\n    list(APPEND langs ${ARGS_LANGUAGES})\n\n    foreach(globexpr ${ARGS_POFILES})\n      set(tmppofiles)\n      file(GLOB tmppofiles ${globexpr})\n      if(tmppofiles)\n        foreach(tmppofile ${tmppofiles})\n          string(REGEX REPLACE \".*/([a-zA-Z_]+)(\\\\.po)?$\" \"\\\\1\" lang \"${tmppofile}\")\n          list(APPEND langs \"${lang}\")\n        endforeach()\n      else()\n          string(REGEX REPLACE \".*/([a-zA-Z_]+)(\\\\.po)?$\" \"\\\\1\" lang \"${globexpr}\")\n          list(APPEND langs \"${lang}\")\n      endif()\n    endforeach()\n\n    if(NOT langs AND NOT ARGS_PODIR)\n      set(ARGS_PODIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\n    endif()\n    if(ARGS_PODIR)\n      file(GLOB pofiles \"${ARGS_PODIR}/*.po\")\n      foreach(pofile ${pofiles})\n        string(REGEX REPLACE \".*/([a-zA-Z_]+)\\\\.po$\" \"\\\\1\" lang \"${pofile}\")\n        list(APPEND langs \"${lang}\")\n      endforeach()\n    endif()\n\n    if(langs)\n      list(REMOVE_DUPLICATES langs)\n    endif()\n\n\n    set(_gmoFile)\n    set(_gmoFiles)\n    foreach (lang ${langs})\n      get_filename_component(_absFile \"${lang}.po\" ABSOLUTE)\n      set(_gmoFile \"${CMAKE_CURRENT_BINARY_DIR}/${lang}.gmo\")\n\n      if(ARGS_NOUPDATE)\n        set(_absFile_new \"${CMAKE_CURRENT_BINARY_DIR}/${lang}.po\")\n        add_custom_command(\n          OUTPUT\n            \"${_absFile_new}\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E copy \"${_absFile}\" \"${_absFile_new}\"\n          DEPENDS\n            \"${_absPotFile}\"\n            \"${_absFile}\"\n          VERBATIM\n        )\n        set(_absFile \"${_absFile_new}\")\n      endif()\n      add_custom_command(\n        OUTPUT\n          \"${_gmoFile}\"\n        COMMAND\n          \"${GETTEXT_MSGMERGE_EXECUTABLE}\" \"--quiet\" \"--update\" \"--backup=none\" \"-s\" \"${_absFile}\" \"${_absPotFile}\"\n        COMMAND\n          \"${GETTEXT_MSGFMT_EXECUTABLE}\" \"-o\" \"${_gmoFile}\" \"${_absFile}\"\n        DEPENDS\n          \"${_absPotFile}\"\n          \"${_absFile}\"\n        WORKING_DIRECTORY\n          \"${CMAKE_CURRENT_BINARY_DIR}\"\n        VERBATIM\n      )\n\n      install(\n        FILES\n          \"${_gmoFile}\"\n        DESTINATION\n          \"${_localedir}/${lang}/LC_MESSAGES\"\n        RENAME\n          \"${_potBasename}.mo\"\n      )\n      list(APPEND _gmoFiles \"${_gmoFile}\")\n    endforeach()\n\n    set(desktopfiles)\n    if(langs AND _INTLTOOL_DESKTOPFILES)\n      file(RELATIVE_PATH cursrcdir_rel \"${CMAKE_CURRENT_BINARY_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}\")\n      if(cursrcdir_rel STREQUAL \"\")\n        set(cursrcdir_rel \".\")\n      endif()\n      foreach(desktopfiletmp ${_INTLTOOL_DESKTOPFILES})\n        string(REGEX REPLACE \"(\\\\.desktop).*$\" \"\\\\1\" desktopfile \"${desktopfiletmp}\")\n        set(desktopfile_abs \"${PROJECT_BINARY_DIR}/${desktopfile}\")\n        list(APPEND desktopfiles \"${desktopfile_abs}\")\n        file(RELATIVE_PATH desktopfile_rel \"${CMAKE_CURRENT_BINARY_DIR}\" \"${desktopfile_abs}\")\n        file(RELATIVE_PATH desktopfiletmp_rel \"${CMAKE_CURRENT_BINARY_DIR}\" \"${PROJECT_BINARY_DIR}/${desktopfiletmp}\")\n        add_custom_command(\n          OUTPUT\n            \"${desktopfile_abs}\"\n          COMMAND\n            \"${INTLTOOL_MERGE_EXECUTABLE}\" ${INTLTOOL_OPTIONS_DEFAULT} \"--desktop-style\" \"${cursrcdir_rel}\" \"${desktopfiletmp_rel}\" \"${desktopfile_rel}\"\n          DEPENDS\n            \"${PROJECT_BINARY_DIR}/${desktopfiletmp}\"\n          VERBATIM\n        )\n        if(ARGS_DESKTOPFILES_INSTALL AND NOT cursrcdir_rel STREQUAL \".\")\n          add_custom_command(\n            OUTPUT\n              \"${CMAKE_SOURCE_DIR}/${desktopfile}\"\n              \"desktopinstall.stamp\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${desktopfile_abs}\" \"${CMAKE_SOURCE_DIR}/${desktopfile}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E touch \"desktopinstall.stamp\"\n            DEPENDS\n              \"${desktopfile_abs}\"\n            VERBATIM\n          )\n        else()\n          add_custom_command(\n            OUTPUT\n              \"desktopinstall.stamp\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E touch \"desktopinstall.stamp\"\n            DEPENDS\n              \"${desktopfile_abs}\"\n            VERBATIM\n          )\n        endif()\n        list(APPEND desktopfiles \"desktopinstall.stamp\")\n        install(\n          FILES\n            \"${desktopfile_abs}\"\n          DESTINATION\n            \"share/applications\"\n        )\n      endforeach()\n    endif()\n\n    add_custom_target(translations\n      \"${make_all}\"\n      DEPENDS\n        ${_gmoFiles}\n        ${desktopfiles}\n      COMMENT\n        \"Build translations.\"\n    )\n  endfunction()\nendif()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "cmake/GlibCompileSchema.cmake.in",
    "content": "#\n# cmake/GlibCompileSchema.cmake\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\nfind_program(GLIBCOMPILESCHEMA \"glib-compile-schemas\")\nif(GLIBCOMPILESCHEMA)\n  execute_process(\n    COMMAND\n      \"${GLIBCOMPILESCHEMA}\" @GSETTINGSDIR@\n  )\nendif()\n"
  },
  {
    "path": "cmake/GlibCompileSchema_verify.cmake.in",
    "content": "#\n# cmake/GlibCompileSchema.cmake.in\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\nexecute_process(\n  COMMAND\n    \"${GLIBCOMPILESCHEMA}\" \"--dry-run\" \"--schema-file=${GLIB_SCHEMAFILE}\"\n  ERROR_VARIABLE\n    stderr\n  OUTPUT_VARIABLE\n    stderr\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n  ERROR_STRIP_TRAILING_WHITESPACE\n)\nif(NOT \"${stderr}\" STREQUAL \"\")\n  message(FATAL_ERROR \"Schema validation error: ${stderr}\")\nendif()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "cmake/SimpleUninstall.cmake",
    "content": "#\n# cmake/SimpleUninstall.cmake\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n#\n# Slightly modified version from: http://www.cmake.org/Wiki/CMake_FAQ\n#\n\nif(NOT EXISTS \"${CMAKE_BINARY_DIR}/install_manifest.txt\")\n  message(FATAL_ERROR \"Cannot find install manifest: \"\n                      \"\\\"${CMAKE_BINARY_DIR}/install_manifest.txt\\\"\")\nendif()\n\nfile(READ \"${CMAKE_BINARY_DIR}/install_manifest.txt\" files)\nstring(REGEX REPLACE \"\\n\" \";\" files \"${files}\")\n\ncmake_policy(PUSH)\n# Ignore empty list elements. \ncmake_policy(SET CMP0007 OLD)\nlist(REVERSE files)\ncmake_policy(POP)\n\nforeach(file ${files})\n  message(STATUS \"Uninstalling \\\"$ENV{DESTDIR}${file}\\\"\")\n  if(EXISTS \"$ENV{DESTDIR}${file}\")\n    execute_process(\n      COMMAND\n        \"${CMAKE_COMMAND}\" -E remove \"$ENV{DESTDIR}${file}\"\n      OUTPUT_VARIABLE\n        rm_out\n      RESULT_VARIABLE\n        rm_retval\n    )\n    if(NOT ${rm_retval} EQUAL 0)\n      message(FATAL_ERROR \"Problem when removing \\\"$ENV{DESTDIR}${file}\\\"\")\n    endif()\n  else()\n    message(STATUS \"File \\\"$ENV{DESTDIR}${file}\\\" does not exist.\")\n  endif()\nendforeach()\n\nif(NOT \"$ENV{DESTDIR}\" AND POSTREMOVE_HOOK)\n  if (GSETTINGSDIR)\n    set(compile_schema_file \"${CMAKE_BINARY_DIR}/GlibCompileSchema_uninstall.cmake\")\n    if(NOT EXISTS \"${compile_schema_file}\")\n      if(NOT CUSTOM_SOURCE_DIR)\n        set(CUSTOM_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")\n      endif()\n      configure_file(\n        \"${CUSTOM_SOURCE_DIR}/cmake/GlibCompileSchema.cmake.in\"\n        \"${compile_schema_file}\"\n        @ONLY\n      )\n    endif()\n  endif()\n  execute_process(\n    COMMAND\n    \"${CMAKE_COMMAND}\" -P \"${compile_schema_file}\"\n  )\nendif()"
  },
  {
    "path": "cmake/gitlog-to-changelog.pl",
    "content": "eval '(exit $?0)' && eval 'exec perl -wS \"$0\" ${1+\"$@\"}'\n  & eval 'exec perl -wS \"$0\" $argv:q'\n    if 0;\n# Convert git log output to ChangeLog format.\n\nmy $VERSION = '2012-07-29 06:11'; # UTC\n# The definition above must lie within the first 8 lines in order\n# for the Emacs time-stamp write hook (at end) to update it.\n# If you change this file with Emacs, please let the write hook\n# do its job.  Otherwise, update this string manually.\n\n# Copyright (C) 2008-2014 Free Software Foundation, Inc.\n\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# Written by Jim Meyering\n\nuse strict;\nuse warnings;\nuse Getopt::Long;\nuse POSIX qw(strftime);\n\n(my $ME = $0) =~ s|.*/||;\n\n# use File::Coda; # http://meyering.net/code/Coda/\nEND {\n  defined fileno STDOUT or return;\n  close STDOUT and return;\n  warn \"$ME: failed to close standard output: $!\\n\";\n  $? ||= 1;\n}\n\nsub usage ($)\n{\n  my ($exit_code) = @_;\n  my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);\n  if ($exit_code != 0)\n    {\n      print $STREAM \"Try '$ME --help' for more information.\\n\";\n    }\n  else\n    {\n      print $STREAM <<EOF;\nUsage: $ME [OPTIONS] [ARGS]\n\nConvert git log output to ChangeLog format.  If present, any ARGS\nare passed to \"git log\".  To avoid ARGS being parsed as options to\n$ME, they may be preceded by '--'.\n\nOPTIONS:\n\n   --amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that\n                  makes a change to SHA1's commit log text or metadata.\n   --append-dot append a dot to the first line of each commit message if\n                  there is no other punctuation or blank at the end.\n   --no-cluster never cluster commit messages under the same date/author\n                  header; the default is to cluster adjacent commit messages\n                  if their headers are the same and neither commit message\n                  contains multiple paragraphs.\n   --srcdir=DIR the root of the source tree, from which the .git/\n                  directory can be derived.\n   --since=DATE convert only the logs since DATE;\n                  the default is to convert all log entries.\n   --format=FMT set format string for commit subject and body;\n                  see 'man git-log' for the list of format metacharacters;\n                  the default is '%s%n%b%n'\n   --strip-tab  remove one additional leading TAB from commit message lines.\n   --strip-cherry-pick  remove data inserted by \"git cherry-pick\";\n                  this includes the \"cherry picked from commit ...\" line,\n                  and the possible final \"Conflicts:\" paragraph.\n   --help       display this help and exit\n   --version    output version information and exit\n\nEXAMPLE:\n\n  $ME --since=2008-01-01 > ChangeLog\n  $ME -- -n 5 foo > last-5-commits-to-branch-foo\n\nSPECIAL SYNTAX:\n\nThe following types of strings are interpreted specially when they appear\nat the beginning of a log message line.  They are not copied to the output.\n\n  Copyright-paperwork-exempt: Yes\n    Append the \"(tiny change)\" notation to the usual \"date name email\"\n    ChangeLog header to mark a change that does not require a copyright\n    assignment.\n  Co-authored-by: Joe User <user\\@example.com>\n    List the specified name and email address on a second\n    ChangeLog header, denoting a co-author.\n  Signed-off-by: Joe User <user\\@example.com>\n    These lines are simply elided.\n\nIn a FILE specified via --amend, comment lines (starting with \"#\") are ignored.\nFILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on\na line) referring to a commit in the current project, and CODE refers to one\nor more consecutive lines of Perl code.  Pairs must be separated by one or\nmore blank line.\n\nHere is sample input for use with --amend=FILE, from coreutils:\n\n3a169f4c5d9159283548178668d2fae6fced3030\n# fix typo in title:\ns/all tile types/all file types/\n\n1379ed974f1fa39b12e2ffab18b3f7a607082202\n# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.\n# Change the author to be Paul.  Note the escaped \"@\":\ns,Jim .*>,Paul Eggert <eggert\\\\\\@cs.ucla.edu>,\n\nEOF\n    }\n  exit $exit_code;\n}\n\n# If the string $S is a well-behaved file name, simply return it.\n# If it contains white space, quotes, etc., quote it, and return the new string.\nsub shell_quote($)\n{\n  my ($s) = @_;\n  if ($s =~ m![^\\w+/.,-]!)\n    {\n      # Convert each single quote to '\\''\n      $s =~ s/\\'/\\'\\\\\\'\\'/g;\n      # Then single quote the string.\n      $s = \"'$s'\";\n    }\n  return $s;\n}\n\nsub quoted_cmd(@)\n{\n  return join (' ', map {shell_quote $_} @_);\n}\n\n# Parse file F.\n# Comment lines (starting with \"#\") are ignored.\n# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1\n# (alone on a line) referring to a commit in the current project, and\n# CODE refers to one or more consecutive lines of Perl code.\n# Pairs must be separated by one or more blank line.\nsub parse_amend_file($)\n{\n  my ($f) = @_;\n\n  open F, '<', $f\n    or die \"$ME: $f: failed to open for reading: $!\\n\";\n\n  my $fail;\n  my $h = {};\n  my $in_code = 0;\n  my $sha;\n  while (defined (my $line = <F>))\n    {\n      $line =~ /^\\#/\n        and next;\n      chomp $line;\n      $line eq ''\n        and $in_code = 0, next;\n\n      if (!$in_code)\n        {\n          $line =~ /^([0-9a-fA-F]{40})$/\n            or (warn \"$ME: $f:$.: invalid line; expected an SHA1\\n\"),\n              $fail = 1, next;\n          $sha = lc $1;\n          $in_code = 1;\n          exists $h->{$sha}\n            and (warn \"$ME: $f:$.: duplicate SHA1\\n\"),\n              $fail = 1, next;\n        }\n      else\n        {\n          $h->{$sha} ||= '';\n          $h->{$sha} .= \"$line\\n\";\n        }\n    }\n  close F;\n\n  $fail\n    and exit 1;\n\n  return $h;\n}\n\n# git_dir_option $SRCDIR\n#\n# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR\n# is undef).  Return as a list (0 or 1 element).\nsub git_dir_option($)\n{\n  my ($srcdir) = @_;\n  my @res = ();\n  if (defined $srcdir)\n    {\n      my $qdir = shell_quote $srcdir;\n      my $cmd = \"cd $qdir && git rev-parse --show-toplevel\";\n      my $qcmd = shell_quote $cmd;\n      my $git_dir = qx($cmd);\n      defined $git_dir\n        or die \"$ME: cannot run $qcmd: $!\\n\";\n      $? == 0\n        or die \"$ME: $qcmd had unexpected exit code or signal ($?)\\n\";\n      chomp $git_dir;\n      push @res, \"--git-dir=$git_dir/.git\";\n    }\n  @res;\n}\n\n{\n  my $since_date;\n  my $format_string = '%s%n%b%n';\n  my $amend_file;\n  my $append_dot = 0;\n  my $cluster = 1;\n  my $strip_tab = 0;\n  my $strip_cherry_pick = 0;\n  my $srcdir;\n  GetOptions\n    (\n     help => sub { usage 0 },\n     version => sub { print \"$ME version $VERSION\\n\"; exit },\n     'since=s' => \\$since_date,\n     'format=s' => \\$format_string,\n     'amend=s' => \\$amend_file,\n     'append-dot' => \\$append_dot,\n     'cluster!' => \\$cluster,\n     'strip-tab' => \\$strip_tab,\n     'strip-cherry-pick' => \\$strip_cherry_pick,\n     'srcdir=s' => \\$srcdir,\n    ) or usage 1;\n\n  defined $since_date\n    and unshift @ARGV, \"--since=$since_date\";\n\n  # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)\n  # that makes a correction in the log or attribution of that commit.\n  my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};\n\n  my @cmd = ('git',\n             git_dir_option $srcdir,\n             qw(log --log-size),\n             '--pretty=format:%H:%ct  %an  <%ae>%n%n'.$format_string, @ARGV);\n  open PIPE, '-|', @cmd\n    or die (\"$ME: failed to run '\". quoted_cmd (@cmd) .\"': $!\\n\"\n            . \"(Is your Git too old?  Version 1.5.1 or later is required.)\\n\");\n\n  my $prev_multi_paragraph;\n  my $prev_date_line = '';\n  my @prev_coauthors = ();\n  while (1)\n    {\n      defined (my $in = <PIPE>)\n        or last;\n      $in =~ /^log size (\\d+)$/\n        or die \"$ME:$.: Invalid line (expected log size):\\n$in\";\n      my $log_nbytes = $1;\n\n      my $log;\n      my $n_read = read PIPE, $log, $log_nbytes;\n      $n_read == $log_nbytes\n        or die \"$ME:$.: unexpected EOF\\n\";\n\n      # Extract leading hash.\n      my ($sha, $rest) = split ':', $log, 2;\n      defined $sha\n        or die \"$ME:$.: malformed log entry\\n\";\n      $sha =~ /^[0-9a-fA-F]{40}$/\n        or die \"$ME:$.: invalid SHA1: $sha\\n\";\n\n      # If this commit's log requires any transformation, do it now.\n      my $code = $amend_code->{$sha};\n      if (defined $code)\n        {\n          eval 'use Safe';\n          my $s = new Safe;\n          # Put the unpreprocessed entry into \"$_\".\n          $_ = $rest;\n\n          # Let $code operate on it, safely.\n          my $r = $s->reval(\"$code\")\n            or die \"$ME:$.:$sha: failed to eval \\\"$code\\\":\\n$@\\n\";\n\n          # Note that we've used this entry.\n          delete $amend_code->{$sha};\n\n          # Update $rest upon success.\n          $rest = $_;\n        }\n\n      # Remove lines inserted by \"git cherry-pick\".\n      if ($strip_cherry_pick)\n        {\n          $rest =~ s/^\\s*Conflicts:\\n.*//sm;\n          $rest =~ s/^\\s*\\(cherry picked from commit [\\da-f]+\\)\\n//m;\n        }\n\n      my @line = split \"\\n\", $rest;\n      my $author_line = shift @line;\n      defined $author_line\n        or die \"$ME:$.: unexpected EOF\\n\";\n      $author_line =~ /^(\\d+)  (.*>)$/\n        or die \"$ME:$.: Invalid line \"\n          . \"(expected date/author/email):\\n$author_line\\n\";\n\n      # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog\n      # `(tiny change)' annotation.\n      my $tiny = (grep (/^Copyright-paperwork-exempt:\\s+[Yy]es$/, @line)\n                  ? '  (tiny change)' : '');\n\n      my $date_line = sprintf \"%s  %s$tiny\\n\",\n        strftime (\"%F\", localtime ($1)), $2;\n\n      my @coauthors = grep /^Co-authored-by:.*$/, @line;\n      # Omit meta-data lines we've already interpreted.\n      @line = grep !/^(?:Signed-off-by:[ ].*>$\n                       |Co-authored-by:[ ]\n                       |Copyright-paperwork-exempt:[ ]\n                       )/x, @line;\n\n      # Remove leading and trailing blank lines.\n      if (@line)\n        {\n          while ($line[0] =~ /^\\s*$/) { shift @line; }\n          while ($line[$#line] =~ /^\\s*$/) { pop @line; }\n        }\n\n      # Record whether there are two or more paragraphs.\n      my $multi_paragraph = grep /^\\s*$/, @line;\n\n      # Format 'Co-authored-by: A U Thor <email@example.com>' lines in\n      # standard multi-author ChangeLog format.\n      for (@coauthors)\n        {\n          s/^Co-authored-by:\\s*/\\t    /;\n          s/\\s*</  </;\n\n          /<.*?@.*\\..*>/\n            or warn \"$ME: warning: missing email address for \"\n              . substr ($_, 5) . \"\\n\";\n        }\n\n      # If clustering of commit messages has been disabled, if this header\n      # would be different from the previous date/name/email/coauthors header,\n      # or if this or the previous entry consists of two or more paragraphs,\n      # then print the header.\n      if ( ! $cluster\n          || $date_line ne $prev_date_line\n          || \"@coauthors\" ne \"@prev_coauthors\"\n          || $multi_paragraph\n          || $prev_multi_paragraph)\n        {\n          $prev_date_line eq ''\n            or print \"\\n\";\n          print $date_line;\n          @coauthors\n            and print join (\"\\n\", @coauthors), \"\\n\";\n        }\n      $prev_date_line = $date_line;\n      @prev_coauthors = @coauthors;\n      $prev_multi_paragraph = $multi_paragraph;\n\n      # If there were any lines\n      if (@line == 0)\n        {\n          warn \"$ME: warning: empty commit message:\\n  $date_line\\n\";\n        }\n      else\n        {\n          if ($append_dot)\n            {\n              # If the first line of the message has enough room, then\n              if (length $line[0] < 72)\n                {\n                  # append a dot if there is no other punctuation or blank\n                  # at the end.\n                  $line[0] =~ /[[:punct:]\\s]$/\n                    or $line[0] .= '.';\n                }\n            }\n\n          # Remove one additional leading TAB from each line.\n          $strip_tab\n            and map { s/^\\t// } @line;\n\n          # Prefix each non-empty line with a TAB.\n          @line = map { length $_ ? \"\\t$_\" : '' } @line;\n\n          print \"\\n\", join (\"\\n\", @line), \"\\n\";\n        }\n\n      defined ($in = <PIPE>)\n        or last;\n      $in ne \"\\n\"\n        and die \"$ME:$.: unexpected line:\\n$in\";\n    }\n\n  close PIPE\n    or die \"$ME: error closing pipe from \" . quoted_cmd (@cmd) . \"\\n\";\n  # FIXME-someday: include $PROCESS_STATUS in the diagnostic\n\n  # Complain about any unused entry in the --amend=F specified file.\n  my $fail = 0;\n  foreach my $sha (keys %$amend_code)\n    {\n      warn \"$ME:$amend_file: unused entry: $sha\\n\";\n      $fail = 1;\n    }\n\n  exit $fail;\n}\n\n# Local Variables:\n# mode: perl\n# indent-tabs-mode: nil\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"my $VERSION = '\"\n# time-stamp-format: \"%:y-%02m-%02d %02H:%02M\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"'; # UTC\"\n# End:\n"
  },
  {
    "path": "cmake/guanako.cmake",
    "content": "set(project_name \"Guanako\")\nset(Guanako_VERSION \"1.0\")\nset(soversion \"1\")\nset(required_pkgs\n  \"config {nocheck,nolink}\"\n  \"gobject-2.0\"\n  \"glib-2.0\"\n  \"gio-2.0\"\n  \"gee-0.8 >= 0.10.5\"\n  \"libvala-0.20\"\n  \"libvala-0.22\"\n  \"libvala-0.24\"\n  \"libvala-0.26\"\n  \"libvala-0.28\"\n  \"libvala-0.30\"\n  \"libxml-2.0\"\n  \"posix {nocheck,nolink}\"\n)\nset(srcfiles\n  \"guanako.vala\"\n  \"guanako_auto_indent.vala\"\n  \"guanako_frankenstein.vala\"\n  \"guanako_helpers.vala\"\n  \"guanako_iterators.vala\"\n  \"guanako_refactoring.vala\"\n  \"guanako_vapi_discoverer.vala\"\n  \"reporter.vala\"\n  \"scanner/valascanner.vala\"\n  \"scanner/valaparser.vala\"\n)\nset(vapifiles\n  \"config.vapi\"\n)\n"
  },
  {
    "path": "cmake/project.cmake",
    "content": "# This file was auto generated by Valama 0.1.2. Do not modify it.\nset(project_name \"Valama\")\nset(Valama_VERSION \"0.1.2\")\nset(required_pkgs\n  \"atk {nolink}\"\n  \"cairo {nolink}\"\n  \"clutter-1.0 {nolink}\"\n  \"clutter-gtk-1.0\"\n  \"cogl-1.0 {nolink}\"\n  \"config {nocheck,nolink}\"\n  \"gdk-3.0\"\n  \"gdk-pixbuf-2.0 {nolink}\"\n  \"gdl-3.0 >= 3.8\"\n  \"gee-0.8 >= 0.10.5\"\n  \"gio-2.0\"\n  \"gladeui-2.0\"\n  \"glib-2.0 >= 2.32\"\n  \"gmodule-2.0 {nolink}\"\n  \"gobject-2.0\"\n  \"gtk+-3.0 >= 3.9\"\n  \"gtksourceview-3.0 >= 3.9\"\n  \"guanako\"\n  \"json-glib-1.0 {nolink}\"\n  \"libsoup-2.4 {nolink}\"\n  \"libvala-0.20\"\n  \"libvala-0.22\"\n  \"libvala-0.24\"\n  \"libvala-0.26\"\n  \"libvala-0.28\"\n  \"libvala-0.30\"\n  \"libxml-2.0\"\n  \"pango {nolink}\"\n  \"pangocairo {nolink}\"\n  \"posix {nocheck,nolink}\"\n  \"webkit2gtk-3.0\"\n  \"x11 {nolink}\"\n)\nset(srcfiles\n  \"src/buildsystem/autotools.vala\"\n  \"src/buildsystem/base.vala\"\n  \"src/buildsystem/buildsystem_template.vala\"\n  \"src/buildsystem/cmake.vala\"\n  \"src/buildsystem/plain.vala\"\n  \"src/common/args.vala\"\n  \"src/common/common.vala\"\n  \"src/common/ui_helpers.vala\"\n  \"src/completion_provider.vala\"\n  \"src/dialogs/about.vala\"\n  \"src/dialogs/create_file.vala\"\n  \"src/dialogs/missing_packages.vala\"\n  \"src/dialogs/project_settings.vala\"\n  \"src/main.vala\"\n  \"src/project/build_project.vala\"\n  \"src/project/package_management.vala\"\n  \"src/project/project.vala\"\n  \"src/project/project_file.vala\"\n  \"src/project/project_templates.vala\"\n  \"src/settings.vala\"\n  \"src/ui/app_output.vala\"\n  \"src/ui/breakpoints.vala\"\n  \"src/ui/build_output.vala\"\n  \"src/ui/current_file_structure.vala\"\n  \"src/ui/glade_viewer.vala\"\n  \"src/ui/project_browser.vala\"\n  \"src/ui/reports.vala\"\n  \"src/ui/search.vala\"\n  \"src/ui/source_viewer.vala\"\n  \"src/ui/structure_view.vala\"\n  \"src/ui/super_source_view.vala\"\n  \"src/ui/symbol_browser.vala\"\n  \"src/ui/ui_elements.vala\"\n  \"src/ui/valadoc_browser.vala\"\n  \"src/ui/welcome_screen.vala\"\n  \"src/ui/welcome_screen/create_project_buildsystem.vala\"\n  \"src/ui/welcome_screen/create_project_location.vala\"\n  \"src/ui/welcome_screen/create_project_packages.vala\"\n  \"src/ui/welcome_screen/create_project_template.vala\"\n  \"src/ui/welcome_screen/load_project.vala\"\n  \"src/ui/welcome_screen/main_screen.vala\"\n  \"src/ui/widgets/browser_path.vala\"\n  \"src/ui_main.vala\"\n)\nset(vapifiles\n  \"vapi/config.vapi\"\n)\nset(uifiles\n)\n"
  },
  {
    "path": "cmake/vala/FindVala.cmake",
    "content": "#\n# cmake/vala/FindVala.cmake\n#\n##\n# Find module for the Vala compiler (valac)\n#\n# This module determines whether a Vala compiler is installed on the current\n# system and where its executable is.\n#\n# Call the module using \"find_package(Vala) from within your CMakeLists.txt.\n#\n# The following variables will be set after an invocation:\n#\n#  VALA_FOUND       Whether the vala compiler has been found or not\n#  VALA_EXECUTABLE  Full path to the valac executable if it has been found\n#  VALA_VERSION     Version number of the available valac\n#\n#  VALA_SHORTVER    Short version of valac (major.minor). Round up development\n#                   versions. E.g. 0.19.1 -> 0.20, 0.20.1 -> 0.20\n#  VALA_LIBPKG      Name of libvala library (libvala-${VALA_SHORTVER}).\n#  VALA_VAPIDIR     Vapi directory path.\n#  VALA_DATADIR     Path to libvala data directory. E.g. /usr/share/libvala-0.20\n#  VALA_VAPIGEN     Path to vapigen executable.\n#  VALA_GEN_INTROSPECT  Path to version specific gen-introspect executable.\n#  VALA_VALA_GEN_INTROSPECT  Path to version independent gen-introspect\n#                   executable.\n#\n##\n\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# Copyright 2009-2010 Jakob Westhoff. All rights reserved.\n# Copyright 2010-2011 Daniel Pfeifer\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n#    1. Redistributions of source code must retain the above copyright notice,\n#       this list of conditions and the following disclaimer.\n#\n#    2. Redistributions in binary form must reproduce the above copyright notice,\n#       this list of conditions and the following disclaimer in the documentation\n#       and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR\n# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# The views and conclusions contained in the software and documentation are those\n# of the authors and should not be interpreted as representing official policies,\n# either expressed or implied, of Jakob Westhoff\n##\n\n# Search for the valac executable in the usual system paths.\nfind_program(VALA_EXECUTABLE NAMES \"valac\" \"valac-0.30\" \"valac-0.28\" \"valac-0.26\" \"valac-0.24\" \"valac-0.22\" \"valac-0.20\")\nmark_as_advanced(VALA_EXECUTABLE)\n\n# Determine the valac version\nif(VALA_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${VALA_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      VALA_VERSION\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  string(REPLACE \"Vala \" \"\" VALA_VERSION \"${VALA_VERSION}\")\n  string(REPLACE \".\" \";\" VALA_LIST \"${VALA_VERSION}\")\n  list(GET VALA_LIST 0 maj_ver)\n  list(GET VALA_LIST 1 min_ver)\n  list(GET VALA_LIST 2 rev_ver)\n  math(EXPR is_odd \"${min_ver} % 2\")\n  list(LENGTH VALA_LIST len)\n  if((${is_odd} EQUAL 1))\n    math(EXPR min_ver \"${min_ver} + 1\")\n  elseif(len GREATER 3)\n\tmath(EXPR min_ver \"${min_ver} + 2\")\n  endif()\n  set(VALA_SHORTVER \"${maj_ver}.${min_ver}\" CACHE INTERNAL \"\")\n  if(NOT \"${maj_ver}\" STREQUAL \"\" AND NOT \"${min_ver}\" STREQUAL \"\")\n    set(VALA_LIBPKG \"libvala-${VALA_SHORTVER}\" CACHE INTERNAL \"\")\n\n    find_package(PkgConfig)\n    pkg_check_modules(\"VALA\" REQUIRED \"${VALA_LIBPKG}\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" VAPIDIR \"\" \"--variable=vapidir\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" DATADIR \"\" \"--variable=datadir\")\n    set(VALA_DATADIR \"${VALA_DATADIR}/vala\" CACHE INTERNAL \"\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" VAPIGEN \"\" \"--variable=vapigen\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" GEN_INTROSPECT \"\" \"--variable=gen_introspect\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" VALA_GEN_INTROSPECT \"\" \"--variable=vala_gen_introspect\")\n  endif()\nendif()\n\n# Handle the QUIETLY and REQUIRED arguments, which may be given to the find call.\n# Furthermore set VALA_FOUND to TRUE if Vala has been found (aka.\n# VALA_EXECUTABLE etc. are set)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Vala\n  REQUIRED_VARS\n    VALA_EXECUTABLE\n    VALA_SHORTVER\n    VALA_LIBPKG\n    VALA_VAPIDIR\n    VALA_DATADIR\n    VALA_VAPIGEN\n    VALA_GEN_INTROSPECT\n    VALA_VALA_GEN_INTROSPECT\n  VERSION_VAR\n    VALA_VERSION\n)\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "cmake/vala/FindValadoc.cmake",
    "content": "#\n# cmake/vala/FindValadocs.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# Add find_package handler for valadoc.\n##\n\n# Search for the valac executable in the usual system paths.\nfind_program(VALADOC_EXECUTABLE \"valadoc\")\nmark_as_advanced(VALADOC_EXECUTABLE)\n\n# Determine the valadoc version\nif(VALADOC_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${VALADOC_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      VALADOC_VERSION\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  string(REPLACE \"Valadoc \" \"\" VALADOC_VERSION \"${VALADOC_VERSION}\")\nendif()\n\n# Add find_package handler for valadoc.\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Valadoc\n  REQUIRED_VARS\n    VALADOC_EXECUTABLE\n  VERSION_VAR\n    VALADOC_VERSION\n)\n"
  },
  {
    "path": "cmake/vala/UseVala.cmake",
    "content": "#\n# cmake/vala/UseVala.cmake\n#\n##\n# Compile vala files to their c equivalents for further processing.\n#\n# The \"vala_precompile\" function takes care of calling the valac executable on\n# the given source to produce c files which can then be processed further using\n# default cmake functions.\n#\n# The first parameter provided is a variable, which will be filled with a list\n# of C files outputted by the vala compiler. This list can than be used in\n# conjunction with functions like \"add_executable\" or others to create the\n# necessary compile rules with CMake.\n#\n# The following sections may be specified afterwards to provide certain options\n# to the vala compiler:\n#\n# SOURCES\n#   A list of .vala files to be compiled. Please take care to add every vala\n#   file belonging to the currently compiled project or library as Vala will\n#   otherwise not be able to resolve all dependencies.\n#\n# PACKAGES\n#   A list of vala packages/libraries to be used during the compile cycle. The\n#   package names are exactly the same, as they would be passed to the valac\n#   \"--pkg=\" option.\n#\n# OPTIONS\n#   A list of optional options to be passed to the valac executable. This can be\n#   used to pass \"--thread\" for example to enable multi-threading support.\n#\n# DEFINITIONS\n#   A list of symbols to be used for conditional compilation. They are the same\n#   as they would be passed using the valac \"--define=\" option.\n#\n# CUSTOM_VAPIS\n#   A list of custom vapi files to be included for compilation. This can be\n#   useful to include freshly created vala libraries without having to install\n#   them in the system.\n#\n# GENERATE_VAPI\n#   Pass all the needed flags to the compiler to create an internal vapi for\n#   the compiled library. The provided name will be used for this and a\n#   <provided_name>.vapi file will be created.\n#\n# GENERATE_GIR\n#   Create a GObject-Introspection repository file. Name it\n#   \"<provided_name>.gir\". Library name is set to generated vapi name without\n#   file extension suffix or if no vapi is to be generated guess from gir\n#   name.\n#\n# GENERATE_HEADER\n#   Let the compiler generate a header file for the compiled code. There will\n#   be a header file as well as an internal header file being generated called\n#   <provided_name>.h and <provided_name>_internal.h\n#\n# PUBLIC\n#   When enabled generate only public parts of vapis/headers.\n#\n# The following call is a simple example to the vala_precompile macro showing\n# an example to every of the optional sections:\n#\n#   find_package(Vala \"0.12\" REQUIRED)\n#   include(${VALA_USE_FILE})\n#\n#   vala_precompile(VALA_C\n#     SOURCES\n#       source1.vala\n#       source2.vala\n#       source3.vala\n#     PACKAGES\n#       gtk+-2.0\n#       gio-1.0\n#       posix\n#     DIRECTORY\n#       gen\n#     OPTIONS\n#       --thread\n#     CUSTOM_VAPIS\n#       some_vapi.vapi\n#     GENERATE_VAPI\n#       myvapi\n#     GENERATE_GIR\n#       MyLib-1.0\n#     GENERATE_HEADER\n#       myheader\n#     )\n#\n# Most important is the variable VALA_C which will contain all the generated c\n# file names after the call.\n##\n\n##\n# Copyright 2009-2010 Jakob Westhoff. All rights reserved.\n# Copyright 2010-2011 Daniel Pfeifer\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n#    1. Redistributions of source code must retain the above copyright notice,\n#       this list of conditions and the following disclaimer.\n#\n#    2. Redistributions in binary form must reproduce the above copyright notice,\n#       this list of conditions and the following disclaimer in the documentation\n#       and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR\n# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# The views and conclusions contained in the software and documentation are those\n# of the authors and should not be interpreted as representing official policies,\n# either expressed or implied, of Jakob Westhoff\n##\n\ninclude(CMakeParseArguments)\n\nfunction(vala_precompile output)\n  cmake_parse_arguments(ARGS \"PUBLIC\" \"DIRECTORY;GENERATE_HEADER;GENERATE_VAPI;GENERATE_GIR\"\n      \"SOURCES;PACKAGES;OPTIONS;DEFINITIONS;CUSTOM_VAPIS\" ${ARGN})\n\n  if(ARGS_DIRECTORY)\n    get_filename_component(DIRECTORY \"${ARGS_DIRECTORY}\" ABSOLUTE)\n  else()\n    set(DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")\n  endif()\n  include_directories(\"${DIRECTORY}\")\n\n  set(vala_pkg_opts)\n  foreach(pkg ${ARGS_PACKAGES})\n    list(APPEND vala_pkg_opts \"--pkg=${pkg}\")\n  endforeach()\n\n  set(vala_define_opts)\n  foreach(def ${ARGS_DEFINITIONS})\n    list(APPEND vala_define_opts \"--define=${def}\")\n  endforeach()\n\n  set(in_files)\n  set(out_files)\n  set(out_files_rel)\n  foreach(src ${ARGS_SOURCES} ${ARGS_UNPARSED_ARGUMENTS})\n    list(APPEND in_files \"${CMAKE_CURRENT_SOURCE_DIR}/${src}\")\n    string(REPLACE \".vala\" \".c\" src \"${src}\")\n    string(REPLACE \".gs\" \".c\" src \"${src}\")\n    set(out_file \"${DIRECTORY}/${src}\")\n    list(APPEND out_files \"${DIRECTORY}/${src}\")\n    set(out_files_rel \"${out_files_rel}, ${src}\")\n  endforeach()\n  string(REGEX REPLACE \"^, \" \"\" out_files_rel \"${out_files_rel}\")\n\n  set(custom_vapi_arguments)\n  if(ARGS_CUSTOM_VAPIS)\n    foreach(vapi ${ARGS_CUSTOM_VAPIS})\n      if(\"${vapi}\" MATCHES \"${CMAKE_SOURCE_DIR}\" OR \"${vapi}\" MATCHES \"${CMAKE_BINARY_DIR}\")\n        list(APPEND custom_vapi_arguments \"${vapi}\")\n      else()\n        list(APPEND custom_vapi_arguments \"${CMAKE_CURRENT_SOURCE_DIR}/${vapi}\")\n      endif()\n    endforeach()\n  endif()\n\n  set(vapi_arguments)\n  set(gir_arguments)\n  if(ARGS_GENERATE_VAPI)\n    list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi\")\n    set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_VAPI}.vapi\")\n    if(ARGS_PUBLIC)\n      set(vapi_arguments \"--library=${ARGS_GENERATE_VAPI}\")\n    else()\n      set(vapi_arguments \"--internal-vapi=${ARGS_GENERATE_VAPI}.vapi\")\n    endif()\n\n    # Header and internal header is needed to generate internal vapi\n    if(NOT ARGS_PUBLIC AND NOT ARGS_GENERATE_HEADER)\n      set(ARGS_GENERATE_HEADER \"${ARGS_GENERATE_VAPI}\")\n    endif()\n  endif()\n\n  if(ARGS_GENERATE_GIR)\n    list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_GIR}.gir\")\n    set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_GIR}.gir\")\n    list(APPEND gir_arguments \"--gir=${ARGS_GENERATE_GIR}.gir\")\n    if(NOT ARGS_PUBLIC OR NOT ARGS_GENERATE_VAPI)\n      set(tmplibname)\n      string(REGEX MATCH \"^[^-]*\" tmplibname \"${ARGS_GENERATE_GIR}\")\n      set(libname)\n      string(TOLOWER \"${tmplibname}\" libname)\n      list(APPEND gir_arguments \"--library=${libname}\")\n    endif()\n  endif()\n\n  set(header_arguments)\n  if(ARGS_GENERATE_HEADER)\n    list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_HEADER}.h\")\n    set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_HEADER}.h\")\n    list(APPEND header_arguments \"--header=${DIRECTORY}/${ARGS_GENERATE_HEADER}.h\")\n    if(NOT ARGS_PUBLIC)\n      list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h\")\n      set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_HEADER}_internal.h\")\n      list(APPEND header_arguments \"--internal-header=${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h\")\n    endif()\n  endif()\n\n  add_custom_command(\n    OUTPUT\n      \"vala.stamp\"\n    COMMAND\n      \"${VALA_EXECUTABLE}\"\n        \"-C\"\n        ${header_arguments}\n        ${vapi_arguments}\n        ${gir_arguments}\n        \"-b\" \"${CMAKE_CURRENT_SOURCE_DIR}\"\n        \"-d\" \"${DIRECTORY}\"\n        ${vala_pkg_opts}\n        ${vala_define_opts}\n        ${ARGS_OPTIONS}\n        ${in_files}\n        ${custom_vapi_arguments}\n    COMMAND\n      \"${CMAKE_COMMAND}\" -E touch \"vala.stamp\"\n    DEPENDS\n      ${in_files}\n      ${ARGS_CUSTOM_VAPIS}\n    COMMENT \"Generating ${out_files_rel}\"\n    VERBATIM\n  )\n  add_custom_command(\n    OUTPUT\n      ${out_files}\n    DEPENDS\n      \"vala.stamp\"\n    COMMENT \"\"\n  )\n  set(${output} ${out_files} PARENT_SCOPE)\nendfunction()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "cmake/vala/ValaDocs.cmake",
    "content": "#\n# cmake/vala/ValaDocs.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# The valadoc_gen function generates Vala documentation from .vala and .vapi\n# source files. The first parameter is the project name.\n# Provide target 'docs' to build documentation.\n#\n# Supported sections:\n#\n# ALL (optional)\n#   Include this target in all builds.\n#\n# INSTALLDIR (optional)\n#   Directory where to install documentation to.\n#   Default: ${datadir}\n#   If ${datadir} not defined: share/${package_name_lower}\n#                 (where ${package_name_lower} is ${package_name} with letters)\n#   If ${package_name} is not defined raise error.\n#\n# DOCDIR (optional)\n#   Directory where to build documentation to.\n#   Default: ${CMAKE_CURRENT_BINARY_DIR}/docs\n#\n# PACKAGES (in general mandatory)\n#   List of all Vala packages the project depends on.\n#\n# DEFINITIONS (optional)\n#   A list of symbols for conditional compilation.\n#\n# SRCFILES\n#   List of all project files. Globbing is supported.\n#\n# OPTIONS (optional)\n#   List of additional valadoc options.\n\nif(VALADOC_FOUND)\n  function(valadoc_gen package_name)\n    cmake_parse_arguments(ARGS \"ALL\" \"INSTALLDIR;DOCDIR\" \"PACKAGES;DEFINITIONS;SRCFILES;OPTIONS\" ${ARGN})\n\n    if(ARGS_SRCFILES)\n      if(ARGS_ALL)\n        set(make_all \"ALL\")\n      else()\n        set(make_all)\n      endif()\n\n      string(TOLOWER \"${package_name}\" package_name_lower)\n      if(ARGS_INSTALLDIR)\n        set(installdir \"${ARGS_DOCDIR}\")\n      elseif(datadir)\n        set(installdir \"${datadir}\")\n      elseif(package_name)\n        set(installdir \"share/${package_name_lower}\")\n      else()\n        message(SEND_ERROR \"No installation directory given.\")\n      endif()\n\n      if(ARGS_DOCDIR)\n        set(docdir \"${ARGS_DOCDIR}\")\n      else()\n        set(docdir \"${CMAKE_CURRENT_BINARY_DIR}/docs\")\n      endif()\n\n      set(srcfiles)\n      set(srcfiles_abs)\n      foreach(globexpr ${ARGS_SRCFILES})\n        file(GLOB tmpsrcfiles ${globexpr})\n        if(tmpsrcfiles)\n          foreach(tmpsrcfile ${tmpsrcfiles})\n            file(RELATIVE_PATH srcfile \"${CMAKE_CURRENT_BINARY_DIR}\" \"${tmpsrcfile}\")\n            list(APPEND srcfiles \"${srcfile}\")\n            get_filename_component(srcfile_abs \"${tmpsrcfile}\" ABSOLUTE)\n            list(APPEND srcfiles_abs \"${srcfile_abs}\")\n          endforeach()\n        else()\n          file(RELATIVE_PATH srcfile \"${CMAKE_CURRENT_BINARY_DIR}\" \"${globexpr}\")\n          list(APPEND srcfiles \"${srcfile}\")\n          get_filename_component(srcfile_abs \"${globexpr}\" ABSOLUTE)\n          list(APPEND srcfiles_abs \"${srcfile_abs}\")\n        endif()\n      endforeach()\n\n      set(pkg_opts)\n      foreach(pkg ${ARGS_PACKAGES})\n        list(APPEND pkg_opts \"--pkg=${pkg}\")\n      endforeach()\n\n      set(valadoc_options\n          \"-o\" \"${docdir}\"\n          \"--package-name\" \"${package_name}\"\n      )\n      foreach(def ${ARGS_DEFINITIONS})\n        list(APPEND valadoc_options \"--define=${def}\")\n      endforeach()\n      if(ARGS_OPTIONS)\n        list(APPEND valadoc_options ${ARGS_OPTIONS})\n      endif()\n\n      add_custom_command(\n        OUTPUT\n          \"${docdir}/index.html\"\n        COMMAND\n          \"${CMAKE_COMMAND}\" -E remove_directory \"${docdir}\"\n        COMMAND\n          \"${VALADOC_EXECUTABLE}\" ${srcfiles} ${pkg_opts} ${valadoc_options}\n        DEPENDS\n          ${srcfiles_abs}\n        VERBATIM\n      )\n\n      add_custom_target(\"docs-${package_name_lower}\"\n        ${make_all}\n        DEPENDS\n          \"${docdir}/index.html\"\n        COMMENT\n          \"Generating documentation with valadoc.\"\n      )\n\n      install(\n        DIRECTORY\n          \"${docdir}\"\n        DESTINATION\n          \"${installdir}\"\n        OPTIONAL\n      )\n    endif()\n  endfunction()\nendif()\n"
  },
  {
    "path": "cmake/vala/ValaPkgs.cmake",
    "content": "#\n# cmake/vala/ValaPkgs.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# The vala_pkgs function is a wrapper to perform pkg-config check,\n# automatically set compiler and linker flags and call the actual\n# vala_precompile function.\n#\n# Supported sections:\n#\n# PACKAGES\n#   A list of vala packages that are required to build the target. Versioned\n#   dependencies are supported. There is also a possibility to suppress\n#   checking with pkg-config or to suppress --cflags and --libs of pkg-config.\n#   To use those options append {option,option,...}.\n#\n# DEFINITIONS\n#   A list of symbols for conditional compilation. (optional)\n#\n# OPTIONAL\n#   A list of vala packages that are optional to build the target. (optional)\n#\n# SRCFILES\n#   A list of Vala source files. Globbing is supported.\n#\n# VAPIS\n#   A list of custom .vapi files. Globbing is supported. (optional)\n#\n# LIBRARY\n#   Name of library to generate.\n#\n# GIRFILE\n#   Generate GObject-Introspection repository file.\n#\n# OPTIONS\n#   A list of options passed to the valac compiler. (optional)\n#\n#\n# The following call is a simple example:\n#\n#   SET(packages \"foo >= 1.4.2\" \"bla <= 9\")\n#   vala_pkgs(VALA_C\n#     PACKAGES\n#       \"gtk+-3.0 >= 3.8\"\n#       gee-1.0\n#       ${packages}\n#       \"sdl-image {nocheck,nolink}\"\n#       \"sdl\"\n#     OPTIONAL\n#       libxml-2.0\n#     SRCFILES\n#       file.vala\n#       file2.vala\n#       src/file3.vala\n#   )\n#   add_executable(myexecutable ${VALA_C})\n#   target_link_libraries(myexecutable ${PROJECT_LDFLAGS})\n#   add_definitions(${PROJECT_C_FLAGS})\n#\ninclude(CMakeParseArguments)\nfunction(vala_pkgs output)\n  cmake_parse_arguments(ARGS \"\" \"LIBRARY;GIRFILE\" \"PACKAGES;DEFINITIONS;OPTIONAL;SRCFILES;VAPIS;OPTIONS\" ${ARGN})\n\n\n  if(ARGS_PACKAGES OR ARGS_OPTIONAL)\n    find_package(PkgConfig)\n  endif()\n\n  if(ARGS_SRCFILES)\n    include(UseVala)\n\n    # Package list without versions to pass to vala_precompile.\n    set(pkglist)\n\n    set(definitions)\n    set(libraries)\n\n    if(ARGS_PACKAGES)\n      foreach(pkg ${ARGS_PACKAGES})\n        set(matchit)\n        string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nocheck[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n        string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n\n        if(NOT matchit)\n          string(TOUPPER \"${pkgstripped}\" pkgdesctmp)\n          string(REGEX REPLACE \"([A-Z0-9-])[-+]*([0-9.]*)$\" \"\\\\1\\\\2\" pkgdesc \"${pkgdesctmp}\")\n          pkg_check_modules(${pkgdesc} REQUIRED ${pkgstripped})\n          if (${${pkgdesc}_FOUND})\n            set(matchit)\n            string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nolink[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n            if(NOT matchit)\n              string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n              list(APPEND definitions \"${${pkgdesc}_CFLAGS}\")\n              list(APPEND libraries \"${${pkgdesc}_LDFLAGS}\")\n            endif()\n          endif()\n        endif()\n\n        string(STRIP ${pkgstripped} tmppkgname)\n        string(REGEX REPLACE \"[ ].*$\" \"\" pkgname \"${tmppkgname}\")\n        list(APPEND pkglist \"${pkgname}\")\n      endforeach()\n    endif()\n\n    set(optional_pkgs)\n    if(ARGS_OPTIONAL)\n      foreach(pkg ${ARGS_OPTIONAL})\n        set(matchit)\n        string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nocheck[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n        string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n\n        if(NOT matchit)\n          string(TOUPPER \"${pkgstripped}\" pkgdesctmp)\n          string(REGEX REPLACE \"([A-Z0-9-])[-+]*([0-9.]*)$\" \"\\\\1\\\\2\" pkgdesc \"${pkgdesctmp}\")\n          pkg_check_modules(\"${pkgdesc}\" \"${pkgstripped}\")\n          if(${${pkgdesc}_FOUND})\n            set(matchit)\n            string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nolink[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n            if(NOT matchit)\n              string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n              list(APPEND definitions \"${${pkgdesc}_CFLAGS}\")\n              list(APPEND libraries \"${${pkgdesc}_LDFLAGS}\")\n            endif()\n          endif()\n        endif()\n\n        string(STRIP \"${pkgstripped}\" tmppkgname)\n        string(REGEX REPLACE \"([^ ]+)\" \"\\\\1\" pkgname \"${tmppkgname}\")\n        list(APPEND pkglist \"${pkgname}\")\n      endforeach()\n    endif()\n\n    pkg_check_modules(GTHREAD REQUIRED \"gthread-2.0\")\n    if(GTHREAD_FOUND)\n      list(APPEND definitions \"${GTHREAD_CFLAGS}\")\n      list(APPEND libraries \"${GTHREAD_LDFLAGS}\")\n    endif()\n\n    set(srcfiles)\n    foreach(globexpr ${ARGS_SRCFILES})\n      set(tmpsrcfiles)\n      file(GLOB tmpsrcfiles ${globexpr})\n      if(tmpsrcfiles)\n        foreach(tmpsrcfile ${tmpsrcfiles})\n          set(srcfile)\n          file(RELATIVE_PATH srcfile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${tmpsrcfile}\")\n            list(APPEND srcfiles \"${srcfile}\")\n        endforeach()\n      else()\n        list(APPEND srcfiles \"${globexpr}\")\n      endif()\n    endforeach()\n\n    set(vapifiles)\n    if(ARGS_VAPIS)\n      foreach(globexpr ${ARGS_VAPIS})\n        set(tmpvapifiles)\n        file(GLOB tmpvapifiles ${globexpr})\n        if(tmpvapifiles)\n          foreach(tmpvapifile ${tmpvapifiles})\n            set(vapifile)\n            file(RELATIVE_PATH vapifile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${tmpvapifile}\")\n              list(APPEND vapifiles \"${vapifile}\")\n          endforeach()\n        else()\n          list(APPEND vapifiles \"${globexpr}\")\n        endif()\n      endforeach()\n    endif()\n\n    vala_precompile(VALA_C\n        ${srcfiles}\n      PACKAGES\n        ${pkglist}\n      DEFINITIONS\n        \"${ARGS_DEFINITIONS}\"\n      CUSTOM_VAPIS\n        ${vapifiles}\n      GENERATE_VAPI\n        \"${ARGS_LIBRARY}\"\n      GENERATE_HEADER\n        \"${ARGS_LIBRARY}\"\n      GENERATE_GIR\n        \"${ARGS_GIRFILE}\"\n      OPTIONS\n        ${ARGS_OPTIONS}\n      PUBLIC\n    )\n\n    set(${output} ${VALA_C} PARENT_SCOPE)\n    set(PROJECT_C_FLAGS ${definitions} PARENT_SCOPE)\n    set(PROJECT_LDFLAGS ${libraries} PARENT_SCOPE)\n  endif()\nendfunction()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/autotools/autotools.info",
    "content": "<buildsystem version=\"0.1\">\n    <author>\n        <name>Yannick Inizan</name>\n        <mail>inizan.yannick@gmail.com</mail>\n    </author>\n    <name>\n        <en>Autotools</en>\n    </name>\n    <description>\n        <en>Autotools buildsystem.</en>\n    </description>\n</buildsystem>\n"
  },
  {
    "path": "data/buildsystems/autotools/buildsystem/AUTHORS",
    "content": ""
  },
  {
    "path": "data/buildsystems/autotools/buildsystem/COPYING",
    "content": ""
  },
  {
    "path": "data/buildsystems/autotools/buildsystem/ChangeLog",
    "content": ""
  },
  {
    "path": "data/buildsystems/autotools/buildsystem/NEWS",
    "content": ""
  },
  {
    "path": "data/buildsystems/autotools/buildsystem/README",
    "content": "\n"
  },
  {
    "path": "data/buildsystems/autotools/buildsystem/autogen.sh",
    "content": "#!/bin/sh\nset -ex\n\nautoreconf -f -i -Wall,error\n./configure\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/CMakeLists.txt",
    "content": "#\n# CMakeLists.txt\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\ncmake_minimum_required(VERSION \"2.8.4\")\n\ninclude(\"${CMAKE_SOURCE_DIR}/cmake/project.cmake\")\ninclude(\"${CMAKE_SOURCE_DIR}/cmake/Common.cmake\")\n\nif(CMAKE_MAJOR_VERSION GREATER \"2\")\n  cmake_policy(SET CMP0048 NEW)\n  project(\"${project_name}\" VERSION \"${${project_name}_VERSION}\" LANGUAGES \"C\")\nelse()\n  project(\"${project_name}\" \"C\")\nendif()\nstring(TOLOWER \"${project_name}\" project_name_lower)\n\nset(bindir \"bin\")\nset(datarootdir \"share\")\nset(libdir \"lib\")\nset(includedir \"include\")\nset(datadir \"${datarootdir}/${project_name_lower}\")\nset(uidir \"${datadir}/ui\")\nset(localedir \"${datarootdir}/locale\")\nset(appdir \"${datarootdir}/applications\")\nset(gsettingsdir \"${datarootdir}/glib-2.0/schemas\")\nset(pixrootdir \"${datarootdir}/pixmaps\")\nset(pixdir \"${pixrootdir}/${project_name_lower}\")\nset(docdir \"${datadir}/doc\")\nset(mandir \"${datarootdir}/man\")\nset(mimedir \"${datarootdir}/mime/packages\")\nif(CMAKE_INSTALL_PREFIX)\n  set(install_prefix \"${CMAKE_INSTALL_PREFIX}/\")\nelse()\n  set(install_prefix)\nendif()\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake/vala\")\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")\n\n\nfind_package(Vala \"0.20\" REQUIRED)\n\n# Custom library version checks.\nset(definitions)\nset(vapidirs)\nfind_package(PkgConfig)\n# config\nlist(REMOVE_ITEM required_pkgs \"config {nocheck,nolink}\")\n# glib-2.0\npkg_check_modules(GLIB2.0 REQUIRED \"glib-2.0\")\n\n\nset(default_vala_flags\n  \"--thread\"\n  \"--target-glib\" \"${GLIB2.0_VERSION}\"\n  #\"--enable-experimental\"\n  #\"--fatal-warnings\"\n)\n\ninclude(ValaPkgs)\nvala_pkgs(VALA_C\n  PACKAGES\n    ${required_pkgs}\n  DEFINITIONS\n    ${definitions}\n  OPTIONAL\n    ${optional_pkgs}\n  SRCFILES\n    ${srcfiles}\n  VAPIS\n    ${vapifiles}\n  OPTIONS\n    ${default_vala_flags}\n    ${vapidirs}\n)\n\n\n# Set common C-macros.\nadd_definitions(-DPACKAGE_NAME=\"${project_name}\")\nadd_definitions(-DPACKAGE_VERSION=\"${${project_name}_VERSION}\")\nif(project_root)\n  add_definitions(-DGETTEXT_PACKAGE=\"${project_root}\")\nelse()\n  add_definitions(-DGETTEXT_PACKAGE=\"${project_name_lower}\")\nendif()\nadd_definitions(-DPACKAGE_DATA_DIR=\"${install_prefix}${datadir}\")\nadd_definitions(-DPACKAGE_UI_DIR=\"${install_prefix}${uidir}\")\nadd_definitions(-DLOCALE_DIR=\"${install_prefix}${localedir}\")\nadd_definitions(-DPIXMAP_DIR=\"${install_prefix}${pixdir}\")\nadd_definitions(-DVALA_VERSION=\"${VALA_SHORTVER}\")\n\nadd_executable(\"${project_name_lower}\" ${VALA_C})\ntarget_link_libraries(\"${project_name_lower}\"\n  ${PROJECT_LDFLAGS}\n)\nadd_definitions(\n  ${PROJECT_C_FLAGS}\n)\ninstall(TARGETS ${project_name_lower} DESTINATION \"${bindir}\")\n\n# Install user interface files if used and copy them to build directory.\nset(uifiles_build)\nforeach(uifile ${uifiles})\n  add_custom_command(\n    OUTPUT\n      \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n    COMMAND\n      \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\" \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n    DEPENDS\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\"\n    COMMENT \"\"\n  )\n  list(APPEND uifiles_build \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\")\n  install(FILES ${uifile} DESTINATION \"${uidir}\")\nendforeach()\nadd_custom_target(\"ui_copy_${project_name_lower}\" DEPENDS ${uifiles_build})\nadd_dependencies(\"${project_name_lower}\" \"ui_copy_${project_name_lower}\")\n\n# Uninstall target\nadd_custom_target(uninstall\n  COMMAND\n    \"${CMAKE_COMMAND}\" -D \"CUSTOM_SOURCE_DIR:FILEPATH=${CMAKE_SOURCE_DIR}\"\n                       -D \"POSTREMOVE_HOOK:BOOL=${POSTINSTALL_HOOK}\"\n                       -D \"GSETTINGSDIR:FILEPATH=${install_prefix}${gsettingsdir}\"\n                       -P \"${CMAKE_SOURCE_DIR}/cmake/SimpleUninstall.cmake\"\n)\n\n\n# Print some information about build.\ndatestring(current_date \"%F %T\")\nmessage(\"\")\nmessage(\"---------------------------------------------\")\nmessage(\"                          ${current_date}\")\nmessage(\"${project_name} ${${project_name}_VERSION}\")\nmessage(\"\")\nif(CMAKE_BUILD_TYPE)\n  message(\"Build type: ${CMAKE_BUILD_TYPE}\")\n  string(TOUPPER \"${CMAKE_BUILD_TYPE}\" release_upper)\n  set(c_flags \"${CMAKE_C_FLAGS_${release_upper}}\")\nelse()\n  message(\"Build type: Default\")\n  set(c_flags \"${CMAKE_C_FLAGS}\")\nendif()\nmessage(\"\")\nmessage(\"Installation prefix:    ${CMAKE_INSTALL_PREFIX}\")\nforeach(def ${definitions})\n  list(APPEND default_vala_flags \"-D;${def}\")\nendforeach()\nbase_list_to_delimited_string(vala_flags\n  DELIM \" \"\n  BASE_LIST \"${default_vala_flags}\"\n)\nmessage(\"C compiler:             ${CMAKE_C_COMPILER}\")\nmessage(\"C compiler version      ${CMAKE_C_COMPILER_VERSION}\")\nif(\"${c_flags}\" STREQUAL \"\")\n  set(c_flags \"(none)\")\nendif()\nmessage(\"C flags:                ${c_flags}\")\nmessage(\"Vala compiler:          ${VALA_EXECUTABLE}\")\nmessage(\"Vala compiler version:  ${VALA_VERSION}\")\nif(\"${vala_flags}\" STREQUAL \"\")\n  set(vala_flags \"(none)\")\nendif()\nmessage(\"Vala flags:             ${vala_flags}\")\nmessage(\"GLib version:           ${GLIB2.0_VERSION}\")\nmessage(\"\")\nif(GETTEXT_PACKAGE_NAME)\n  if(GETTEXT_PACKAGE_VERSION)\n    message(\"Gettext package:        ${GETTEXT_PACKAGE_NAME} (${GETTEXT_PACKAGE_VERSION})\")\n  else()\n    message(\"Gettext package:        ${GETTEXT_PACKAGE_NAME}\")\n  endif()\nendif()\nif(CMAKE_VERBOSE_MAKEFILE)\n  message(\"Verbose build:          yes\")\nelse()\n  message(\"Verbose build:          no\")\nendif()\nmessage(\"\")\nmessage(\"---------------------------------------------\")\nmessage(\"\")\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/Common.cmake",
    "content": "#\n# cmake/Common.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# The base_list_to_delimited_string function transforms a list into a delimited\n# string.\n# This function is based on the basis_list_to_delimited_string in\n# CommonTools.cmake by the Build system And Software Implementation Standard\n# (BASIS) project by the University of Pennsylvania (Penn).\n#\n# Usage:\n#\n# The first parameter is set to transformed list.\n#\n# DELIM\n#   A string which will be the delimiter between all list elements.\n#\n# BASE_LIST\n#   The list which will be transformed to a single string.\n#\n#\n# Simple example:\n#\n#   set(packages \"abc\" \"def\" \"fhi\" \"jkl\" \"mno\")\n#   base_list_to_delimited_string(transformed_list\n#     DELIM\n#       \"||\"\n#     BASE_LIST\n#       ${packages}\n#   )\n#   message(\"show it:${transformed_list}\")\n#   >> show it:abc||def||fhi||jkl||mno\n#\nfunction(base_list_to_delimited_string output)\n  cmake_parse_arguments(ARGS \"\" \"\" \"DELIM;BASE_LIST\" ${ARGN})\n\n  set(list_string)\n  foreach(element ${ARGS_BASE_LIST})\n    if(list_string)\n      set(list_string \"${list_string}${ARGS_DELIM}\")\n    endif()\n    if(element MATCHES \"${ARGS_DELIM}\")\n      set(list_string \"${list_string}\\\"${element}\\\"\")\n    else()\n      set(list_string \"${list_string}${element}\")\n    endif()\n  endforeach()\n\n  set(\"${output}\" \"${list_string}\" PARENT_SCOPE)\nendfunction()\n\n\n##\n# Convert svg to png and set up installation places. rsvg-convert or\n# imagemagick (with svg support) is required.\n#\n# Usage:\n# The first parameter is set to all png files. Add them later to a custom\n# target. Generated directories are:\n#   ${prefix}/share/icons/hicolor/${size}x${size}/apps/${png_name}.png\n#\n# ICON\n#   svg icon path\n#\n# SIZES\n#   List of all supported sizes.\n#\n# PNG_NAME\n#   Name of png file (without suffix) which is the target file name.\n#\n# DESTINATION\n#   Directory where to install all generated files to (plain).\n#\n#\n# Simple example:\n#\n#   set(sizes 42 43 44)\n#   convert_svg_to_png(png_files\n#     ICON\n#       my_really_cool_icon.svg\n#     SIZES\n#       \"${sizes}\"\n#     PNG_NAME\n#       freshy\n#   )\n#   add_custom_target(my_target_name ALL DEPENDS ${png_files})\n#\n#   # This will build and install my_really_cool_icon.svg to:\n#   #   /usr/share/icons/hicolor/42x42/apps/freshy.png\n#   #   /usr/share/icons/hicolor/43x43/apps/freshy.png\n#   #   /usr/share/icons/hicolor/44x44/apps/freshy.png\n#\nfunction(convert_svg_to_png output)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"\" \"DESTINATION\" \"ICON;SIZES;PNG_NAME\" ${ARGN})\n\n  set(png_list)\n  if(ARGS_ICON)\n    if(ARGS_PNG_NAME)\n      find_program(CONVERT rsvg-convert)\n      if(NOT CONVERT)\n        find_program(CONVERT_IMG convert)\n      endif()\n      if(CONVERT OR CONVERT_IMG)\n        if(NOT datarootdir)\n          set(datarootdir \"share\")\n        endif()\n\n        foreach(size ${ARGS_SIZES})\n          set(tmppath \"icons/hicolor/${size}x${size}/apps\")\n          set(icondir \"${CMAKE_CURRENT_BINARY_DIR}/${tmppath}\")\n          set(iconpath \"${icondir}/${ARGS_PNG_NAME}.png\")\n          if(CONVERT)\n            add_custom_command(\n              OUTPUT\n                \"${iconpath}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E make_directory \"${icondir}\"\n              COMMAND\n                \"${CONVERT}\" \"--background-color\" \"none\" \"--width\" \"${size}\" \"--height\" \"${size}\" \"${ARGS_ICON}\" \"--output\" \"${iconpath}\"\n              DEPENDS\n                \"${ARGS_ICON}\"\n              VERBATIM\n            )\n          else()\n            add_custom_command(\n              OUTPUT\n                \"${iconpath}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E make_directory \"${icondir}\"\n              COMMAND\n                \"${CONVERT_IMG}\" \"-background\" \"none\" \"-resize\" \"${size}x${size}\" \"${ARGS_ICON}\" \"${iconpath}\"\n              DEPENDS\n                \"${ARGS_ICON}\"\n              VERBATIM\n            )\n          endif()\n          list(APPEND png_list \"${iconpath}\")\n          if(ARGS_DESTINATION)\n            install(FILES \"${iconpath}\" DESTINATION \"${ARGS_DESTINATION}\")\n          else()\n            install(FILES \"${iconpath}\" DESTINATION \"${datarootdir}/${tmppath}\")\n          endif()\n        endforeach()\n      else()\n        message(WARNING \"Could not find convert program. Don't generate icons.\")\n      endif()\n    endif()\n  endif()\n\n  set(${output} \"${png_list}\" PARENT_SCOPE)\nendfunction()\n\n\n##\n# Get formatted date string.\n#\n# Usage:\n# The first parameter is set to output date string.\n#\n# FORMAT\n#   Format string.\n#\n#\n# Simple example:\n#\n#   datestring(date\n#     FORMAT \"%B %Y\"\n#   )\n#   # Will print out e.g. \"Date: April 2013\"\n#   message(\"Date: ${date}\")\n#\nmacro(datestring output)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"\" \"FORMAT\" \"\" ${ARGN})\n\n  if(ARGS_FORMAT)\n    set(format \"${ARGS_FORMAT}\")\n  else()\n    set(format \"${ARGN}\")\n  endif()\n\n  if(WIN32)\n    #FIXME: Needs to be tested. Perhaps wrapping with cmd is needed.\n    execute_process(\n      COMMAND\n        \"date\" \"${format}\"\n      OUTPUT_VARIABLE\n        \"${output}\"\n      OUTPUT_STRIP_TRAILING_WHITESPACE\n    )\n  else()\n    execute_process(\n      COMMAND\n      \"date\" \"+${format}\"\n      OUTPUT_VARIABLE\n        \"${output}\"\n      OUTPUT_STRIP_TRAILING_WHITESPACE\n    )\n  endif()\nendmacro()\n\n\n##\n# Install/verify gsettings files and compile schemas.\n#\n# Depends on cmake/GlibCompileSchema.cmake.in (for compiling) and\n# cmake/GlibCompileSchema_verify.cmake.in (for verifying, only wth local\n# option)\n#\n# Usage:\n#\n# LOCAL\n#   If set compile gsettings schemas locally (in\n#   ${CMAKE_BINARY_DIR}/glib-2.0/schemas) directory). Add this directory to\n#   your XDG_DATA_DIRS variable.\n#\n# GSETTINGSDIR\n#   Directory where to install gsettings schemas. Default is:\n#   share/glib-2.0/schemas\n#\n# FILES\n#   List of gsettings schema files to install / compiile.\n#\n#\n# Simple example:\n#\n#   gsettings_install(\n#     LOCAL\n#     GSETTINGSDIR\n#       share/glib-2.0/schemas\n#     FILES\n#       \"data/app.foobar.gschema.xml\"\n#   )\n#\nfunction(gsettings_install)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"LOCAL\" \"GSETTINGSDIR\" \"FILES\" ${ARGN})\n  find_program(GLIBCOMPILESCHEMA \"glib-compile-schemas\" REQUIRED)\n\n  if(NOT \"\" STREQUAL \"${ARGS_FILES}\")\n    if(ARGS_LOCAL)\n      set(GSETTINGSDIR \"glib-2.0/schemas\")\n      configure_file(\n        \"${CMAKE_SOURCE_DIR}/cmake/GlibCompileSchema.cmake.in\"\n        \"${CMAKE_BINARY_DIR}/GlibCompileSchema_local.cmake\"\n        @ONLY\n      )\n      configure_file(\n        \"${CMAKE_SOURCE_DIR}/cmake/GlibCompileSchema_verify.cmake.in\"\n        \"${CMAKE_BINARY_DIR}/GlibCompileSchema_verify.cmake\"\n        COPYONLY\n      )\n      set(gfiles_copied)\n      foreach(gfile ${ARGS_FILES})\n        if(NOT IS_ABSOLUTE \"${gfile}\")\n          set(gfile \"${CMAKE_CURRENT_SOURCE_DIR}/${gfile}\")\n        endif()\n        get_filename_component(filename \"${gfile}\" NAME)\n        set(gfile_copied \"${CMAKE_CURRENT_BINARY_DIR}/glib-2.0/schemas/${filename}\")\n        add_custom_command(\n            OUTPUT\n              \"${gfile_copied}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -D \"GLIBCOMPILESCHEMA:FILEPATH=${GLIBCOMPILESCHEMA}\"\n                                 -D \"GLIB_SCHEMAFILE:FILEPATH=${gfile}\"\n                                 -P \"${CMAKE_BINARY_DIR}/GlibCompileSchema_verify.cmake\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${gfile}\" \"${gfile_copied}\"\n            DEPENDS\n              \"${gfile}\"\n            COMMENT\n              \"Install and verify gsettings schemas locally...\"\n            VERBATIM\n        )\n        list(APPEND gfiles_copied \"${gfile_copied}\")\n      endforeach()\n      add_custom_command(\n          OUTPUT\n            \"glib-2.0/schemas/gschemas.compiled\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -P \"${CMAKE_BINARY_DIR}/GlibCompileSchema_local.cmake\"\n          DEPENDS\n            ${gfiles_copied}\n          COMMENT\n            \"Compile gsettings schemas...\"\n          VERBATIM\n      )\n      add_custom_target(\"gsettings_${project_name_lower}\"\n        DEPENDS\n          \"glib-2.0/schemas/gschemas.compiled\"\n      )\n      add_dependencies(\"${project_name_lower}\" \"gsettings_${project_name_lower}\")\n    endif()\n\n    if(NOT ARGS_GSETTINGSDIR)\n      set(ARGS_GSETTINGSDIR \"share/glib-2.0/schemas\")\n    endif()\n    foreach(gfile ${ARGS_FILES})\n      install(FILES \"${gfile}\" DESTINATION \"${ARGS_GSETTINGSDIR}\")\n    endforeach()\n\n    if(POSTINSTALL_HOOK AND \"$ENV{DESTDIR}\" STREQUAL \"\")\n      if(CMAKE_INSTALL_PREFIX)\n        set(install_prefix \"${CMAKE_INSTALL_PREFIX}/\")\n      else()\n        set(install_prefix)\n      endif()\n      set(GSETTINGSDIR \"${install_prefix}${ARGS_GSETTINGSDIR}\")\n      configure_file(\n        \"${CMAKE_SOURCE_DIR}/cmake/GlibCompileSchema.cmake.in\"\n        \"${CMAKE_BINARY_DIR}/GlibCompileSchema.cmake\"\n        @ONLY\n      )\n      install(SCRIPT \"${CMAKE_BINARY_DIR}/GlibCompileSchema.cmake\")\n    endif()\n  endif()\nendfunction()\n\n\n##\n# Recursively copy directory content.\n#\n# Usage:\n#\n# TARGET\n#   Name of CMake target. Default is 'copy_dirs'.\n#\n# BASEDIR\n#   Name of base directory to build relative paths compared  to TARGETDIR.\n#   Default is ${CMAKE_CURRENT_SOURCE_DIR}.\n#\n# TARGETDIR\n#   Name of base directory where to copy files to. Default is\n#   ${CMAKE_CURRENT_BINARY_DIR}.\n#\n# DIRS\n#   List of directories (or files) to recursively copy.\n#\n#\n# Simple example:\n#\n#     copy_dirs(\n#       TARGET\n#         \"custom_target_name\n#       BASEDIR\n#         \"${CMAKE_CURRENT_SOURCE_DIR}/foo\"\n#       TARGETDIR\n#         \"${CMAKE_CURRENT_BINARY_DIR}/bar\"\n#       DIRS\n#         \"blub̈́*\"\n#         \"/foobar/bar\"\n#     )\n#     # Copy ${}/foo/blub* and /foobar/bar to ${}/bar (= ${}/bar/blub*) and\n#     #                                                  ${}/bar/foobar/bar)\n#     add_custom_target(\"foobar\"\n#       ALL\n#       DEPENDS\n#         \"custom_target_name\"\n#       COMMENT \"Copy some files\"\n#     )\n#\nfunction(copy_dirs)\n  include(CMakeParseArguments)\n  cmake_parse_arguments(ARGS \"\" \"TARGET;BASEDIR;TARGETDIR\" \"DIRS\" ${ARGN})\n\n  if(NOT ARGS_BASEDIR)\n    set(ARGS_BASEDIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\n  endif()\n  if(NOT ARGS_TARGET)\n    set(ARGS_TARGET \"copy_dirs\")\n  endif()\n  if(NOT ARGS_TARGETDIR)\n    set(ARGS_TARGETDIR \"${CMAKE_CURRENT_BINARY_DIR}\")\n  endif()\n\n  set(copyfiles)\n  foreach(globexpr ${ARGS_DIRS})\n    file(GLOB tmpdirs ${globexpr})\n    if(tmpdirs)\n      foreach(tmpdir ${tmpdirs})\n        get_files_recursively(files \"${tmpdir}\")\n        list(APPEND copyfiles ${files})\n      endforeach()\n    else()\n      get_files_recursively(files \"${globexpr}\")\n      list(APPEND copyfiles ${files})\n    endif()\n  endforeach()\n\n  set(copyfiles_d)\n  foreach(copyfile ${copyfiles})\n    file(RELATIVE_PATH copyfile_d \"${ARGS_BASEDIR}\" \"${copyfile}\")\n    set(copyfile_d \"${ARGS_TARGETDIR}/${copyfile_d}\")\n    add_custom_command(\n      OUTPUT\n        \"${copyfile_d}\"\n      COMMAND\n        \"${CMAKE_COMMAND}\" -E copy_if_different \"${copyfile}\" \"${copyfile_d}\"\n      DEPENDS\n        \"${copyfile}\"\n      VERBATIM\n    )\n    list(APPEND copyfiles_d \"${copyfile_d}\")\n  endforeach()\n\n  add_custom_target(\"${ARGS_TARGET}\"\n    DEPENDS\n      ${copyfiles_d}\n    #COMMENT \"Copy data files.\"\n  )\nendfunction()\n\n\n##\n# Recursively get list of files.\n#\n# From refaim on stackoverflow: http://stackoverflow.com/a/7788165/770468\n#\n# Usage:\n# The first parameter is set to list of files. The second one is the path of\n# current directory.\n#\n#\n# Simple example:\n#\n#   # Set ${files} to all files in foo/ directory.\n#   get_files_recursively(files \"foo\")\n#\nmacro(get_files_recursively result curdir)\n  file(GLOB children RELATIVE \"${curdir}\" \"${curdir}/*\")\n  set(files)\n  foreach(child ${children})\n    if(IS_DIRECTORY \"${curdir}/${child}\")\n      get_files_recursively(subfiles \"${curdir}\")\n      list(APPEND files ${subfiles})\n    else()\n      list(APPEND files \"${curdir}/${child}\")\n    endif()\n  endforeach()\n  set(${result} ${files})\nendmacro()\n\n\n##\n# Computes the realtionship between two version strings.  A version\n# string is a number delineated by '.'s such as 1.3.2 and 0.99.9.1.\n# You can feed version strings with different number of dot versions,\n# and the shorter version number will be padded with zeros: 9.2 <\n# 9.2.1 will actually compare 9.2.0 < 9.2.1.\n#\n# Input: a_in - value, not variable\n#        b_in - value, not variable\n#        result_out - variable with value:\n#                         -1 : a_in <  b_in\n#                          0 : a_in == b_in\n#                          1 : a_in >  b_in\n#\n# Written by James Bigler.\n# http://www.cmake.org/Wiki/CMakeCompareVersionStrings (2013/09/29)\n#\nmacro(compare_version_strings a_in b_in result_out)\n  # Since SEPARATE_ARGUMENTS using ' ' as the separation token,\n  # replace '.' with ' ' to allow easy tokenization of the string.\n  string(REPLACE \".\" \" \" a ${a_in})\n  string(REPLACE \".\" \" \" b ${b_in})\n  separate_arguments(a)\n  separate_arguments(b)\n\n  # Check the size of each list to see if they are equal.\n  list(LENGTH a a_length)\n  list(LENGTH b b_length)\n\n  # Pad the shorter list with zeros.\n\n  # Note that range needs to be one less than the length as the for\n  # loop is inclusive (silly CMake).\n  if(a_length LESS b_length)\n    # a is shorter\n    set(shorter a)\n    math(EXPR range \"${b_length} - 1\")\n    math(EXPR pad_range \"${b_length} - ${a_length} - 1\")\n  else()\n    # b is shorter\n    set(shorter b)\n    math(EXPR range \"${a_length} - 1\")\n    math(EXPR pad_range \"${a_length} - ${b_length} - 1\")\n  endif()\n\n  # PAD out if we need to\n  if(NOT pad_range LESS 0)\n    foreach(pad RANGE ${pad_range})\n      # Since shorter is an alias for b, we need to get to it by by dereferencing shorter.\n      list(APPEND ${shorter} 0)\n    endforeach()\n  endif()\n\n  set(result 0)\n  foreach(index RANGE ${range})\n    if(result EQUAL 0)\n      # Only continue to compare things as long as they are equal\n      list(GET a ${index} a_version)\n      list(GET b ${index} b_version)\n      # LESS\n      if(a_version LESS b_version)\n        set(result -1)\n      endif()\n      # GREATER\n      if(a_version GREATER b_version)\n        set(result 1)\n      endif()\n    endif()\n  endforeach()\n\n  # Copy out the return result\n  set(${result_out} ${result})\nendmacro()\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/FindIntltool.cmake",
    "content": "#\n# cmake/Intltool.cmake\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\nfind_program(INTLTOOL_EXTRACT_EXECUTABLE intltool-extract)\nfind_program(INTLTOOL_MERGE_EXECUTABLE intltool-merge)\nmark_as_advanced(INTLTOOL_EXTRACT_EXECUTABLE)\nmark_as_advanced(INTLTOOL_MERGE_EXECUTABLE)\n\nif(INTLTOOL_EXTRACT_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${INTLTOOL_EXTRACT_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      intltool_version\n    ERROR_QUIET\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  if(intltool_version MATCHES \"^intltool-extract \\\\(.*\\\\) [0-9]\")\n    string(REGEX REPLACE \"^intltool-extract \\\\([^\\\\)]*\\\\) ([0-9\\\\.]+[^ \\n]*).*\" \"\\\\1\" INTLTOOL_VERSION_STRING \"${intltool_version}\")\n  endif()\n  unset(intltool_version)\nendif()\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Intltool\n  REQUIRED_VARS\n    INTLTOOL_EXTRACT_EXECUTABLE\n    INTLTOOL_MERGE_EXECUTABLE\n  VERSION_VAR\n    INTLTOOL_VERSION_STRING\n)\n\nset(INTLTOOL_OPTIONS_DEFAULT\n  \"--quiet\"\n)\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/Gettext.cmake",
    "content": "#\n# cmake/Gettext.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n#\n# Heavily based on Jim Nelson's Gettext.cmake in Geary project:\n# https://github.com/ypcs/geary\n#\n##\n# Add find_package handler for gettext programs msgmerge, msgfmt, msgcat and\n# xgettext.\n##\n# Constant:\n# XGETTEXT_OPTIONS_DEFAULT: Provide common xgettext options.\n# XGETTEXT_VALA_OPTIONS_DEFAULT: Provide common xgettext options for Vala files.\n# XGETTEXT_GLADE_OPTIONS_DEFAULT: Provide common xgettext options for glade.\n##\n# The gettext_create_pot macro creates .pot files with xgettext from multiple\n# source files.\n# Provide target 'pot' to generate .pot file.\n#\n# Supported sections:\n#\n# PACKAGE (optional)\n#   Gettext package name. Get exported to parent scope.\n#   Default: ${PROJECT_NAME}\n#\n# VERSION (optional)\n#   Gettext package version. Get exported to parent scope.\n#   Default: ${${GETTEXT_PACKAGE_NAME}_VERSION}\n#   (${GETTEXT_PACKAGE_NAME} is package name from option above)\n#\n# OPTIONS (optional)\n#   Pass list of xgettext options (you can use XGETTEXT_OPTIONS_DEFAULT,\n#   XGETTEXT_VALA_OPTIONS_DEFAULT and XGETTEXT_GLADE_OPTIONS_DEFAULT\n#   constants).\n#   Default: ${XGETTEXT_{,VALA,GLADE}_OPTIONS_DEFAULT}\n#\n# SRCFILES (optional/mandatory)\n#   List of source files to extract gettext strings from. Globbing is\n#  supported.\n#\n# GLADEFILES (optional/mandatory)\n#   List of glade source files to extract gettext strings from. Globbing is\n#   supported.\n#\n# DESKTOPFILES (optional/mandatory)\n#   List of .desktop files to extract gettext strings from. Globbing is\n#   supported.\n#   intltool required.\n#\n# GSETTINGSFILES (optional/mandatory)\n#   List of gsettings (.gschema.xml) files to extract gettext strings from.\n#   Globbing is supported.\n#   intltool required.\n#\n# Either SRCFILES or GLADEFILES or DESKTOPFILES or GSETTINGSFILES (or all)\n# have to be filled with some files.\n#\n##\n# The gettext_create_translations function generates .gmo files from .po files\n# and install them as .mo files.\n# Provide target 'translations' to build .gmo files.\n#\n# Supported sections:\n#\n# ALL (optional)\n#   Make translations target a dependency of the 'all' target. (Build\n#   translations with every build.)\n#\n# PODIR (optional)\n#   Directory with .po files.\n#   Default: ${CMAKE_CURRENT_SOURCE_DIR}\n#\n# LOCALEDIR (optional)\n#   Base directory where to install translations.\n#   Default: share/cmake\n#\n# LANGUAGES (optional)\n#   List of language 'short names'. This is in generel the part before the .po.\n#   With English locale this is e.g. 'en_GB' or 'en_US' etc.\n#\n# POFILES (optional)\n#   List of .po files.\n#\n##\n#\n# The following call is a simple example (within project po directory):\n#\n#   include(Gettext)\n#   if(XGETTEXT_FOUND)\n#     set(potfile \"${CMAKE_CURRENT_SOURCE_DIR}/my_project.pot\")\n#     gettext_create_pot(\"${potfile}\"\n#       SRCFILES\n#         \"${PROJECT_SOURCE_DIR}/src/*.vala\"\n#     )\n#     gettext_create_translations(\"${potfile}\" ALL)\n#   endif()\n#\n##\nfind_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)\nfind_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt)\nfind_program(GETTEXT_MSGCAT_EXECUTABLE msgcat)\nfind_program(XGETTEXT_EXECUTABLE xgettext)\nmark_as_advanced(GETTEXT_MSGMERGE_EXECUTABLE)\nmark_as_advanced(GETTEXT_MSGFMT_EXECUTABLE)\nmark_as_advanced(GETTEXT_MSGCAT_EXECUTABLE)\nmark_as_advanced(XGETTEXT_EXECUTABLE)\n\nif(XGETTEXT_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${XGETTEXT_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      gettext_version\n    ERROR_QUIET\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  if(gettext_version MATCHES \"^xgettext \\\\(.*\\\\) [0-9]\")\n    string(REGEX REPLACE \"^xgettext \\\\([^\\\\)]*\\\\) ([0-9\\\\.]+[^ \\n]*).*\" \"\\\\1\" GETTEXT_VERSION_STRING \"${gettext_version}\")\n  endif()\n  unset(gettext_version)\nendif()\n\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Gettext\n  REQUIRED_VARS\n    XGETTEXT_EXECUTABLE\n    GETTEXT_MSGMERGE_EXECUTABLE\n    GETTEXT_MSGFMT_EXECUTABLE\n    GETTEXT_MSGCAT_EXECUTABLE\n  VERSION_VAR\n    GETTEXT_VERSION_STRING\n)\n\nif(XGETTEXT_EXECUTABLE AND GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE AND GETTEXT_MSGCAT_EXECUTABLE)\n  set(XGETTEXT_FOUND TRUE)\n  # Export variable to use it as status info.\n  set(TRANSLATION_BUILD TRUE PARENT_SCOPE)\nelse()\n  set(XGETTEXT_FOUND FALSE)\n  set(TRANSLATION_BUILD FALSE PARENT_SCOPE)\nendif()\n\n\nset(XGETTEXT_OPTIONS_DEFAULT\n  \"-s\"\n  \"--escape\"\n  \"--add-comments=TRANSLATORS:\"  #TODO: Make this configurable.\n  \"--from-code=UTF-8\"\n)\nset(XGETTEXT_VALA_OPTIONS_DEFAULT\n  \"--language\" \"C\"\n  \"--keyword=_\"\n  \"--keyword=N_\"\n  \"--keyword=C_:1c,2\"\n  \"--keyword=NC_:1c,2\"\n)\nset(XGETTEXT_GLADE_OPTIONS_DEFAULT\n  \"--language\" \"Glade\"\n  \"--omit-header\"\n)\nset(XGETTEXT_INTLTOOL_OPTIONS\n  \"--language\" \"C\"\n  \"--keyword=N_:1\"\n)\nset(_INTLTOOL_DESKTOPFILES)\n\n\nif(XGETTEXT_FOUND)\n  macro(gettext_create_pot potfile)\n    cmake_parse_arguments(ARGS \"\" \"PACKAGE;VERSION;WORKING_DIRECTORY\"\n      \"OPTIONS;VALA_OPTIONS;GLADE_OPTIONS;SRCFILES;GLADEFILES;DESKTOPFILES;GSETTINGSFILES\" ${ARGN})\n\n    if(ARGS_PACKAGE)\n      set(package_name \"${ARGS_PACKAGE}\")\n    elseif(GETTEXT_PACKAGE)\n      set(package_name \"${GETTEXT_PACKAGE}\")\n    else()\n      set(package_name \"${PROJECT_NAME}\")\n    endif()\n\n    if(ARGS_VERSION)\n      set(package_version \"${ARGS_VERSION}\")\n    elseif(VERSION)\n      set(package_version \"${VERSION}\")\n    else()\n      set(package_version \"${${package_name}_VERSION}\")\n    endif()\n    # Export for status information.\n    set(GETTEXT_PACKAGE_NAME \"${package_name}\" PARENT_SCOPE)\n    set(GETTEXT_PACKAGE_VERSION \"${package_version}\" PARENT_SCOPE)\n\n    if(NOT ARGS_WORKING_DIRECTORY)\n      set(ARGS_WORKING_DIRECTORY \"../\")\n    endif()\n\n    set(xgettext_options \"--package-name\" \"${package_name}\")\n    if(package_version)\n      list(APPEND xgettext_options \"--package-version\" \"${package_version}\")\n    endif()\n    if(ARGS_OPTIONS)\n      list(APPEND xgettext_options ${ARGS_OPTIONS})\n    else()\n      list(APPEND xgettext_options ${XGETTEXT_OPTIONS_DEFAULT})\n    endif()\n\n    if(ARGS_XGETTEXT_VALA_OPTIONS_DEFAULT)\n      set(xgettext_vala_options ${ARGS_XGETTEXT_VALA_OPTIONS_DEFAULT})\n    else()\n      set(xgettext_vala_options ${XGETTEXT_VALA_OPTIONS_DEFAULT})\n    endif()\n    if(ARGS_XGETTEXT_GLADE_OPTIONS_DEFAULT)\n      set(xgettext_glade_options ${ARGS_XGETTEXT_GLADE_OPTIONS_DEFAULT})\n    else()\n      set(xgettext_glade_options ${XGETTEXT_GLADE_OPTIONS_DEFAULT})\n    endif()\n\n    if(ARGS_SRCFILES OR ARGS_GLADEFILES OR ARGS_DESKTOPFILES OR ARGS_GSETTINGSFILES)\n      set(src_list)\n      set(src_list_abs)\n      foreach(globexpr ${ARGS_SRCFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpsrcfiles)\n        file(GLOB tmpsrcfiles ${globexpr})\n        if (tmpsrcfiles)\n          foreach(absFile ${tmpsrcfiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND src_list \"${relFile}\")\n            list(APPEND src_list_abs \"${absFile}\")\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND src_list \"${relFile}\")\n          list(APPEND src_list_abs \"${globexpr}\")\n        endif()\n      endforeach()\n\n      set(glade_list)\n      set(glade_list_abs)\n      foreach(globexpr ${ARGS_GLADEFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpgladefiles)\n        file(GLOB tmpgladefiles ${globexpr})\n        if (tmpgladefiles)\n          foreach(absFile ${tmpgladefiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND glade_list \"${relFile}\")\n            list(APPEND glade_list_abs \"${absFile}\")\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND glade_list \"${relFile}\")\n          list(APPEND glade_list_abs \"${globexpr}\")\n        endif()\n      endforeach()\n\n      if(ARGS_DESKTOPFILES OR ARGS_GSETTINGSFILES)\n        find_package(Intltool REQUIRED)\n      endif()\n      set(desktop_list)\n      set(desktop_list_abs)\n      set(desktop_list_b)\n      set(desktop_list_b_abs)\n      set(desktop_list_h)\n      set(desktop_list_h_abs)\n      foreach(globexpr ${ARGS_DESKTOPFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpdesktopfiles)\n        file(GLOB tmpdesktopfiles ${globexpr})\n        if (tmpdesktopfiles)\n          foreach(absFile ${tmpdesktopfiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND desktop_list \"${relFile}\")\n            list(APPEND desktop_list_abs \"${absFile}\")\n\n            file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND desktop_list_b \"${relFile_b}\")\n            get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n            list(APPEND desktop_list_b_abs \"${absFile_b}\")\n            file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n            list(APPEND desktop_list_h \"${relFile_h}\")\n            list(APPEND desktop_list_h_abs \"${absFile_b}.h\")\n            add_custom_command(\n              OUTPUT\n                \"${absFile_b}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n              DEPENDS\n                \"${absFile}\"\n              VERBATIM\n            )\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND desktop_list \"${relFile}\")\n          list(APPEND desktop_list_abs \"${globexpr}\")\n\n          file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND desktop_list_b \"${relFile_b}\")\n          get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n          list(APPEND desktop_list_b_abs \"${absFile_b}\")\n          file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n          list(APPEND desktop_list_h \"${relFile_h}\")\n          list(APPEND desktop_list_h_abs \"${absFile_b}.h\")\n          add_custom_command(\n            OUTPUT\n              \"${absFile_b}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n            DEPENDS\n              \"${absFile}\"\n            VERBATIM\n          )\n        endif()\n      endforeach()\n      set(_INTLTOOL_DESKTOPFILES ${desktop_list_b})\n\n      set(gsettings_list)\n      set(gsettings_list_abs)\n      set(gsettings_list_b)\n      set(gsettings_list_b_abs)\n      set(gsettings_list_h)\n      set(gsettings_list_h_abs)\n      foreach(globexpr ${ARGS_GSETTINGSFILES})\n        if(NOT IS_ABSOLUTE \"${globexpr}\")\n          get_filename_component(absDir \"${ARGS_WORKING_DIRECTORY}\" ABSOLUTE)\n          set(globexpr \"${absDir}/${globexpr}\")\n        endif()\n        set(tmpgsettingsfiles)\n        file(GLOB tmpgsettingsfiles ${globexpr})\n        if (tmpgsettingsfiles)\n          foreach(absFile ${tmpgsettingsfiles})\n            file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND gsettings_list \"${relFile}\")\n            list(APPEND gsettings_list_abs \"${absFile}\")\n\n            file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${absFile}\")\n            list(APPEND gsettings_list_b \"${relFile_b}\")\n            get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n            list(APPEND gsettings_list_b_abs \"${absFile_b}\")\n            file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n            list(APPEND gsettings_list_h \"${relFile_h}\")\n            list(APPEND gsettings_list_h_abs \"${absFile_b}.h\")\n            add_custom_command(\n              OUTPUT\n                \"${absFile_b}\"\n              COMMAND\n                \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n              DEPENDS\n                \"${absFile}\"\n              VERBATIM\n            )\n          endforeach()\n        else()\n          file(RELATIVE_PATH relFile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND gsettings_list \"${relFile}\")\n          list(APPEND gsettings_list_abs \"${globexpr}\")\n\n          file(RELATIVE_PATH relFile_b \"${PROJECT_SOURCE_DIR}\" \"${globexpr}\")\n          list(APPEND gsettings_list_b \"${relFile_b}\")\n          get_filename_component(absFile_b \"${PROJECT_BINARY_DIR}/${relFile_b}\" ABSOLUTE)\n          list(APPEND gsettings_list_b_abs \"${absFile_b}\")\n          file(RELATIVE_PATH relFile_h \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${absFile_b}.h\")\n          list(APPEND gsettings_list_h \"${relFile_h}\")\n          list(APPEND gsettings_list_h_abs \"${absFile_b}.h\")\n          add_custom_command(\n            OUTPUT\n              \"${absFile_b}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${relFile}\" \"${absFile_b}\"\n            VERBATIM\n          )\n        endif()\n      endforeach()\n\n\n      if(ARGS_SRCFILES)\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${xgettext_vala_options} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\" ${src_list}\n          COMMAND\n            # Make sure file exists even if no translatable strings available.\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          DEPENDS\n            ${src_list_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n      )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          VERBATIM\n        )\n      endif()\n      if(ARGS_GLADEFILES)\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${xgettext_glade_options} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\" ${glade_list}\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          DEPENDS\n            ${glade_list_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n        )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          VERBATIM\n        )\n      endif()\n      if(ARGS_DESKTOPFILES)\n        add_custom_command(\n          OUTPUT\n            ${desktop_list_h_abs}\n          COMMAND\n            \"${INTLTOOL_EXTRACT_EXECUTABLE}\" ${INTLTOOL_OPTIONS_DEFAULT} \"--type\" \"gettext/ini\" ${desktop_list_b}\n          DEPENDS\n            ${desktop_list_b_abs}\n          WORKING_DIRECTORY\n            \"${PROJECT_BINARY_DIR}\"\n          VERBATIM\n        )\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${XGETTEXT_INTLTOOL_OPTIONS} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\" ${desktop_list_h}\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          DEPENDS\n            ${desktop_list_h_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n        )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          VERBATIM\n        )\n      endif()\n      if(ARGS_GSETTINGSFILES)\n        add_custom_command(\n          OUTPUT\n            ${gsettings_list_h_abs}\n          COMMAND\n            \"${INTLTOOL_EXTRACT_EXECUTABLE}\" ${INTLTOOL_OPTIONS_DEFAULT} \"--type\" \"gettext/gsettings\" ${gsettings_list_b}\n          DEPENDS\n            ${gsettings_list_b_abs}\n          WORKING_DIRECTORY\n            \"${PROJECT_BINARY_DIR}\"\n          VERBATIM\n        )\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          COMMAND\n            \"${XGETTEXT_EXECUTABLE}\" ${xgettext_options} ${XGETTEXT_INTLTOOL_OPTIONS} \"-o\" \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\" ${gsettings_list_h}\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          DEPENDS\n            ${gsettings_list_h_abs}\n          WORKING_DIRECTORY\n            \"${CMAKE_CURRENT_SOURCE_DIR}\"\n          VERBATIM\n        )\n      else()\n        add_custom_command(\n          OUTPUT\n            \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E touch \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n          VERBATIM\n        )\n      endif()\n\n      add_custom_target(pot\n        COMMAND\n          \"${GETTEXT_MSGCAT_EXECUTABLE}\" \"-o\" \"${potfile}\" \"--use-first\" \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\" \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\" \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\" \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n        DEPENDS\n          \"${CMAKE_CURRENT_BINARY_DIR}/_source.pot\"\n          \"${CMAKE_CURRENT_BINARY_DIR}/_glade.pot\"\n          \"${CMAKE_CURRENT_BINARY_DIR}/_desktop.pot\"\n          \"${CMAKE_CURRENT_BINARY_DIR}/_gsettings.pot\"\n        WORKING_DIRECTORY\n          \"${CMAKE_CURRENT_SOURCE_DIR}\"\n        COMMENT\n          \"Extract translatable messages to ${potfile}\"\n        VERBATIM\n      )\n    endif()\n  endmacro()\n\n\n  function(gettext_create_translations potfile)\n    cmake_parse_arguments(ARGS \"ALL;NOUPDATE;DESKTOPFILES_INSTALL\"\n        \"PODIR;LOCALEDIR\" \"LANGUAGES;POFILES\" ${ARGN})\n\n    get_filename_component(_potBasename \"${potfile}\" NAME_WE)\n    get_filename_component(_absPotFile \"${potfile}\" ABSOLUTE)\n\n    if(ARGS_ALL)\n      set(make_all \"ALL\")\n    else()\n      set(make_all)\n    endif()\n\n    if(ARGS_LOCALEDIR)\n      set(_localedir \"${ARGS_LOCALEDIR}\")\n    elseif(localedir)\n      set(_localedir \"${localedir}\")\n    else()\n      set(_localedir \"share/locale\")\n    endif()\n\n    set(langs)\n    list(APPEND langs ${ARGS_LANGUAGES})\n\n    foreach(globexpr ${ARGS_POFILES})\n      set(tmppofiles)\n      file(GLOB tmppofiles ${globexpr})\n      if(tmppofiles)\n        foreach(tmppofile ${tmppofiles})\n          string(REGEX REPLACE \".*/([a-zA-Z_]+)(\\\\.po)?$\" \"\\\\1\" lang \"${tmppofile}\")\n          list(APPEND langs \"${lang}\")\n        endforeach()\n      else()\n          string(REGEX REPLACE \".*/([a-zA-Z_]+)(\\\\.po)?$\" \"\\\\1\" lang \"${globexpr}\")\n          list(APPEND langs \"${lang}\")\n      endif()\n    endforeach()\n\n    if(NOT langs AND NOT ARGS_PODIR)\n      set(ARGS_PODIR \"${CMAKE_CURRENT_SOURCE_DIR}\")\n    endif()\n    if(ARGS_PODIR)\n      file(GLOB pofiles \"${ARGS_PODIR}/*.po\")\n      foreach(pofile ${pofiles})\n        string(REGEX REPLACE \".*/([a-zA-Z_]+)\\\\.po$\" \"\\\\1\" lang \"${pofile}\")\n        list(APPEND langs \"${lang}\")\n      endforeach()\n    endif()\n\n    if(langs)\n      list(REMOVE_DUPLICATES langs)\n    endif()\n\n\n    set(_gmoFile)\n    set(_gmoFiles)\n    foreach (lang ${langs})\n      get_filename_component(_absFile \"${lang}.po\" ABSOLUTE)\n      set(_gmoFile \"${CMAKE_CURRENT_BINARY_DIR}/${lang}.gmo\")\n\n      if(ARGS_NOUPDATE)\n        set(_absFile_new \"${CMAKE_CURRENT_BINARY_DIR}/${lang}.po\")\n        add_custom_command(\n          OUTPUT\n            \"${_absFile_new}\"\n          COMMAND\n            \"${CMAKE_COMMAND}\" -E copy \"${_absFile}\" \"${_absFile_new}\"\n          DEPENDS\n            \"${_absPotFile}\"\n            \"${_absFile}\"\n          VERBATIM\n        )\n        set(_absFile \"${_absFile_new}\")\n      endif()\n      add_custom_command(\n        OUTPUT\n          \"${_gmoFile}\"\n        COMMAND\n          \"${GETTEXT_MSGMERGE_EXECUTABLE}\" \"--quiet\" \"--update\" \"--backup=none\" \"-s\" \"${_absFile}\" \"${_absPotFile}\"\n        COMMAND\n          \"${GETTEXT_MSGFMT_EXECUTABLE}\" \"-o\" \"${_gmoFile}\" \"${_absFile}\"\n        DEPENDS\n          \"${_absPotFile}\"\n          \"${_absFile}\"\n        WORKING_DIRECTORY\n          \"${CMAKE_CURRENT_BINARY_DIR}\"\n        VERBATIM\n      )\n\n      install(\n        FILES\n          \"${_gmoFile}\"\n        DESTINATION\n          \"${_localedir}/${lang}/LC_MESSAGES\"\n        RENAME\n          \"${_potBasename}.mo\"\n      )\n      list(APPEND _gmoFiles \"${_gmoFile}\")\n    endforeach()\n\n    set(desktopfiles)\n    if(langs AND _INTLTOOL_DESKTOPFILES)\n      file(RELATIVE_PATH cursrcdir_rel \"${CMAKE_CURRENT_BINARY_DIR}\" \"${CMAKE_CURRENT_SOURCE_DIR}\")\n      if(cursrcdir_rel STREQUAL \"\")\n        set(cursrcdir_rel \".\")\n      endif()\n      foreach(desktopfiletmp ${_INTLTOOL_DESKTOPFILES})\n        string(REGEX REPLACE \"(\\\\.desktop).*$\" \"\\\\1\" desktopfile \"${desktopfiletmp}\")\n        set(desktopfile_abs \"${PROJECT_BINARY_DIR}/${desktopfile}\")\n        list(APPEND desktopfiles \"${desktopfile_abs}\")\n        file(RELATIVE_PATH desktopfile_rel \"${CMAKE_CURRENT_BINARY_DIR}\" \"${desktopfile_abs}\")\n        file(RELATIVE_PATH desktopfiletmp_rel \"${CMAKE_CURRENT_BINARY_DIR}\" \"${PROJECT_BINARY_DIR}/${desktopfiletmp}\")\n        add_custom_command(\n          OUTPUT\n            \"${desktopfile_abs}\"\n          COMMAND\n            \"${INTLTOOL_MERGE_EXECUTABLE}\" ${INTLTOOL_OPTIONS_DEFAULT} \"--desktop-style\" \"${cursrcdir_rel}\" \"${desktopfiletmp_rel}\" \"${desktopfile_rel}\"\n          DEPENDS\n            \"${PROJECT_BINARY_DIR}/${desktopfiletmp}\"\n          VERBATIM\n        )\n        if(ARGS_DESKTOPFILES_INSTALL AND NOT cursrcdir_rel STREQUAL \".\")\n          add_custom_command(\n            OUTPUT\n              \"${CMAKE_SOURCE_DIR}/${desktopfile}\"\n              \"desktopinstall.stamp\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E copy_if_different \"${desktopfile_abs}\" \"${CMAKE_SOURCE_DIR}/${desktopfile}\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E touch \"desktopinstall.stamp\"\n            DEPENDS\n              \"${desktopfile_abs}\"\n            VERBATIM\n          )\n        else()\n          add_custom_command(\n            OUTPUT\n              \"desktopinstall.stamp\"\n            COMMAND\n              \"${CMAKE_COMMAND}\" -E touch \"desktopinstall.stamp\"\n            DEPENDS\n              \"${desktopfile_abs}\"\n            VERBATIM\n          )\n        endif()\n        list(APPEND desktopfiles \"desktopinstall.stamp\")\n        install(\n          FILES\n            \"${desktopfile_abs}\"\n          DESTINATION\n            \"share/applications\"\n        )\n      endforeach()\n    endif()\n\n    add_custom_target(translations\n      \"${make_all}\"\n      DEPENDS\n        ${_gmoFiles}\n        ${desktopfiles}\n      COMMENT\n        \"Build translations.\"\n    )\n  endfunction()\nendif()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/GlibCompileSchema.cmake.in",
    "content": "#\n# cmake/GlibCompileSchema.cmake\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\nfind_program(GLIBCOMPILESCHEMA \"glib-compile-schemas\")\nif(GLIBCOMPILESCHEMA)\n  execute_process(\n    COMMAND\n      \"${GLIBCOMPILESCHEMA}\" @GSETTINGSDIR@\n  )\nendif()\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/GlibCompileSchema_verify.cmake.in",
    "content": "#\n# cmake/GlibCompileSchema.cmake.in\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\nexecute_process(\n  COMMAND\n    \"${GLIBCOMPILESCHEMA}\" \"--dry-run\" \"--schema-file=${GLIB_SCHEMAFILE}\"\n  ERROR_VARIABLE\n    stderr\n  OUTPUT_VARIABLE\n    stderr\n  OUTPUT_STRIP_TRAILING_WHITESPACE\n  ERROR_STRIP_TRAILING_WHITESPACE\n)\nif(NOT \"${stderr}\" STREQUAL \"\")\n  message(FATAL_ERROR \"Schema validation error: ${stderr}\")\nendif()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/SimpleUninstall.cmake",
    "content": "#\n# cmake/SimpleUninstall.cmake\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n#\n# Slightly modified version from: http://www.cmake.org/Wiki/CMake_FAQ\n#\n\nif(NOT EXISTS \"${CMAKE_BINARY_DIR}/install_manifest.txt\")\n  message(FATAL_ERROR \"Cannot find install manifest: \"\n                      \"\\\"${CMAKE_BINARY_DIR}/install_manifest.txt\\\"\")\nendif()\n\nfile(READ \"${CMAKE_BINARY_DIR}/install_manifest.txt\" files)\nstring(REGEX REPLACE \"\\n\" \";\" files \"${files}\")\n\ncmake_policy(PUSH)\n# Ignore empty list elements. \ncmake_policy(SET CMP0007 OLD)\nlist(REVERSE files)\ncmake_policy(POP)\n\nforeach(file ${files})\n  message(STATUS \"Uninstalling \\\"$ENV{DESTDIR}${file}\\\"\")\n  if(EXISTS \"$ENV{DESTDIR}${file}\")\n    execute_process(\n      COMMAND\n        \"${CMAKE_COMMAND}\" -E remove \"$ENV{DESTDIR}${file}\"\n      OUTPUT_VARIABLE\n        rm_out\n      RESULT_VARIABLE\n        rm_retval\n    )\n    if(NOT ${rm_retval} EQUAL 0)\n      message(FATAL_ERROR \"Problem when removing \\\"$ENV{DESTDIR}${file}\\\"\")\n    endif()\n  else()\n    message(STATUS \"File \\\"$ENV{DESTDIR}${file}\\\" does not exist.\")\n  endif()\nendforeach()\n\nif(NOT \"$ENV{DESTDIR}\" AND POSTREMOVE_HOOK)\n  if (GSETTINGSDIR)\n    set(compile_schema_file \"${CMAKE_BINARY_DIR}/GlibCompileSchema_uninstall.cmake\")\n    if(NOT EXISTS \"${compile_schema_file}\")\n      if(NOT CUSTOM_SOURCE_DIR)\n        set(CUSTOM_SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")\n      endif()\n      configure_file(\n        \"${CUSTOM_SOURCE_DIR}/cmake/GlibCompileSchema.cmake.in\"\n        \"${compile_schema_file}\"\n        @ONLY\n      )\n    endif()\n  endif()\n  execute_process(\n    COMMAND\n    \"${CMAKE_COMMAND}\" -P \"${compile_schema_file}\"\n  )\nendif()"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/vala/FindVala.cmake",
    "content": "#\n# cmake/vala/FindVala.cmake\n#\n##\n# Find module for the Vala compiler (valac)\n#\n# This module determines whether a Vala compiler is installed on the current\n# system and where its executable is.\n#\n# Call the module using \"find_package(Vala) from within your CMakeLists.txt.\n#\n# The following variables will be set after an invocation:\n#\n#  VALA_FOUND       Whether the vala compiler has been found or not\n#  VALA_EXECUTABLE  Full path to the valac executable if it has been found\n#  VALA_VERSION     Version number of the available valac\n#\n#  VALA_SHORTVER    Short version of valac (major.minor). Round up development\n#                   versions. E.g. 0.19.1 -> 0.20, 0.20.1 -> 0.20\n#  VALA_LIBPKG      Name of libvala library (libvala-${VALA_SHORTVER}).\n#  VALA_VAPIDIR     Vapi directory path.\n#  VALA_DATADIR     Path to libvala data directory. E.g. /usr/share/libvala-0.20\n#  VALA_VAPIGEN     Path to vapigen executable.\n#  VALA_GEN_INTROSPECT  Path to version specific gen-introspect executable.\n#  VALA_VALA_GEN_INTROSPECT  Path to version independent gen-introspect\n#                   executable.\n#\n##\n\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# Copyright 2009-2010 Jakob Westhoff. All rights reserved.\n# Copyright 2010-2011 Daniel Pfeifer\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n#    1. Redistributions of source code must retain the above copyright notice,\n#       this list of conditions and the following disclaimer.\n#\n#    2. Redistributions in binary form must reproduce the above copyright notice,\n#       this list of conditions and the following disclaimer in the documentation\n#       and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR\n# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# The views and conclusions contained in the software and documentation are those\n# of the authors and should not be interpreted as representing official policies,\n# either expressed or implied, of Jakob Westhoff\n##\n\n# Search for the valac executable in the usual system paths.\nfind_program(VALA_EXECUTABLE NAMES \"valac\" \"valac-0.26\" \"valac-0.24\" \"valac-0.22\" \"valac-0.20\")\nmark_as_advanced(VALA_EXECUTABLE)\n\n# Determine the valac version\nif(VALA_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${VALA_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      VALA_VERSION\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  string(REPLACE \"Vala \" \"\" VALA_VERSION \"${VALA_VERSION}\")\n  string(REPLACE \".\" \";\" VALA_LIST \"${VALA_VERSION}\")\n  list(GET VALA_LIST 0 maj_ver)\n  list(GET VALA_LIST 1 min_ver)\n  list(GET VALA_LIST 2 rev_ver)\n  math(EXPR is_odd \"${min_ver} % 2\")\n  list(LENGTH VALA_LIST len)\n  if((${is_odd} EQUAL 1))\n    math(EXPR min_ver \"${min_ver} + 1\")\n  elseif(len GREATER 3)\n\tmath(EXPR min_ver \"${min_ver} + 2\")\n  endif()\n  set(VALA_SHORTVER \"${maj_ver}.${min_ver}\" CACHE INTERNAL \"\")\n  if(NOT \"${maj_ver}\" STREQUAL \"\" AND NOT \"${min_ver}\" STREQUAL \"\")\n    set(VALA_LIBPKG \"libvala-${VALA_SHORTVER}\" CACHE INTERNAL \"\")\n\n    find_package(PkgConfig)\n    pkg_check_modules(\"VALA\" REQUIRED \"${VALA_LIBPKG}\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" VAPIDIR \"\" \"--variable=vapidir\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" DATADIR \"\" \"--variable=datadir\")\n    set(VALA_DATADIR \"${VALA_DATADIR}/vala\" CACHE INTERNAL \"\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" VAPIGEN \"\" \"--variable=vapigen\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" GEN_INTROSPECT \"\" \"--variable=gen_introspect\")\n    _pkgconfig_invoke(\"${VALA_LIBPKG}\" \"VALA\" VALA_GEN_INTROSPECT \"\" \"--variable=vala_gen_introspect\")\n  endif()\nendif()\n\n# Handle the QUIETLY and REQUIRED arguments, which may be given to the find call.\n# Furthermore set VALA_FOUND to TRUE if Vala has been found (aka.\n# VALA_EXECUTABLE etc. are set)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Vala\n  REQUIRED_VARS\n    VALA_EXECUTABLE\n    VALA_SHORTVER\n    VALA_LIBPKG\n    VALA_VAPIDIR\n    VALA_DATADIR\n    VALA_VAPIGEN\n    VALA_GEN_INTROSPECT\n    VALA_VALA_GEN_INTROSPECT\n  VERSION_VAR\n    VALA_VERSION\n)\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/vala/FindValadoc.cmake",
    "content": "#\n# cmake/vala/FindValadocs.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# Add find_package handler for valadoc.\n##\n\n# Search for the valac executable in the usual system paths.\nfind_program(VALADOC_EXECUTABLE \"valadoc\")\nmark_as_advanced(VALADOC_EXECUTABLE)\n\n# Determine the valadoc version\nif(VALADOC_EXECUTABLE)\n  execute_process(\n    COMMAND\n      \"${VALADOC_EXECUTABLE}\" \"--version\"\n    OUTPUT_VARIABLE\n      VALADOC_VERSION\n    OUTPUT_STRIP_TRAILING_WHITESPACE\n  )\n  string(REPLACE \"Valadoc \" \"\" VALADOC_VERSION \"${VALADOC_VERSION}\")\nendif()\n\n# Add find_package handler for valadoc.\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(Valadoc\n  REQUIRED_VARS\n    VALADOC_EXECUTABLE\n  VERSION_VAR\n    VALADOC_VERSION\n)\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/vala/UseVala.cmake",
    "content": "#\n# cmake/vala/UseVala.cmake\n#\n##\n# Compile vala files to their c equivalents for further processing.\n#\n# The \"vala_precompile\" function takes care of calling the valac executable on\n# the given source to produce c files which can then be processed further using\n# default cmake functions.\n#\n# The first parameter provided is a variable, which will be filled with a list\n# of C files outputted by the vala compiler. This list can than be used in\n# conjunction with functions like \"add_executable\" or others to create the\n# necessary compile rules with CMake.\n#\n# The following sections may be specified afterwards to provide certain options\n# to the vala compiler:\n#\n# SOURCES\n#   A list of .vala files to be compiled. Please take care to add every vala\n#   file belonging to the currently compiled project or library as Vala will\n#   otherwise not be able to resolve all dependencies.\n#\n# PACKAGES\n#   A list of vala packages/libraries to be used during the compile cycle. The\n#   package names are exactly the same, as they would be passed to the valac\n#   \"--pkg=\" option.\n#\n# OPTIONS\n#   A list of optional options to be passed to the valac executable. This can be\n#   used to pass \"--thread\" for example to enable multi-threading support.\n#\n# DEFINITIONS\n#   A list of symbols to be used for conditional compilation. They are the same\n#   as they would be passed using the valac \"--define=\" option.\n#\n# CUSTOM_VAPIS\n#   A list of custom vapi files to be included for compilation. This can be\n#   useful to include freshly created vala libraries without having to install\n#   them in the system.\n#\n# GENERATE_VAPI\n#   Pass all the needed flags to the compiler to create an internal vapi for\n#   the compiled library. The provided name will be used for this and a\n#   <provided_name>.vapi file will be created.\n#\n# GENERATE_GIR\n#   Create a GObject-Introspection repository file. Name it\n#   \"<provided_name>.gir\". Library name is set to generated vapi name without\n#   file extension suffix or if no vapi is to be generated guess from gir\n#   name.\n#\n# GENERATE_HEADER\n#   Let the compiler generate a header file for the compiled code. There will\n#   be a header file as well as an internal header file being generated called\n#   <provided_name>.h and <provided_name>_internal.h\n#\n# PUBLIC\n#   When enabled generate only public parts of vapis/headers.\n#\n# The following call is a simple example to the vala_precompile macro showing\n# an example to every of the optional sections:\n#\n#   find_package(Vala \"0.12\" REQUIRED)\n#   include(${VALA_USE_FILE})\n#\n#   vala_precompile(VALA_C\n#     SOURCES\n#       source1.vala\n#       source2.vala\n#       source3.vala\n#     PACKAGES\n#       gtk+-2.0\n#       gio-1.0\n#       posix\n#     DIRECTORY\n#       gen\n#     OPTIONS\n#       --thread\n#     CUSTOM_VAPIS\n#       some_vapi.vapi\n#     GENERATE_VAPI\n#       myvapi\n#     GENERATE_GIR\n#       MyLib-1.0\n#     GENERATE_HEADER\n#       myheader\n#     )\n#\n# Most important is the variable VALA_C which will contain all the generated c\n# file names after the call.\n##\n\n##\n# Copyright 2009-2010 Jakob Westhoff. All rights reserved.\n# Copyright 2010-2011 Daniel Pfeifer\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n#    1. Redistributions of source code must retain the above copyright notice,\n#       this list of conditions and the following disclaimer.\n#\n#    2. Redistributions in binary form must reproduce the above copyright notice,\n#       this list of conditions and the following disclaimer in the documentation\n#       and/or other materials provided with the distribution.\n#\n# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR\n# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# The views and conclusions contained in the software and documentation are those\n# of the authors and should not be interpreted as representing official policies,\n# either expressed or implied, of Jakob Westhoff\n##\n\ninclude(CMakeParseArguments)\n\nfunction(vala_precompile output)\n  cmake_parse_arguments(ARGS \"PUBLIC\" \"DIRECTORY;GENERATE_HEADER;GENERATE_VAPI;GENERATE_GIR\"\n      \"SOURCES;PACKAGES;OPTIONS;DEFINITIONS;CUSTOM_VAPIS\" ${ARGN})\n\n  if(ARGS_DIRECTORY)\n    get_filename_component(DIRECTORY \"${ARGS_DIRECTORY}\" ABSOLUTE)\n  else()\n    set(DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\")\n  endif()\n  include_directories(\"${DIRECTORY}\")\n\n  set(vala_pkg_opts)\n  foreach(pkg ${ARGS_PACKAGES})\n    list(APPEND vala_pkg_opts \"--pkg=${pkg}\")\n  endforeach()\n\n  set(vala_define_opts)\n  foreach(def ${ARGS_DEFINITIONS})\n    list(APPEND vala_define_opts \"--define=${def}\")\n  endforeach()\n\n  set(in_files)\n  set(out_files)\n  set(out_files_rel)\n  foreach(src ${ARGS_SOURCES} ${ARGS_UNPARSED_ARGUMENTS})\n    list(APPEND in_files \"${CMAKE_CURRENT_SOURCE_DIR}/${src}\")\n    string(REPLACE \".vala\" \".c\" src \"${src}\")\n    string(REPLACE \".gs\" \".c\" src \"${src}\")\n    set(out_file \"${DIRECTORY}/${src}\")\n    list(APPEND out_files \"${DIRECTORY}/${src}\")\n    set(out_files_rel \"${out_files_rel}, ${src}\")\n  endforeach()\n  string(REGEX REPLACE \"^, \" \"\" out_files_rel \"${out_files_rel}\")\n\n  set(custom_vapi_arguments)\n  if(ARGS_CUSTOM_VAPIS)\n    foreach(vapi ${ARGS_CUSTOM_VAPIS})\n      if(\"${vapi}\" MATCHES \"${CMAKE_SOURCE_DIR}\" OR \"${vapi}\" MATCHES \"${CMAKE_BINARY_DIR}\")\n        list(APPEND custom_vapi_arguments \"${vapi}\")\n      else()\n        list(APPEND custom_vapi_arguments \"${CMAKE_CURRENT_SOURCE_DIR}/${vapi}\")\n      endif()\n    endforeach()\n  endif()\n\n  set(vapi_arguments)\n  set(gir_arguments)\n  if(ARGS_GENERATE_VAPI)\n    list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi\")\n    set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_VAPI}.vapi\")\n    if(ARGS_PUBLIC)\n      set(vapi_arguments \"--library=${ARGS_GENERATE_VAPI}\")\n    else()\n      set(vapi_arguments \"--internal-vapi=${ARGS_GENERATE_VAPI}.vapi\")\n    endif()\n\n    # Header and internal header is needed to generate internal vapi\n    if(NOT ARGS_PUBLIC AND NOT ARGS_GENERATE_HEADER)\n      set(ARGS_GENERATE_HEADER \"${ARGS_GENERATE_VAPI}\")\n    endif()\n  endif()\n\n  if(ARGS_GENERATE_GIR)\n    list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_GIR}.gir\")\n    set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_GIR}.gir\")\n    list(APPEND gir_arguments \"--gir=${ARGS_GENERATE_GIR}.gir\")\n    if(NOT ARGS_PUBLIC OR NOT ARGS_GENERATE_VAPI)\n      set(tmplibname)\n      string(REGEX MATCH \"^[^-]*\" tmplibname \"${ARGS_GENERATE_GIR}\")\n      set(libname)\n      string(TOLOWER \"${tmplibname}\" libname)\n      list(APPEND gir_arguments \"--library=${libname}\")\n    endif()\n  endif()\n\n  set(header_arguments)\n  if(ARGS_GENERATE_HEADER)\n    list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_HEADER}.h\")\n    set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_HEADER}.h\")\n    list(APPEND header_arguments \"--header=${DIRECTORY}/${ARGS_GENERATE_HEADER}.h\")\n    if(NOT ARGS_PUBLIC)\n      list(APPEND out_files \"${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h\")\n      set(out_files_rel \"${out_files_rel}, ${ARGS_GENERATE_HEADER}_internal.h\")\n      list(APPEND header_arguments \"--internal-header=${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h\")\n    endif()\n  endif()\n\n  add_custom_command(\n    OUTPUT\n      \"vala.stamp\"\n    COMMAND\n      \"${VALA_EXECUTABLE}\"\n        \"-C\"\n        ${header_arguments}\n        ${vapi_arguments}\n        ${gir_arguments}\n        \"-b\" \"${CMAKE_CURRENT_SOURCE_DIR}\"\n        \"-d\" \"${DIRECTORY}\"\n        ${vala_pkg_opts}\n        ${vala_define_opts}\n        ${ARGS_OPTIONS}\n        ${in_files}\n        ${custom_vapi_arguments}\n    COMMAND\n      \"${CMAKE_COMMAND}\" -E touch \"vala.stamp\"\n    DEPENDS\n      ${in_files}\n      ${ARGS_CUSTOM_VAPIS}\n    COMMENT \"Generating ${out_files_rel}\"\n    VERBATIM\n  )\n  add_custom_command(\n    OUTPUT\n      ${out_files}\n    DEPENDS\n      \"vala.stamp\"\n    COMMENT \"\"\n  )\n  set(${output} ${out_files} PARENT_SCOPE)\nendfunction()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/vala/ValaDocs.cmake",
    "content": "#\n# cmake/vala/ValaDocs.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# The valadoc_gen function generates Vala documentation from .vala and .vapi\n# source files. The first parameter is the project name.\n# Provide target 'docs' to build documentation.\n#\n# Supported sections:\n#\n# ALL (optional)\n#   Include this target in all builds.\n#\n# INSTALLDIR (optional)\n#   Directory where to install documentation to.\n#   Default: ${datadir}\n#   If ${datadir} not defined: share/${package_name_lower}\n#                 (where ${package_name_lower} is ${package_name} with letters)\n#   If ${package_name} is not defined raise error.\n#\n# DOCDIR (optional)\n#   Directory where to build documentation to.\n#   Default: ${CMAKE_CURRENT_BINARY_DIR}/docs\n#\n# PACKAGES (in general mandatory)\n#   List of all Vala packages the project depends on.\n#\n# DEFINITIONS (optional)\n#   A list of symbols for conditional compilation.\n#\n# SRCFILES\n#   List of all project files. Globbing is supported.\n#\n# OPTIONS (optional)\n#   List of additional valadoc options.\n\nif(VALADOC_FOUND)\n  function(valadoc_gen package_name)\n    cmake_parse_arguments(ARGS \"ALL\" \"INSTALLDIR;DOCDIR\" \"PACKAGES;DEFINITIONS;SRCFILES;OPTIONS\" ${ARGN})\n\n    if(ARGS_SRCFILES)\n      if(ARGS_ALL)\n        set(make_all \"ALL\")\n      else()\n        set(make_all)\n      endif()\n\n      string(TOLOWER \"${package_name}\" package_name_lower)\n      if(ARGS_INSTALLDIR)\n        set(installdir \"${ARGS_DOCDIR}\")\n      elseif(datadir)\n        set(installdir \"${datadir}\")\n      elseif(package_name)\n        set(installdir \"share/${package_name_lower}\")\n      else()\n        message(SEND_ERROR \"No installation directory given.\")\n      endif()\n\n      if(ARGS_DOCDIR)\n        set(docdir \"${ARGS_DOCDIR}\")\n      else()\n        set(docdir \"${CMAKE_CURRENT_BINARY_DIR}/docs\")\n      endif()\n\n      set(srcfiles)\n      set(srcfiles_abs)\n      foreach(globexpr ${ARGS_SRCFILES})\n        file(GLOB tmpsrcfiles ${globexpr})\n        if(tmpsrcfiles)\n          foreach(tmpsrcfile ${tmpsrcfiles})\n            file(RELATIVE_PATH srcfile \"${CMAKE_CURRENT_BINARY_DIR}\" \"${tmpsrcfile}\")\n            list(APPEND srcfiles \"${srcfile}\")\n            get_filename_component(srcfile_abs \"${tmpsrcfile}\" ABSOLUTE)\n            list(APPEND srcfiles_abs \"${srcfile_abs}\")\n          endforeach()\n        else()\n          file(RELATIVE_PATH srcfile \"${CMAKE_CURRENT_BINARY_DIR}\" \"${globexpr}\")\n          list(APPEND srcfiles \"${srcfile}\")\n          get_filename_component(srcfile_abs \"${globexpr}\" ABSOLUTE)\n          list(APPEND srcfiles_abs \"${srcfile_abs}\")\n        endif()\n      endforeach()\n\n      set(pkg_opts)\n      foreach(pkg ${ARGS_PACKAGES})\n        list(APPEND pkg_opts \"--pkg=${pkg}\")\n      endforeach()\n\n      set(valadoc_options\n          \"-o\" \"${docdir}\"\n          \"--package-name\" \"${package_name}\"\n      )\n      foreach(def ${ARGS_DEFINITIONS})\n        list(APPEND valadoc_options \"--define=${def}\")\n      endforeach()\n      if(ARGS_OPTIONS)\n        list(APPEND valadoc_options ${ARGS_OPTIONS})\n      endif()\n\n      add_custom_command(\n        OUTPUT\n          \"${docdir}/index.html\"\n        COMMAND\n          \"${CMAKE_COMMAND}\" -E remove_directory \"${docdir}\"\n        COMMAND\n          \"${VALADOC_EXECUTABLE}\" ${srcfiles} ${pkg_opts} ${valadoc_options}\n        DEPENDS\n          ${srcfiles_abs}\n        VERBATIM\n      )\n\n      add_custom_target(\"docs-${package_name_lower}\"\n        ${make_all}\n        DEPENDS\n          \"${docdir}/index.html\"\n        COMMENT\n          \"Generating documentation with valadoc.\"\n      )\n\n      install(\n        DIRECTORY\n          \"${docdir}\"\n        DESTINATION\n          \"${installdir}\"\n        OPTIONAL\n      )\n    endif()\n  endfunction()\nendif()\n"
  },
  {
    "path": "data/buildsystems/cmake/buildsystem/cmake/vala/ValaPkgs.cmake",
    "content": "#\n# cmake/vala/ValaPkgs.cmake\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n##\n# The vala_pkgs function is a wrapper to perform pkg-config check,\n# automatically set compiler and linker flags and call the actual\n# vala_precompile function.\n#\n# Supported sections:\n#\n# PACKAGES\n#   A list of vala packages that are required to build the target. Versioned\n#   dependencies are supported. There is also a possibility to suppress\n#   checking with pkg-config or to suppress --cflags and --libs of pkg-config.\n#   To use those options append {option,option,...}.\n#\n# DEFINITIONS\n#   A list of symbols for conditional compilation. (optional)\n#\n# OPTIONAL\n#   A list of vala packages that are optional to build the target. (optional)\n#\n# SRCFILES\n#   A list of Vala source files. Globbing is supported.\n#\n# VAPIS\n#   A list of custom .vapi files. Globbing is supported. (optional)\n#\n# LIBRARY\n#   Name of library to generate.\n#\n# GIRFILE\n#   Generate GObject-Introspection repository file.\n#\n# OPTIONS\n#   A list of options passed to the valac compiler. (optional)\n#\n#\n# The following call is a simple example:\n#\n#   SET(packages \"foo >= 1.4.2\" \"bla <= 9\")\n#   vala_pkgs(VALA_C\n#     PACKAGES\n#       \"gtk+-3.0 >= 3.8\"\n#       gee-1.0\n#       ${packages}\n#       \"sdl-image {nocheck,nolink}\"\n#       \"sdl\"\n#     OPTIONAL\n#       libxml-2.0\n#     SRCFILES\n#       file.vala\n#       file2.vala\n#       src/file3.vala\n#   )\n#   add_executable(myexecutable ${VALA_C})\n#   target_link_libraries(myexecutable ${PROJECT_LDFLAGS})\n#   add_definitions(${PROJECT_C_FLAGS})\n#\ninclude(CMakeParseArguments)\nfunction(vala_pkgs output)\n  cmake_parse_arguments(ARGS \"\" \"LIBRARY;GIRFILE\" \"PACKAGES;DEFINITIONS;OPTIONAL;SRCFILES;VAPIS;OPTIONS\" ${ARGN})\n\n\n  if(ARGS_PACKAGES OR ARGS_OPTIONAL)\n    find_package(PkgConfig)\n  endif()\n\n  if(ARGS_SRCFILES)\n    include(UseVala)\n\n    # Package list without versions to pass to vala_precompile.\n    set(pkglist)\n\n    set(definitions)\n    set(libraries)\n\n    if(ARGS_PACKAGES)\n      foreach(pkg ${ARGS_PACKAGES})\n        set(matchit)\n        string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nocheck[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n        string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n\n        if(NOT matchit)\n          string(TOUPPER \"${pkgstripped}\" pkgdesctmp)\n          string(REGEX REPLACE \"([A-Z0-9-])[-+]*([0-9.]*)$\" \"\\\\1\\\\2\" pkgdesc \"${pkgdesctmp}\")\n          pkg_check_modules(${pkgdesc} REQUIRED ${pkgstripped})\n          if (${${pkgdesc}_FOUND})\n            set(matchit)\n            string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nolink[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n            if(NOT matchit)\n              string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n              list(APPEND definitions \"${${pkgdesc}_CFLAGS}\")\n              list(APPEND libraries \"${${pkgdesc}_LDFLAGS}\")\n            endif()\n          endif()\n        endif()\n\n        string(STRIP ${pkgstripped} tmppkgname)\n        string(REGEX REPLACE \"[ ].*$\" \"\" pkgname \"${tmppkgname}\")\n        list(APPEND pkglist \"${pkgname}\")\n      endforeach()\n    endif()\n\n    set(optional_pkgs)\n    if(ARGS_OPTIONAL)\n      foreach(pkg ${ARGS_OPTIONAL})\n        set(matchit)\n        string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nocheck[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n        string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n\n        if(NOT matchit)\n          string(TOUPPER \"${pkgstripped}\" pkgdesctmp)\n          string(REGEX REPLACE \"([A-Z0-9-])[-+]*([0-9.]*)$\" \"\\\\1\\\\2\" pkgdesc \"${pkgdesctmp}\")\n          pkg_check_modules(\"${pkgdesc}\" \"${pkgstripped}\")\n          if(${${pkgdesc}_FOUND})\n            set(matchit)\n            string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nolink[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit \"${pkg}\")\n            if(NOT matchit)\n              string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkgstripped \"${pkg}\")\n              list(APPEND definitions \"${${pkgdesc}_CFLAGS}\")\n              list(APPEND libraries \"${${pkgdesc}_LDFLAGS}\")\n            endif()\n          endif()\n        endif()\n\n        string(STRIP \"${pkgstripped}\" tmppkgname)\n        string(REGEX REPLACE \"([^ ]+)\" \"\\\\1\" pkgname \"${tmppkgname}\")\n        list(APPEND pkglist \"${pkgname}\")\n      endforeach()\n    endif()\n\n    pkg_check_modules(GTHREAD REQUIRED \"gthread-2.0\")\n    if(GTHREAD_FOUND)\n      list(APPEND definitions \"${GTHREAD_CFLAGS}\")\n      list(APPEND libraries \"${GTHREAD_LDFLAGS}\")\n    endif()\n\n    set(srcfiles)\n    foreach(globexpr ${ARGS_SRCFILES})\n      set(tmpsrcfiles)\n      file(GLOB tmpsrcfiles ${globexpr})\n      if(tmpsrcfiles)\n        foreach(tmpsrcfile ${tmpsrcfiles})\n          set(srcfile)\n          file(RELATIVE_PATH srcfile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${tmpsrcfile}\")\n            list(APPEND srcfiles \"${srcfile}\")\n        endforeach()\n      else()\n        list(APPEND srcfiles \"${globexpr}\")\n      endif()\n    endforeach()\n\n    set(vapifiles)\n    if(ARGS_VAPIS)\n      foreach(globexpr ${ARGS_VAPIS})\n        set(tmpvapifiles)\n        file(GLOB tmpvapifiles ${globexpr})\n        if(tmpvapifiles)\n          foreach(tmpvapifile ${tmpvapifiles})\n            set(vapifile)\n            file(RELATIVE_PATH vapifile \"${CMAKE_CURRENT_SOURCE_DIR}\" \"${tmpvapifile}\")\n              list(APPEND vapifiles \"${vapifile}\")\n          endforeach()\n        else()\n          list(APPEND vapifiles \"${globexpr}\")\n        endif()\n      endforeach()\n    endif()\n\n    vala_precompile(VALA_C\n        ${srcfiles}\n      PACKAGES\n        ${pkglist}\n      DEFINITIONS\n        \"${ARGS_DEFINITIONS}\"\n      CUSTOM_VAPIS\n        ${vapifiles}\n      GENERATE_VAPI\n        \"${ARGS_LIBRARY}\"\n      GENERATE_HEADER\n        \"${ARGS_LIBRARY}\"\n      GENERATE_GIR\n        \"${ARGS_GIRFILE}\"\n      OPTIONS\n        ${ARGS_OPTIONS}\n      PUBLIC\n    )\n\n    set(${output} ${VALA_C} PARENT_SCOPE)\n    set(PROJECT_C_FLAGS ${definitions} PARENT_SCOPE)\n    set(PROJECT_LDFLAGS ${libraries} PARENT_SCOPE)\n  endif()\nendfunction()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "data/buildsystems/cmake/cmake.info",
    "content": "<buildsystem version=\"0.1\">\n    <author>\n        <name>Dominique Lasserre</name>\n        <mail>lasserre.d@gmail.com</mail>\n    </author>\n    <name>\n        <en>CMake</en>\n    </name>\n    <description>\n        <en>CMake buildsystem.</en>\n    </description>\n</buildsystem>\n"
  },
  {
    "path": "data/layout.xml",
    "content": "<?xml version=\"1.0\"?>\n<dock-layout>\n  <layout name=\"__default__\">\n    <dock name=\"__dock_1\" floating=\"no\" width=\"-1\" height=\"-1\" floatx=\"0\" floaty=\"0\" skip-taskbar=\"yes\">\n      <paned orientation=\"horizontal\" locked=\"no\" iconified=\"no\" closed=\"no\" position=\"333\">\n        <paned orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\" position=\"573\">\n          <item name=\"ProjectBrowser\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n          <item name=\"ReportWrapper\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n        </paned>\n        <paned orientation=\"horizontal\" locked=\"no\" iconified=\"no\" closed=\"no\" position=\"1363\">\n          <paned orientation=\"horizontal\" locked=\"no\" iconified=\"no\" closed=\"no\" position=\"1170\">\n            <item name=\"SourceView\" orientation=\"vertical\" locked=\"yes\" iconified=\"no\" closed=\"no\"/>\n            <paned orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\" position=\"408\">\n              <item name=\"CurrentFileStructure\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n              <notebook orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\" page=\"1\">\n                <item name=\"BuildOutput\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n                <item name=\"AppOutput\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n                <item name=\"Breakpoints\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n                <item name=\"Search\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n                <item name=\"StyleChecker\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"no\"/>\n              </notebook>\n            </paned>\n          </paned>\n          <item name=\"SymbolBrowser\" orientation=\"vertical\" locked=\"no\" iconified=\"yes\" closed=\"yes\"/>\n        </paned>\n      </paned>\n    </dock>\n    <dock floating=\"yes\" width=\"1200\" height=\"640\" floatx=\"65\" floaty=\"50\" skip-taskbar=\"no\">\n      <item name=\"ValadocBrowser\" orientation=\"vertical\" locked=\"no\" iconified=\"no\" closed=\"yes\"/>\n    </dock>\n  </layout>\n</dock-layout>\n"
  },
  {
    "path": "data/org.valama.gschema.xml",
    "content": "<schemalist>\n  <schema id=\"org.valama\" path=\"/org/valama/\" gettext-domain=\"valama\">\n\n    <key name=\"window-size-x\" type=\"i\">\n      <default>950</default>\n      <summary>Horizontal window size</summary>\n      <description>\n      </description>\n    </key>\n\n    <key name=\"window-size-y\" type=\"i\">\n      <default>700</default>\n      <summary>Vertical window size</summary>\n      <description>\n      </description>\n    </key>\n\n  </schema>\n</schemalist>\n"
  },
  {
    "path": "data/templates/clutter/clutter.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Linus Seelinger</name>\n        <mail>S.Linus@quantentunnel.de</mail>\n    </author>\n    <name>\n        <en>Clutter</en>\n        <de>Clutter</de>\n        <fr>Clutter</fr>\n    </name>\n    <description>\n        <en>Simple Clutter animation example</en>\n        <de>Einfaches Clutter-Animationsbeispiel</de>\n        <fr>Exemple simple d'animation Clutter</fr>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/clutter/template/src/main.vala",
    "content": "using GLib;\nusing Clutter;\n\nstatic Stage stage;\nstatic Rectangle r;\n\nstatic void main (string[] args) {\n    Clutter.init (ref args);\n\n    stage = new Stage();\n\n    r = new Rectangle();\n    r.width = 100;\n    r.height = 100;\n    r.color = Color.from_string (\"Green\");\n    r.reactive = true;\n    r.button_press_event.connect (() => {\n        animate_it();\n        return false;\n    });\n\n    stage.add_child (r);\n    stage.show();\n\n    animate_it();\n\n    Clutter.main();\n}\n\nstatic void animate_it() {\n    r.x = 0;\n    r.y = 0;\n    r.animate (AnimationMode.EASE_OUT_BOUNCE, 3000,\n               x: stage.width - r.width,\n               y: stage.height - r.height,\n               rotation_angle_z: r.rotation_angle_z + 90);\n}\n"
  },
  {
    "path": "data/templates/clutter/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem>cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"clutter-1.0\"/>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/main.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/clutter/template/vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "data/templates/elementary/elementary.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Marcec Mario</name>\n        <mail>mario.marce42@googlmail.com</mail>\n    </author>\n    <name>\n        <en>Simple elemantary GTK</en>\n    </name>\n    <description>\n        <en>Simple elemantary GTK+ 3 project</en>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/elementary/template/data/hello.desktop",
    "content": "\n[Desktop Entry]\nVersion=0.1\nType=Application\nName=Hello\n_GenericName=Helo_test\n_Comment=TEST\nCategories=GTK;Office;\nExec=hello\nIcon=hello\nTerminal=false\nName[de_DE]=hello\n"
  },
  {
    "path": "data/templates/elementary/template/src/main.vala",
    "content": "using Gtk;\n\nnamespace Hello{\npublic class Hello : Granite.Application{\n\n\tpublic Window main_window;\n\t        private Gtk.Toolbar toolbar;\n        private Gtk.Box content;\n\n\tconstruct{\n\t// the name of your program\n\tprogram_name = \"Hello\"; \n\t// the name of the executable, usually the name in lower case\n\texec_name = \"Hello\";\n\n\t\n\tapp_years = \"2014\";\n\t/* the icon for your app. you normally ship it with your project \n\tin the data directory and copy it to the icon directory.\n\tYou don't include file endings here\n\t(you can also use one of the default icons as I'm doing here)\n\t*/ \n\tapp_icon = \"hello.png\";\n\t// the .desktop file for your app, also in data directory\n\tapp_launcher = \"hello.desktop\";\n\t// an unique id which will identify your application\n\tapplication_id = \"org.elementary.hello\";  \n\t\n\t// those urls will be shown in the automatically\n\t// generated about dialog\n\tmain_url = \"https://github.com/august0815/valama\";\n\tbug_url = \"\";\n\thelp_url = \"https://github.com/august0815/valama/issues/new\";\n\ttranslate_url = \"https://github.com/august0815/valama/issues/new\";\n\t\n\t// here you can proudly list your own name and the names of \n\t// those who helped you\n\tabout_authors = {\"\"};\n\tabout_documenters = {\"Mario Marcec <mariomarce42@googlmail.com>\"};\n\t// if you got an icon or a nice mockup from someone\n\t// you can list him here\n\tabout_artists = {\"Mario Marcec\"};  \n\t// a short comment on the app\n\tabout_comments = \"A simple Hello to you\"; \n\tabout_translators = \"NOBODY YET\";\n\t// this should be one of :\n\t// http://unstable.valadoc.org/#!api=gtk+-3.0/Gtk.License; \n\t// For elementary GPL3 is the default one, \n\t// it’s a good idea to use it\n\t about_license_type = License.GPL_3_0; \n\t\t}\n\n\tpublic Hello (){\n\t\tGtk.Settings.get_default ().gtk_application_prefer_dark_theme = true;\n\t\t}\n\n\tpublic override void activate (){\n\t\tif (this.main_window == null)\n\t\tbuild_and_run ();\n\t\t}\n\n\tpublic void build_and_run (){\n\t\tthis.main_window = new Window ();\n\t\tthis.main_window.set_default_size (320, 75);\n\t\tthis.main_window.set_application (this);\n\t\tthis.main_window.window_position = WindowPosition.CENTER;\n\t\tGtk.Box container = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);\n\n\t\t\tthis.toolbar = new Gtk.Toolbar();\n\t\t\tvar menu = new Gtk.Menu();\n\t\t\tvar appmenu = this.create_appmenu (menu);\n\t\t\tthis.toolbar.add(appmenu);\n\t\t\tcontainer.add(this.toolbar);\n\n\t\tvar button = new Button.with_label (\"Click me!\");\n\t\tbutton.clicked.connect (() => {\n\t\t\tbutton.label = \"Thank you\";\n\t\t});\n\t\t\n\t\tthis.content = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);\n\t\tcontainer.add(content);\n\t\tcontainer.add(button);\n\t\tthis.main_window.add(container);\n\t\tthis.main_window.show_all ();\n\t\t}\n\n\t}\n\n}\n\npublic static int main (string [] args){\n\tGtk.init (ref args);\n\tvar hello = new Hello.Hello ();\n\treturn hello.run (args);\n}\n\n"
  },
  {
    "path": "data/templates/elementary/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem>cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t\t<package name=\"gtk+-3.0\"/>\n\t\t<package name=\"granite\"/>\n\t\t<package name=\"gstreamer-1.0\"/>\n\t</packages>\n\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>data</directory>\n\t\t<directory>data</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/main.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/elementary/template/vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "data/templates/plain_lib/plain_lib.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Yannick Inizan</name>\n        <mail>inizan.yannick@gmail.com</mail>\n    </author>\n    <name>\n        <en>Plain Vala Library</en>\n        <de>Vala-Library-Hello-World</de>>\n        <fr>Bibliothèque Hello World Vala</fr>>\n    </name>\n    <description>\n        <en>Simple Vala library project</en>\n        <de>Einfaches Vala-Library-Projekt.</de>>\n        <fr>Projet bibliothèque Vala simple.</fr>>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/plain_lib/template/src/lib.vala",
    "content": "using GLib;\n\nnamespace MyNS {\n    public class Lib : Object {\n\n        public signal void sample_signal(int a, int b);\n\t\n        public int calc (int a, int b) {\n            sample_signal (a, b);\n            return a + b;\n        }\n    }\n}\n"
  },
  {
    "path": "data/templates/plain_lib/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem library=\"true\">autotools</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t</source-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/lib.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/plain_vala/plain_vala.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Linus Seelinger</name>\n        <mail>S.Linus@quantentunnel.de</mail>\n    </author>\n    <name>\n        <en>Plain vala</en>\n        <de>Vala-Hello-World</de>>\n        <fr>Hello World Vala</fr>>\n    </name>\n    <description>\n        <en>Simple vala project</en>\n        <de>Einfaches Vala-Projekt.</de>>\n        <fr>Projet Vala simple.</fr>>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/plain_vala/template/src/main.vala",
    "content": "using GLib;\n\nstatic void main (string[] args) {\n    stdout.printf (\"Hello world!\\n\");\n}\n"
  },
  {
    "path": "data/templates/plain_vala/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem>cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/main.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/plain_vala/template/vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "data/templates/simple_gst_audio/simple_gst_audio.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Yannick Inizan</name>\n        <mail>inizan.yannick@gmail.com</mail>\n    </author>\n    <name>\n        <en>Simple audio GStreamer</en>\n        <de>Audio-GStreamer Beispiel</de>\n        <fr>Exemple GStreamer audio</fr>\n    </name>\n    <description>\n        <en>Simple GStreamer audio project</en>\n        <de>Einfaches Audio-GStreamer-Projekt</de>\n        <fr>Projet GStreamer audio simple</fr>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/simple_gst_audio/template/src/main.vala",
    "content": "void main (string[] args)\n{\n\tif (args.length < 2)\n\t{\n\t\tprint (\"usage: main file://path/to/file or main http://radio:8080\");\n\t\treturn;\n\t}\n\tGst.init (ref args);\n\tvar loop = new MainLoop();\n\tdynamic Gst.Element playbin = Gst.ElementFactory.make (\"playbin\",\"playbin\");\n\tplaybin.bus.add_watch (0, (bus, message) => {\n\t\tswitch (message.type)\n\t\t{\n\t\t\tcase Gst.MessageType.ERROR:\n\t\t\t\tprint (\"error occured !\");\n\t\t\t\tloop.quit();\n\t\t\tbreak;\n\t\t\tcase Gst.MessageType.EOS:\n\t\t\t\tloop.quit();\n\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t});\n\tplaybin.uri = args[1];\n\tplaybin.set_state (Gst.State.PLAYING);\n\tloop.run();\n}\n"
  },
  {
    "path": "data/templates/simple_gst_audio/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem>cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t\t<package name=\"gstreamer-1.0\"/>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/main.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/simple_gst_audio/template/vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "data/templates/simple_gst_video/simple_gst_video.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Yannick Inizan</name>\n        <mail>inizan.yannick@gmail.com</mail>\n    </author>\n    <name>\n        <en>Simple video GStreamer</en>\n        <de>Video-GStreamer Beispiel</de>\n        <fr>Exemple GStreamer vidéo</fr>\n    </name>\n    <description>\n        <en>Simple GStreamer video project</en>\n        <de>Einfaches Video-GStreamer-Projekt</de>\n        <fr>Projet GStreamer vidéo simple</fr>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/simple_gst_video/template/src/main.vala",
    "content": "using Gst;\nusing Gtk;\n\nstatic void main (string[] args) {\n    if (args.length < 2)\n    {\n\t\t// Note: playbin handle uris, no paths.\n        print (\"usage: test file:///path/to/file\\n\");\n        return;\n    }\n    \n    Gtk.init (ref args);\n    Gst.init (ref args);\n    \n    dynamic Element playbin = ElementFactory.make (\"playbin\", \"playbin\");\n    playbin.uri = args[1];\n    \n    Window window = new Window();\n    \n    playbin.bus.add_watch (0, (bus, message) => {\n\t\t// get the window id of current GtkWindow for inlay the video.\n        if (Gst.Video.is_video_overlay_prepare_window_handle_message (message))\n            (message.src as Gst.Video.Overlay).set_window_handle ((uint*)Gdk.X11Window.get_xid (window.get_window()));\n    \n        switch (message.type)\n        {\n            case Gst.MessageType.ERROR:\n                print (\"an error was occured !\\n\");\n                Gtk.main_quit();\n                break;\n            case Gst.MessageType.EOS:\n                print (\"end of current stream. quit ..\\n\");\n                Gtk.main_quit();\n                break;\n        }\n        return true;\n    });\n    \n    window.realize.connect(() => {\n\t\t// when the GtkWindow is shown, set the playbin state at PLAYING.\n        playbin.set_state (State.PLAYING);\n    });\n    window.show_all();\n    Gtk.main();\n}\n"
  },
  {
    "path": "data/templates/simple_gst_video/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem>cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"gdk-x11-3.0\"/>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t\t<package name=\"gstreamer-video-1.0\"/>\n\t\t<package name=\"gtk+-3.0\"/>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/main.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/simple_gst_video/template/vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "data/templates/simple_gtk/simple_gtk.info",
    "content": "<template version=\"0.1\">\n    <author>\n        <name>Linus Seelinger</name>\n        <mail>S.Linus@quantentunnel.de</mail>\n    </author>\n    <name>\n        <en>Simple GTK+ 3</en>\n        <de>GTK+ 3 Beispiel</de>\n        <fr>Exemple GTK+ 3</fr>\n    </name>\n    <description>\n        <en>Simple GTK+ 3 project</en>\n        <de>Einfaches GTK+ 3-Projekt</de>\n        <fr>Projet GTK+ 3 simple</fr>\n    </description>\n</template>\n"
  },
  {
    "path": "data/templates/simple_gtk/template/src/main.vala",
    "content": "using GLib;\nusing Gtk;\n\nstatic Label lbl_hello;\n\nstatic void main (string[] args) {\n    Gtk.init (ref args);\n\n    var window_main = new Window();\n    window_main.title = \"Hello world!\";\n    window_main.set_default_size (200, 200);\n    window_main.destroy.connect (Gtk.main_quit);\n\n    var vbox_main = new Box (Orientation.VERTICAL, 0);\n\n    lbl_hello = new Label (\"Hello!\");\n    var btn_bye = new Button.with_label (\"Magic!\");\n\n    btn_bye.clicked.connect (on_btn_bye_clicked);\n\n    vbox_main.pack_start (lbl_hello, true, true);\n    vbox_main.pack_start (btn_bye, false, true);\n\n    window_main.add (vbox_main);\n\n    window_main.show_all();\n\n    Gtk.main();\n}\n\nstatic void on_btn_bye_clicked() {\n    lbl_hello.label = \"Bye!\";\n}\n"
  },
  {
    "path": "data/templates/simple_gtk/template/template.vlp",
    "content": "<project version=\"0.1\">\n\t<name></name>\n\t<buildsystem>cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>0</minor>\n\t\t<patch>0</patch>\n\t</version>\n\t<packages>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"glib-2.0\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t\t<package name=\"gtk+-3.0\"/>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t</buildsystem-directories>\n\t<opened-files>\n\t\t<file>src/main.vala</file>\n\t</opened-files>\n</project>\n"
  },
  {
    "path": "data/templates/simple_gtk/template/vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "data/valama.1.in",
    "content": ".TH VALAMA \"1\" \"@MONTH_DATE@\" \"Valama @Valama_VERSION@\" \"User Commands\"\n.SH NAME\nValama \\- Next generation Vala IDE\n.SH SYNOPSIS\n\\fBvalama\\fR\n[\\fB-h\\fR|\\fB--help\\fR]\n[\\fB-v\\fR|\\fB--version\\fR]\n[\\fB--syntax\\fR \\fIfile\\fR]\n[\\fB--templates\\fR \\fIdirectory\\fR]\n[\\fB--buildsystems\\fR \\fIdirectory\\fR]\n[{\\fB-d\\fR|\\fB--debug\\fR} [\\fIlevel\\fR]]\n[\\fB--force\\-old\\fR]\n[\\fB--layout\\fR \\fIfile\\fR]\n[\\fB--reset\\-layout\\fR]\n[\\fIfile\\fR ...]\n.SH DESCRIPTION\n\\fBValama\\fR is an integrated development environment (IDE) to support\ncreation of Vala applications. Some features:\n.IP\n\\(bu intelligent code completion (easily extendible syntax definition file)\n.IP\n\\(bu live error checking\n.IP\n\\(bu project templates\n.SH OPTIONS\n.TP\n\\fB\\-h\\fR, \\fB\\-\\-help\\fR\nShow help.\n.TP\n\\fB\\-v\\fR, \\fB\\-\\-version\\fR\nDisplay version number.\n.TP\n\\fB\\-\\-syntax\\fR \\fIfile\\fR\nGuanako syntax file (used for code completion).\n.TP\n\\fB\\-\\-templates\\fR \\fIdirectory\\fR\nTemplates directory.\n.TP\n\\fB\\-\\-buildsystems\\fR \\fIdirectory\\fR\nBuild systems directory.\n.TP\n\\fB\\-d\\fR, \\fB\\-\\-debug\\fR \\fI[debuglevel]\\fR\nOutput debug information. Be more verbose on higher debug level.\n.TP\n\\fB\\-\\-force\\-old\\fR\nForce loading of possibly incompatible template or project files.\n.TP\n\\fB\\-\\-layout\\fR \\fIfile\\fR\nPath to GUI layout file.\n.TP\n\\fB\\-\\-reset\\-layout\\fR\nLoad default layout.\n.SH FILES\n.TP\n\\fI@DATADIR@syntax\\fR\nDefault Guanako syntax definition file.\n.TP\n\\fI@DATADIR@templates\\fR\nDefault templates directory. Each template has its own subdirectory with a\n\\fItesttemplate.info\\fR file for meta information like supported Vala\nversions, package dependencies, etc. In the sub-subdirectory \\fItemplate\\fR is\nthe actual template source code.\n.TP\n\\fI@DATADIR@buildsystems\\fR\nDefault build system plug-in directory. Each build system plug-in has its own\nsubdirectory with a \\fItestbuildsystem.info\\fR file for meta information. In\nthe sub-subdirectory \\fIbuildsystem\\fR is the actual buildsystem template\ncode.\n.TP\n\\fI@DATADIR@layout.xml\\fR\nDefault GUI layout file to place widgets like the project browser, reporter,\netc."
  },
  {
    "path": "data/valama.desktop.in",
    "content": "[Desktop Entry]\nType=Application\n_Name=Valama\n_GenericName=IDE\n_Comment=Create Vala projects.\nIcon=valama\nExec=valama\nMimeType=application/x-valama;\nCategories=GNOME;GTK;Development;IDE;\n_Keywords=Vala;IDE;Development;\n"
  },
  {
    "path": "data/valama.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<mime-info xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\n  <mime-type type=\"application/x-valama\">\n    <comment>Valama project file</comment>\n    <comment xml:lang=\"de\">Valama Projektdatei</comment>\n    <glob pattern=\"*.vlp\"/>\n    <magic priority=\"60\">\n        <match type=\"string\" offset=\"0\" value=\"&lt;project version=\"/>\n    </magic>\n  </mime-type>\n</mime-info>\n"
  },
  {
    "path": "extravapi/gdl-3.0/gdl-3.0.deps",
    "content": "gtk+-3.0\ngio-2.0\n"
  },
  {
    "path": "extravapi/gdl-3.0/gdl-3.0.vapi",
    "content": "/* gdl-3.0.vapi generated by vapigen, do not modify. */\n\n[CCode (cprefix = \"Gdl\", gir_namespace = \"Gdl\", gir_version = \"3\", lower_case_cprefix = \"gdl_\")]\nnamespace Gdl {\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_get_type ()\")]\n\tpublic class Dock : Gdl.DockObject, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Dock ();\n\t\tpublic void add_floating_item (Gdl.DockItem item, int x, int y, int width, int height);\n\t\tpublic void add_item (Gdl.DockItem item, Gdl.DockPlacement placement);\n\t\tpublic unowned Gdl.DockItem get_item_by_name (string name);\n\t\tpublic GLib.List<weak Gdl.DockObject> get_named_items ();\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic unowned Gdl.DockPlaceholder get_placeholder_by_name (string name);\n\t\tpublic unowned Gdl.DockObject get_root ();\n\t\tpublic void hide_preview ();\n\t\tpublic Gtk.Widget new_from (bool floating);\n\t\tpublic void set_skip_taskbar (bool skip);\n\t\tpublic void show_preview (Gdk.Rectangle rect);\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic void xor_rect (Gdk.Rectangle rect);\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic void xor_rect_hide ();\n\t\t[NoAccessorMethod]\n\t\tpublic string default_title { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool floating { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int floatx { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int floaty { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int height { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool skip_taskbar { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int width { get; set construct; }\n\t\tpublic virtual signal void layout_changed ();\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_bar_get_type ()\")]\n\tpublic class DockBar : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockBar (GLib.Object? master);\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic Gtk.Orientation get_orientation ();\n\t\tpublic Gdl.DockBarStyle get_style ();\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic void set_orientation (Gtk.Orientation orientation);\n\t\tpublic void set_style (Gdl.DockBarStyle style);\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.DockBarStyle dockbar_style { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Object master { owned get; set; }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_item_get_type ()\")]\n\tpublic class DockItem : Gdl.DockObject, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockItem (string name, string long_name, Gdl.DockItemBehavior behavior);\n\t\tpublic void bind (Gtk.Widget dock);\n\t\tpublic void dock_to (Gdl.DockItem? target, Gdl.DockPlacement position, int docking_param);\n\t\tpublic Gdl.DockItemBehavior get_behavior_flags ();\n\t\tpublic unowned Gtk.Widget get_child ();\n\t\tpublic void get_drag_area (Gdk.Rectangle rect);\n\t\tpublic unowned Gtk.Widget get_grip ();\n\t\tpublic Gtk.Orientation get_orientation ();\n\t\tpublic unowned Gtk.Widget get_tablabel ();\n\t\tpublic void hide_grip ();\n\t\tpublic void hide_item ();\n\t\tpublic void iconify_item ();\n\t\tpublic bool is_closed ();\n\t\tpublic bool is_iconified ();\n\t\tpublic bool is_placeholder ();\n\t\tpublic void @lock ();\n\t\tpublic void notify_deselected ();\n\t\tpublic void notify_selected ();\n\t\tpublic bool or_child_has_focus ();\n\t\tpublic void preferred_size (Gtk.Requisition req);\n\t\tpublic void set_behavior_flags (Gdl.DockItemBehavior behavior, bool clear);\n\t\tpublic void set_child (Gtk.Widget? child);\n\t\tpublic void set_default_position (Gdl.DockObject reference);\n\t\t[CCode (cname = \"gdl_dock_item_class_set_has_grip\")]\n\t\tpublic class void set_has_grip (bool has_grip);\n\t\tpublic virtual void set_orientation (Gtk.Orientation orientation);\n\t\tpublic void set_tablabel (Gtk.Widget tablabel);\n\t\tpublic void show_grip ();\n\t\tpublic void show_item ();\n\t\tpublic void unbind ();\n\t\tpublic void unlock ();\n\t\tpublic void unset_behavior_flags (Gdl.DockItemBehavior behavior);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockItem.with_pixbuf_icon (string name, string long_name, Gdk.Pixbuf pixbuf_icon, Gdl.DockItemBehavior behavior);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockItem.with_stock (string name, string long_name, string stock_id, Gdl.DockItemBehavior behavior);\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.DockItemBehavior behavior { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool closed { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool iconified { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool locked { get; set; }\n\t\tpublic Gtk.Orientation orientation { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int preferred_height { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int preferred_width { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool resize { get; set; }\n\t\tpublic signal void deselected ();\n\t\tpublic virtual signal void dock_drag_begin ();\n\t\tpublic virtual signal void dock_drag_end (bool cancelled);\n\t\tpublic virtual signal void dock_drag_motion (Gdk.Device device, int x, int y);\n\t\tpublic virtual signal void move_focus_child (Gtk.DirectionType direction);\n\t\tpublic signal void selected ();\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_item_button_image_get_type ()\")]\n\tpublic class DockItemButtonImage : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\tpublic Gdl.DockItemButtonImageType image_type;\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockItemButtonImage (Gdl.DockItemButtonImageType image_type);\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_item_grip_get_type ()\")]\n\tpublic class DockItemGrip : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockItemGrip (Gdl.DockItem item);\n\t\tpublic bool has_event (Gdk.Event event);\n\t\tpublic void hide_handle ();\n\t\tpublic void set_cursor (bool in_drag);\n\t\tpublic void set_label (Gtk.Widget label);\n\t\tpublic void show_handle ();\n\t\tpublic Gdl.DockItem item { construct; }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_layout_get_type ()\")]\n\tpublic class DockLayout : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic DockLayout (GLib.Object master);\n\t\tpublic void attach (Gdl.DockMaster master);\n\t\tpublic void delete_layout (string name);\n\t\tpublic GLib.List<string> get_layouts (bool include_default);\n\t\tpublic unowned GLib.Object get_master ();\n\t\tpublic bool is_dirty ();\n\t\tpublic bool load_from_file (string filename);\n\t\tpublic bool load_layout (string? name);\n\t\tpublic void save_layout (string? name);\n\t\tpublic bool save_to_file (string filename);\n\t\tpublic void set_master (GLib.Object master);\n\t\t[NoAccessorMethod]\n\t\tpublic bool dirty { get; }\n\t\tpublic GLib.Object master { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_master_get_type ()\")]\n\tpublic class DockMaster : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected DockMaster ();\n\t\tpublic void add (Gdl.DockObject object);\n\t\tpublic void @foreach (GLib.Func function);\n\t\tpublic void foreach_toplevel (bool include_controller, GLib.Func function);\n\t\tpublic unowned Gdl.DockObject get_controller ();\n\t\tpublic string get_dock_name ();\n\t\tpublic unowned Gdl.DockObject get_object (string nick_name);\n\t\tpublic void remove (Gdl.DockObject object);\n\t\tpublic void set_controller (Gdl.DockObject new_controller);\n\t\t[NoAccessorMethod]\n\t\tpublic string default_title { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int locked { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.SwitcherStyle switcher_style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int tab_pos { get; set;  }\n\t\t[NoAccessorMethod]\n\t\tpublic bool tab_reorderable { get; set;  }\n\t\tpublic virtual signal void layout_changed ();\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_notebook_get_type ()\")]\n\tpublic class DockNotebook : Gdl.DockItem, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockNotebook ();\n\t\t[NoAccessorMethod]\n\t\tpublic int page { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_object_get_type ()\")]\n\tpublic class DockObject : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\tpublic Gdl.DockObjectFlags deprecated_flags;\n\t\tpublic weak GLib.Object deprecated_master;\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected DockObject ();\n\t\tpublic void bind (GLib.Object master);\n\t\tpublic virtual bool child_placement (Gdl.DockObject child, Gdl.DockPlacement? placement);\n\t\tpublic virtual bool dock_request (int x, int y, Gdl.DockRequest request);\n\t\tpublic void freeze ();\n\t\tpublic unowned Gdl.DockObject get_controller ();\n\t\tpublic unowned string get_long_name ();\n\t\tpublic unowned GLib.Object get_master ();\n\t\tpublic unowned Gdl.DockObject get_parent_object ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\tpublic unowned string get_stock_id ();\n\t\tpublic unowned Gdl.Dock get_toplevel ();\n\t\tpublic bool is_automatic ();\n\t\tpublic bool is_bound ();\n\t\tpublic bool is_closed ();\n\t\tpublic bool is_compound ();\n\t\tpublic bool is_frozen ();\n\t\tpublic void layout_changed_notify ();\n\t\tpublic static unowned string nick_from_type (GLib.Type type);\n\t\tpublic virtual void present (Gdl.DockObject? child);\n\t\tpublic virtual void reduce ();\n\t\tpublic virtual bool reorder (Gdl.DockObject child, Gdl.DockPlacement new_position, GLib.Value? other_data);\n\t\tpublic void set_long_name (string name);\n\t\tpublic void set_manual ();\n\t\tpublic void set_pixbuf (Gdk.Pixbuf? icon);\n\t\tpublic void set_stock_id (string stock_id);\n\t\tpublic static GLib.Type set_type_for_nick (string nick, GLib.Type type);\n\t\tpublic void thaw ();\n\t\tpublic static GLib.Type type_from_nick (string nick);\n\t\tpublic void unbind ();\n\t\tpublic string long_name { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.DockMaster master { owned get; set construct; }\n\t\tpublic string name { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic void* pixbuf_icon { get; set; }\n\t\tpublic string stock_id { get; set construct; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void detach (bool recursive);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void dock (Gdl.DockObject requestor, Gdl.DockPlacement position, GLib.Value other_data);\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_paned_get_type ()\")]\n\tpublic class DockPaned : Gdl.DockItem, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockPaned (Gtk.Orientation orientation);\n\t\t[NoAccessorMethod]\n\t\tpublic uint position { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_param_get_type ()\")]\n\tpublic class DockParam {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected DockParam ();\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_placeholder_get_type ()\")]\n\tpublic class DockPlaceholder : Gdl.DockObject, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DockPlaceholder (string name, Gdl.DockObject object, Gdl.DockPlacement position, bool sticky);\n\t\tpublic void attach (Gdl.DockObject object);\n\t\t[NoAccessorMethod]\n\t\tpublic bool floating { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int floatx { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int floaty { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int height { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.DockObject host { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.DockPlacement next_placement { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool sticky { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int width { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_dock_tablabel_get_type ()\")]\n\tpublic class DockTablabel : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\tpublic bool active;\n\t\tpublic uint drag_handle_size;\n\t\tpublic Gdk.EventButton drag_start_event;\n\t\tpublic weak Gdk.Window event_window;\n\t\tpublic bool pre_drag;\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic DockTablabel (Gdl.DockItem item);\n\t\tpublic void activate ();\n\t\tpublic void deactivate ();\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.DockItem item { owned get; set; }\n\t\tpublic virtual signal void button_pressed_handle (Gdk.Event event);\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_preview_window_get_type ()\")]\n\tpublic class PreviewWindow : Gtk.Window, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic PreviewWindow ();\n\t\tpublic void update (Gdk.Rectangle rect);\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", type_id = \"gdl_switcher_get_type ()\")]\n\tpublic class Switcher : Gtk.Notebook, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Switcher ();\n\t\tpublic int insert_page (Gtk.Widget page, Gtk.Widget tab_widget, string label, string tooltips, string stock_id, Gdk.Pixbuf pixbuf_icon, int position);\n\t\t[NoAccessorMethod]\n\t\tpublic Gdl.SwitcherStyle switcher_style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int tab_pos { get; set;  }\n\t\t[NoAccessorMethod]\n\t\tpublic bool tab_reorderable { get; set;  }\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", has_type_id = false)]\n\tpublic struct DockRequest {\n\t\tpublic weak Gdl.DockObject applicant;\n\t\tpublic weak Gdl.DockObject target;\n\t\tpublic Gdl.DockPlacement position;\n\t\tpublic Cairo.RectangleInt rect;\n\t\tpublic GLib.Value extra;\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_BAR_\", type_id = \"gdl_dock_bar_style_get_type ()\")]\n\tpublic enum DockBarStyle {\n\t\tICONS,\n\t\tTEXT,\n\t\tBOTH,\n\t\tAUTO\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_ITEM_BEH_\", type_id = \"gdl_dock_item_behavior_get_type ()\")]\n\t[Flags]\n\tpublic enum DockItemBehavior {\n\t\tNORMAL,\n\t\tNEVER_FLOATING,\n\t\tNEVER_VERTICAL,\n\t\tNEVER_HORIZONTAL,\n\t\tLOCKED,\n\t\tCANT_DOCK_TOP,\n\t\tCANT_DOCK_BOTTOM,\n\t\tCANT_DOCK_LEFT,\n\t\tCANT_DOCK_RIGHT,\n\t\tCANT_DOCK_CENTER,\n\t\tCANT_CLOSE,\n\t\tCANT_ICONIFY,\n\t\tNO_GRIP\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_ITEM_BUTTON_IMAGE_\", has_type_id = false)]\n\tpublic enum DockItemButtonImageType {\n\t\tCLOSE,\n\t\tICONIFY\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_\", type_id = \"gdl_dock_item_flags_get_type ()\")]\n\t[Deprecated (since = \"3.6\")]\n\t[Flags]\n\tpublic enum DockItemFlags {\n\t\tIN_DRAG,\n\t\tIN_PREDRAG,\n\t\tICONIFIED,\n\t\tUSER_ACTION\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_\", type_id = \"gdl_dock_object_flags_get_type ()\")]\n\t[Flags]\n\tpublic enum DockObjectFlags {\n\t\tAUTOMATIC,\n\t\tATTACHED,\n\t\tIN_REFLOW,\n\t\tIN_DETACH\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_PARAM_\", type_id = \"gdl_dock_param_flags_get_type ()\")]\n\t[Flags]\n\tpublic enum DockParamFlags {\n\t\tEXPORT,\n\t\tAFTER\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_DOCK_\", type_id = \"gdl_dock_placement_get_type ()\")]\n\tpublic enum DockPlacement {\n\t\tNONE,\n\t\tTOP,\n\t\tBOTTOM,\n\t\tRIGHT,\n\t\tLEFT,\n\t\tCENTER,\n\t\tFLOATING\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cprefix = \"GDL_SWITCHER_STYLE_\", type_id = \"gdl_switcher_style_get_type ()\")]\n\tpublic enum SwitcherStyle {\n\t\tTEXT,\n\t\tICON,\n\t\tBOTH,\n\t\tTOOLBAR,\n\t\tTABS,\n\t\tNONE\n\t}\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cname = \"GDL_DOCK_MASTER_PROPERTY\")]\n\tpublic const string DOCK_MASTER_PROPERTY;\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cname = \"GDL_DOCK_NAME_PROPERTY\")]\n\tpublic const string DOCK_NAME_PROPERTY;\n\t[CCode (cheader_filename = \"gdl/gdl.h\", cname = \"GDL_DOCK_OBJECT_FLAGS_SHIFT\")]\n\t[Deprecated (since = \"3.6\")]\n\tpublic const int DOCK_OBJECT_FLAGS_SHIFT;\n\t[CCode (cheader_filename = \"gdl/gdl.h\")]\n\tpublic static void marshal_VOID__OBJECT_ENUM_BOXED (GLib.Closure closure, GLib.Value return_value, uint n_param_values, GLib.Value param_values, void* invocation_hint, void* marshal_data);\n\t[CCode (cheader_filename = \"gdl/gdl.h\")]\n\tpublic static void marshal_VOID__OBJECT_INT_INT (GLib.Closure closure, GLib.Value return_value, uint n_param_values, GLib.Value param_values, void* invocation_hint, void* marshal_data);\n\t[CCode (cheader_filename = \"gdl/gdl.h\")]\n\tpublic static void marshal_VOID__UINT_UINT (GLib.Closure closure, GLib.Value return_value, uint n_param_values, GLib.Value param_values, void* invocation_hint, void* marshal_data);\n}\n"
  },
  {
    "path": "extravapi/gtk+-3.0/gtk+-3.0.deps",
    "content": "gio-2.0\natk\ncairo\ngdk-pixbuf-2.0\ngdk-3.0\npango\nx11\n"
  },
  {
    "path": "extravapi/gtk+-3.0/gtk+-3.0.vapi",
    "content": "/* gtk+-3.0.vapi generated by vapigen, do not modify. */\n\n[CCode (gir_namespace = \"Gtk\", gir_version = \"3.0\")]\nnamespace Gtk {\n\t[Deprecated (since = \"3.10\")]\n\tnamespace Stock {\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ABOUT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ADD;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string APPLY;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string BOLD;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CANCEL;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CAPS_LOCK_WARNING;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CDROM;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CLEAR;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CLOSE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string COLOR_PICKER;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CONNECT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CONVERT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string COPY;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string CUT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DELETE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DIALOG_AUTHENTICATION;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DIALOG_ERROR;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DIALOG_INFO;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DIALOG_QUESTION;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DIALOG_WARNING;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DIRECTORY;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DISCARD;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DISCONNECT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DND;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string DND_MULTIPLE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string EDIT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string EXECUTE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string FILE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string FIND;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string FIND_AND_REPLACE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string FLOPPY;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string FULLSCREEN;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GOTO_BOTTOM;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GOTO_FIRST;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GOTO_LAST;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GOTO_TOP;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GO_BACK;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GO_DOWN;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GO_FORWARD;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string GO_UP;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string HARDDISK;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string HELP;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string HOME;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string INDENT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string INDEX;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string INFO;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ITALIC;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string JUMP_TO;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string JUSTIFY_CENTER;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string JUSTIFY_FILL;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string JUSTIFY_LEFT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string JUSTIFY_RIGHT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string LEAVE_FULLSCREEN;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_FORWARD;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_NEXT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_PAUSE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_PLAY;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_PREVIOUS;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_RECORD;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_REWIND;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MEDIA_STOP;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string MISSING_IMAGE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string NETWORK;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string NEW;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string NO;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string OK;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string OPEN;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ORIENTATION_LANDSCAPE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ORIENTATION_PORTRAIT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ORIENTATION_REVERSE_LANDSCAPE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ORIENTATION_REVERSE_PORTRAIT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PAGE_SETUP;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PASTE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PREFERENCES;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PRINT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PRINT_ERROR;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PRINT_PAUSED;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PRINT_PREVIEW;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PRINT_REPORT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PRINT_WARNING;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string PROPERTIES;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string QUIT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string REDO;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string REFRESH;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string REMOVE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string REVERT_TO_SAVED;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SAVE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SAVE_AS;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SELECT_ALL;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SELECT_COLOR;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SELECT_FONT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SORT_ASCENDING;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SORT_DESCENDING;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string SPELL_CHECK;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string STOP;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string STRIKETHROUGH;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string UNDELETE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string UNDERLINE;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string UNDO;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string UNINDENT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string YES;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ZOOM_100;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ZOOM_FIT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ZOOM_IN;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic const string ZOOM_OUT;\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic static void add (Gtk.StockItem[] items);\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic static void add_static (Gtk.StockItem[] items);\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic static GLib.SList<string> list_ids ();\n\t\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t\tpublic static bool lookup (string stock_id, out Gtk.StockItem item);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AboutDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AboutDialog ();\n\t\tpublic void add_credit_section (string section_name, string people);\n\t\tpublic unowned string get_artists ();\n\t\tpublic unowned string get_authors ();\n\t\tpublic unowned string get_comments ();\n\t\tpublic unowned string get_copyright ();\n\t\tpublic unowned string get_documenters ();\n\t\tpublic unowned string get_license ();\n\t\tpublic Gtk.License get_license_type ();\n\t\tpublic unowned Gdk.Pixbuf get_logo ();\n\t\tpublic unowned string get_logo_icon_name ();\n\t\tpublic unowned string get_program_name ();\n\t\tpublic unowned string get_translator_credits ();\n\t\tpublic unowned string get_version ();\n\t\tpublic unowned string get_website ();\n\t\tpublic unowned string get_website_label ();\n\t\tpublic bool get_wrap_license ();\n\t\tpublic void set_artists ([CCode (array_length = false)] string[] artists);\n\t\tpublic void set_authors ([CCode (array_length = false)] string[] authors);\n\t\tpublic void set_comments (string comments);\n\t\tpublic void set_copyright (string copyright);\n\t\tpublic void set_documenters ([CCode (array_length = false)] string[] documenters);\n\t\tpublic void set_license (string license);\n\t\tpublic void set_license_type (Gtk.License license_type);\n\t\tpublic void set_logo (Gdk.Pixbuf logo);\n\t\tpublic void set_logo_icon_name (string icon_name);\n\t\tpublic void set_program_name (string name);\n\t\tpublic void set_translator_credits (string translator_credits);\n\t\tpublic void set_version (string version);\n\t\tpublic void set_website (string website);\n\t\tpublic void set_website_label (string website_label);\n\t\tpublic void set_wrap_license (bool wrap_license);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] artists { get; set; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] authors { get; set; }\n\t\tpublic string comments { get; set; }\n\t\tpublic string copyright { get; set; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] documenters { get; set; }\n\t\tpublic string license { get; set; }\n\t\tpublic Gtk.License license_type { get; set; }\n\t\tpublic Gdk.Pixbuf logo { get; set; }\n\t\tpublic string logo_icon_name { get; set; }\n\t\tpublic string program_name { get; set; }\n\t\tpublic string translator_credits { get; set; }\n\t\tpublic string version { get; set; }\n\t\tpublic string website { get; set; }\n\t\tpublic string website_label { get; set; }\n\t\tpublic bool wrap_license { get; set; }\n\t\tpublic virtual signal bool activate_link (string uri);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AccelGroup : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic AccelGroup ();\n\t\tpublic bool activate (GLib.Quark accel_quark, GLib.Object acceleratable, uint accel_key, Gdk.ModifierType accel_mods);\n\t\tpublic void connect (uint accel_key, Gdk.ModifierType accel_mods, Gtk.AccelFlags accel_flags, [CCode (type = \"GClosure*\")] owned Gtk.AccelGroupActivate closure);\n\t\tpublic void connect_by_path (string accel_path, [CCode (type = \"GClosure*\")] owned Gtk.AccelGroupActivate closure);\n\t\tpublic bool disconnect (GLib.Closure closure);\n\t\tpublic bool disconnect_key (uint accel_key, Gdk.ModifierType accel_mods);\n\t\tpublic Gtk.AccelKey* find (Gtk.AccelGroupFindFunc find_func);\n\t\tpublic static unowned Gtk.AccelGroup from_accel_closure (GLib.Closure closure);\n\t\tpublic bool get_is_locked ();\n\t\tpublic Gdk.ModifierType get_modifier_mask ();\n\t\tpublic void @lock ();\n\t\tpublic unowned Gtk.AccelGroupEntry query (uint accel_key, Gdk.ModifierType accel_mods, uint n_entries);\n\t\tpublic void unlock ();\n\t\tpublic bool is_locked { get; }\n\t\tpublic Gdk.ModifierType modifier_mask { get; }\n\t\tpublic virtual signal bool accel_activate (GLib.Object p0, uint p1, Gdk.ModifierType p2);\n\t\tpublic virtual signal void accel_changed (uint keyval, Gdk.ModifierType modifier, GLib.Closure accel_closure);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class AccelGroupEntry {\n\t\tpublic GLib.Quark accel_path_quark;\n\t\tpublic weak GLib.Closure closure;\n\t\tpublic Gtk.AccelKey key;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AccelLabel : Gtk.Label, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AccelLabel (string str);\n\t\tpublic unowned Gtk.Widget get_accel_widget ();\n\t\tpublic uint get_accel_width ();\n\t\tpublic bool refetch ();\n\t\tpublic void set_accel (uint accelerator_key, Gdk.ModifierType accelerator_mods);\n\t\tpublic void set_accel_closure ([CCode (type = \"GClosure*\")] owned Gtk.AccelGroupActivate accel_closure);\n\t\tpublic void set_accel_widget (Gtk.Widget accel_widget);\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Closure accel_closure { owned get; set; }\n\t\tpublic Gtk.Widget accel_widget { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AccelMap : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected AccelMap ();\n\t\tpublic static void add_entry (string accel_path, uint accel_key, Gdk.ModifierType accel_mods);\n\t\tpublic static void add_filter (string filter_pattern);\n\t\tpublic static bool change_entry (string accel_path, uint accel_key, Gdk.ModifierType accel_mods, bool replace);\n\t\tpublic static void @foreach (void* data, Gtk.AccelMapForeach foreach_func);\n\t\tpublic static void foreach_unfiltered (void* data, Gtk.AccelMapForeach foreach_func);\n\t\tpublic static unowned Gtk.AccelMap @get ();\n\t\tpublic static void load (string file_name);\n\t\tpublic static void load_fd (int fd);\n\t\tpublic static void load_scanner (GLib.Scanner scanner);\n\t\tpublic static void lock_path (string accel_path);\n\t\tpublic static bool lookup_entry (string accel_path, out Gtk.AccelKey key);\n\t\tpublic static void save (string file_name);\n\t\tpublic static void save_fd (int fd);\n\t\tpublic static void unlock_path (string accel_path);\n\t\tpublic virtual signal void changed (string p0, uint p1, Gdk.ModifierType p2);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class AccelMapClass {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Accessible : Atk.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Accessible ();\n\t\t[Deprecated (replacement = \"Accessible.set_widget\", since = \"3.4\")]\n\t\tpublic virtual void connect_widget_destroyed ();\n\t\tpublic unowned Gtk.Widget get_widget ();\n\t\tpublic void set_widget (Gtk.Widget widget);\n\t\t[NoWrapper]\n\t\tpublic virtual void widget_set ();\n\t\t[NoWrapper]\n\t\tpublic virtual void widget_unset ();\n\t\tpublic Gtk.Widget widget { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"GLib.Action\", since = \"3.10\")]\n\tpublic class Action : GLib.Object, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Action (string name, string? label, string? tooltip, string? stock_id);\n\t\tpublic void block_activate ();\n\t\tpublic void connect_accelerator ();\n\t\t[NoWrapper]\n\t\tpublic virtual void connect_proxy (Gtk.Widget proxy);\n\t\tpublic unowned Gtk.Widget create_icon (Gtk.IconSize icon_size);\n\t\tpublic virtual unowned Gtk.Widget create_menu ();\n\t\tpublic virtual unowned Gtk.Widget create_menu_item ();\n\t\tpublic virtual unowned Gtk.Widget create_tool_item ();\n\t\tpublic void disconnect_accelerator ();\n\t\t[NoWrapper]\n\t\tpublic virtual void disconnect_proxy (Gtk.Widget proxy);\n\t\tpublic unowned GLib.Closure get_accel_closure ();\n\t\tpublic unowned string get_accel_path ();\n\t\tpublic bool get_always_show_image ();\n\t\tpublic unowned GLib.Icon get_gicon ();\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic bool get_is_important ();\n\t\tpublic unowned string get_label ();\n\t\tpublic unowned GLib.SList<Gtk.Widget> get_proxies ();\n\t\tpublic bool get_sensitive ();\n\t\tpublic unowned string get_short_label ();\n\t\tpublic unowned string get_stock_id ();\n\t\tpublic unowned string get_tooltip ();\n\t\tpublic bool get_visible ();\n\t\tpublic bool get_visible_horizontal ();\n\t\tpublic bool get_visible_vertical ();\n\t\tpublic bool is_sensitive ();\n\t\tpublic bool is_visible ();\n\t\tpublic void set_accel_group (Gtk.AccelGroup accel_group);\n\t\tpublic void set_accel_path (string accel_path);\n\t\tpublic void set_always_show_image (bool always_show);\n\t\tpublic void set_gicon (GLib.Icon icon);\n\t\tpublic void set_icon_name (string icon_name);\n\t\tpublic void set_is_important (bool is_important);\n\t\tpublic void set_label (string label);\n\t\tpublic void set_sensitive (bool sensitive);\n\t\tpublic void set_short_label (string short_label);\n\t\tpublic void set_stock_id (string stock_id);\n\t\tpublic void set_tooltip (string tooltip);\n\t\tpublic void set_visible (bool visible);\n\t\tpublic void set_visible_horizontal (bool visible_horizontal);\n\t\tpublic void set_visible_vertical (bool visible_vertical);\n\t\tpublic void unblock_activate ();\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ActionGroup action_group { owned get; set; }\n\t\tpublic bool always_show_image { get; set construct; }\n\t\tpublic GLib.Icon gicon { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool hide_if_empty { get; set; }\n\t\tpublic string icon_name { get; set; }\n\t\tpublic bool is_important { get; set; }\n\t\tpublic string label { get; set; }\n\t\tpublic string name { get; construct; }\n\t\tpublic bool sensitive { get; set; }\n\t\tpublic string short_label { get; set; }\n\t\tpublic string stock_id { get; set; }\n\t\tpublic string tooltip { get; set; }\n\t\tpublic bool visible { get; set; }\n\t\tpublic bool visible_horizontal { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool visible_overflown { get; set; }\n\t\tpublic bool visible_vertical { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void activate ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.10\")]\n\tpublic class ActionGroup : GLib.Object, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ActionGroup (string name);\n\t\tpublic void add_action (Gtk.Action action);\n\t\tpublic void add_action_with_accel (Gtk.Action action, string? accelerator);\n\t\tpublic void add_actions (Gtk.ActionEntry[] entries, void* user_data);\n\t\tpublic void add_actions_full (Gtk.ActionEntry[] entries, void* user_data, GLib.DestroyNotify? destroy);\n\t\tpublic void add_radio_actions (Gtk.RadioActionEntry[] entries, int value, [CCode (type = \"GCallback\")] Gtk.RadioActionCallback on_change);\n\t\tpublic void add_radio_actions_full (Gtk.RadioActionEntry[] entries, int value, [CCode (type = \"GCallback\")] Gtk.RadioActionCallback on_change, GLib.DestroyNotify? destroy);\n\t\tpublic void add_toggle_actions (Gtk.ToggleActionEntry[] entries, void* user_data);\n\t\tpublic void add_toggle_actions_full (Gtk.ToggleActionEntry[] entries, void* user_data, GLib.DestroyNotify? destroy);\n\t\tpublic unowned Gtk.AccelGroup get_accel_group ();\n\t\tpublic virtual unowned Gtk.Action get_action (string action_name);\n\t\tpublic bool get_sensitive ();\n\t\tpublic bool get_visible ();\n\t\tpublic GLib.List<weak Gtk.Action> list_actions ();\n\t\tpublic void remove_action (Gtk.Action action);\n\t\tpublic void set_accel_group (Gtk.AccelGroup accel_group);\n\t\tpublic void set_sensitive (bool sensitive);\n\t\tpublic void set_translate_func (owned Gtk.TranslateFunc func);\n\t\tpublic void set_translation_domain (string domain);\n\t\tpublic void set_visible (bool visible);\n\t\tpublic unowned string translate_string (string str);\n\t\tpublic Gtk.AccelGroup accel_group { get; set; }\n\t\tpublic string name { get; construct; }\n\t\tpublic bool sensitive { get; set; }\n\t\tpublic bool visible { get; set; }\n\t\tpublic virtual signal void connect_proxy (Gtk.Action p0, Gtk.Widget p1);\n\t\tpublic virtual signal void disconnect_proxy (Gtk.Action p0, Gtk.Widget p1);\n\t\tpublic virtual signal void post_activate (Gtk.Action p0);\n\t\tpublic virtual signal void pre_activate (Gtk.Action p0);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Adjustment : GLib.InitiallyUnowned {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Adjustment (double value, double lower, double upper, double step_increment, double page_increment, double page_size);\n\t\tpublic void clamp_page (double lower, double upper);\n\t\tpublic void configure (double value, double lower, double upper, double step_increment, double page_increment, double page_size);\n\t\tpublic double get_lower ();\n\t\tpublic double get_minimum_increment ();\n\t\tpublic double get_page_increment ();\n\t\tpublic double get_page_size ();\n\t\tpublic double get_step_increment ();\n\t\tpublic double get_upper ();\n\t\tpublic double get_value ();\n\t\tpublic void set_lower (double lower);\n\t\tpublic void set_page_increment (double page_increment);\n\t\tpublic void set_page_size (double page_size);\n\t\tpublic void set_step_increment (double step_increment);\n\t\tpublic void set_upper (double upper);\n\t\tpublic void set_value (double value);\n\t\tpublic double lower { get; set; }\n\t\tpublic double page_increment { get; set; }\n\t\tpublic double page_size { get; set; }\n\t\tpublic double step_increment { get; set; }\n\t\tpublic double upper { get; set; }\n\t\tpublic double value { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void changed ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void value_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Alignment : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Alignment (float xalign, float yalign, float xscale, float yscale);\n\t\tpublic void get_padding (out uint padding_top, out uint padding_bottom, out uint padding_left, out uint padding_right);\n\t\tpublic void @set (float xalign, float yalign, float xscale, float yscale);\n\t\tpublic void set_padding (uint padding_top, uint padding_bottom, uint padding_left, uint padding_right);\n\t\t[NoAccessorMethod]\n\t\tpublic uint bottom_padding { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint left_padding { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint right_padding { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint top_padding { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xscale { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yscale { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AppChooserButton : Gtk.ComboBox, Atk.Implementor, Gtk.Buildable, Gtk.CellLayout, Gtk.CellEditable, Gtk.AppChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AppChooserButton (string content_type);\n\t\tpublic void append_custom_item (string name, string label, GLib.Icon icon);\n\t\tpublic void append_separator ();\n\t\tpublic unowned string get_heading ();\n\t\tpublic bool get_show_default_item ();\n\t\tpublic bool get_show_dialog_item ();\n\t\tpublic void set_active_custom_item (string name);\n\t\tpublic void set_heading (string heading);\n\t\tpublic void set_show_default_item (bool setting);\n\t\tpublic void set_show_dialog_item (bool setting);\n\t\tpublic string heading { get; set; }\n\t\tpublic bool show_default_item { get; set construct; }\n\t\tpublic bool show_dialog_item { get; set construct; }\n\t\tpublic virtual signal void custom_item_activated (string item_name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AppChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.AppChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AppChooserDialog (Gtk.Window parent, Gtk.DialogFlags flags, GLib.File file);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AppChooserDialog.for_content_type (Gtk.Window parent, Gtk.DialogFlags flags, string content_type);\n\t\tpublic unowned string get_heading ();\n\t\tpublic unowned Gtk.Widget get_widget ();\n\t\tpublic void set_heading (string heading);\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.File gfile { owned get; construct; }\n\t\tpublic string heading { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AppChooserWidget : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.AppChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AppChooserWidget (string content_type);\n\t\tpublic unowned string get_default_text ();\n\t\tpublic bool get_show_all ();\n\t\tpublic bool get_show_default ();\n\t\tpublic bool get_show_fallback ();\n\t\tpublic bool get_show_other ();\n\t\tpublic bool get_show_recommended ();\n\t\tpublic void set_default_text (string text);\n\t\tpublic void set_show_all (bool setting);\n\t\tpublic void set_show_default (bool setting);\n\t\tpublic void set_show_fallback (bool setting);\n\t\tpublic void set_show_other (bool setting);\n\t\tpublic void set_show_recommended (bool setting);\n\t\tpublic string default_text { get; set; }\n\t\tpublic bool show_all { get; set construct; }\n\t\tpublic bool show_default { get; set construct; }\n\t\tpublic bool show_fallback { get; set construct; }\n\t\tpublic bool show_other { get; set construct; }\n\t\tpublic bool show_recommended { get; set construct; }\n\t\tpublic virtual signal void application_activated (GLib.AppInfo app_info);\n\t\tpublic virtual signal void application_selected (GLib.AppInfo app_info);\n\t\tpublic virtual signal void populate_popup (Gtk.Menu menu, GLib.AppInfo app_info);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Application : GLib.Application, GLib.ActionGroup, GLib.ActionMap {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Application (string application_id, GLib.ApplicationFlags flags);\n\t\tpublic void add_accelerator (string accelerator, string action_name, GLib.Variant? parameter);\n\t\tpublic void add_window (Gtk.Window window);\n\t\tpublic unowned Gtk.Window get_active_window ();\n\t\tpublic unowned GLib.MenuModel get_app_menu ();\n\t\tpublic unowned GLib.MenuModel get_menubar ();\n\t\tpublic unowned Gtk.Window get_window_by_id (uint id);\n\t\tpublic unowned GLib.List<weak Gtk.Window> get_windows ();\n\t\tpublic uint inhibit (Gtk.Window? window, Gtk.ApplicationInhibitFlags flags, string? reason);\n\t\tpublic bool is_inhibited (Gtk.ApplicationInhibitFlags flags);\n\t\tpublic void remove_accelerator (string action_name, GLib.Variant? parameter);\n\t\tpublic void remove_window (Gtk.Window window);\n\t\tpublic void set_app_menu (GLib.MenuModel app_menu);\n\t\tpublic void set_menubar (GLib.MenuModel menubar);\n\t\tpublic void uninhibit (uint cookie);\n\t\tpublic Gtk.Window active_window { get; }\n\t\tpublic GLib.MenuModel app_menu { get; set; }\n\t\tpublic GLib.MenuModel menubar { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool register_session { get; set; }\n\t\tpublic virtual signal void window_added (Gtk.Window window);\n\t\tpublic virtual signal void window_removed (Gtk.Window window);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ApplicationWindow : Gtk.Window, Atk.Implementor, Gtk.Buildable, GLib.ActionGroup, GLib.ActionMap {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ApplicationWindow (Gtk.Application application);\n\t\tpublic uint get_id ();\n\t\tpublic bool get_show_menubar ();\n\t\tpublic void set_show_menubar (bool show_menubar);\n\t\tpublic bool show_menubar { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Arrow : Gtk.Misc, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Arrow (Gtk.ArrowType arrow_type, Gtk.ShadowType shadow_type);\n\t\tpublic void @set (Gtk.ArrowType arrow_type, Gtk.ShadowType shadow_type);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ArrowType arrow_type { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ShadowType shadow_type { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ArrowAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ArrowAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class AspectFrame : Gtk.Frame, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic AspectFrame (string? label, float xalign, float yalign, float ratio, bool obey_child);\n\t\tpublic void @set (float xalign, float yalign, float ratio, bool obey_child);\n\t\t[NoAccessorMethod]\n\t\tpublic bool obey_child { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float ratio { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yalign { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Assistant : Gtk.Window, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Assistant ();\n\t\tpublic void add_action_widget (Gtk.Widget child);\n\t\tpublic int append_page (Gtk.Widget page);\n\t\tpublic void commit ();\n\t\tpublic int get_current_page ();\n\t\tpublic int get_n_pages ();\n\t\tpublic unowned Gtk.Widget get_nth_page (int page_num);\n\t\tpublic bool get_page_complete (Gtk.Widget page);\n\t\t[Deprecated (since = \"3.2\")]\n\t\tpublic unowned Gdk.Pixbuf get_page_header_image (Gtk.Widget page);\n\t\t[Deprecated (since = \"3.2\")]\n\t\tpublic unowned Gdk.Pixbuf get_page_side_image (Gtk.Widget page);\n\t\tpublic unowned string get_page_title (Gtk.Widget page);\n\t\tpublic Gtk.AssistantPageType get_page_type (Gtk.Widget page);\n\t\tpublic int insert_page (Gtk.Widget page, int position);\n\t\tpublic void next_page ();\n\t\tpublic int prepend_page (Gtk.Widget page);\n\t\tpublic void previous_page ();\n\t\tpublic void remove_action_widget (Gtk.Widget child);\n\t\tpublic void remove_page (int page_num);\n\t\tpublic void set_current_page (int page_num);\n\t\tpublic void set_forward_page_func (owned Gtk.AssistantPageFunc page_func);\n\t\tpublic void set_page_complete (Gtk.Widget page, bool complete);\n\t\t[Deprecated (since = \"3.2\")]\n\t\tpublic void set_page_header_image (Gtk.Widget page, Gdk.Pixbuf pixbuf);\n\t\t[Deprecated (since = \"3.2\")]\n\t\tpublic void set_page_side_image (Gtk.Widget page, Gdk.Pixbuf pixbuf);\n\t\tpublic void set_page_title (Gtk.Widget page, string title);\n\t\tpublic void set_page_type (Gtk.Widget page, Gtk.AssistantPageType type);\n\t\tpublic void update_buttons_state ();\n\t\tpublic virtual signal void apply ();\n\t\tpublic virtual signal void cancel ();\n\t\tpublic virtual signal void close ();\n\t\tpublic virtual signal void prepare (Gtk.Widget page);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Bin : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Bin ();\n\t\tpublic unowned Gtk.Widget get_child ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class BindingEntry {\n\t\tpublic weak Gtk.BindingSet binding_set;\n\t\tpublic uint destroyed;\n\t\tpublic weak Gtk.BindingEntry hash_next;\n\t\tpublic uint in_emission;\n\t\tpublic uint keyval;\n\t\tpublic uint marks_unbound;\n\t\tpublic Gdk.ModifierType modifiers;\n\t\tpublic weak Gtk.BindingEntry set_next;\n\t\tpublic weak Gtk.BindingSignal signals;\n\t\tpublic static void add_signal (Gtk.BindingSet binding_set, uint keyval, Gdk.ModifierType modifiers, string signal_name, uint n_args, ...);\n\t\tpublic static GLib.TokenType add_signal_from_string (Gtk.BindingSet binding_set, string signal_desc);\n\t\tpublic static void add_signall (Gtk.BindingSet binding_set, uint keyval, Gdk.ModifierType modifiers, string signal_name, GLib.SList<Gtk.BindingArg?> binding_args);\n\t\tpublic static void remove (Gtk.BindingSet binding_set, uint keyval, Gdk.ModifierType modifiers);\n\t\tpublic static void skip (Gtk.BindingSet binding_set, uint keyval, Gdk.ModifierType modifiers);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class BindingSet {\n\t\tpublic weak Gtk.BindingEntry current;\n\t\tpublic weak Gtk.BindingEntry entries;\n\t\tpublic uint parsed;\n\t\tpublic int priority;\n\t\tpublic weak string set_name;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic BindingSet (string set_name);\n\t\tpublic bool activate (uint keyval, Gdk.ModifierType modifiers, GLib.Object object);\n\t\t[Deprecated (since = \"3.0\")]\n\t\tpublic void add_path (Gtk.PathType path_type, string path_pattern, Gtk.PathPriorityType priority);\n\t\tpublic static unowned Gtk.BindingSet by_class (void* object_class);\n\t\tpublic static unowned Gtk.BindingSet find (string set_name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class BindingSignal {\n\t\t[CCode (array_length_cname = \"n_args\")]\n\t\tpublic weak Gtk.BindingArg[] args;\n\t\tpublic uint n_args;\n\t\tpublic weak Gtk.BindingSignal next;\n\t\tpublic weak string signal_name;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class BooleanCellAccessible : Gtk.RendererCellAccessible, Atk.Action, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected BooleanCellAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Box : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Box (Gtk.Orientation orientation, int spacing);\n\t\tpublic Gtk.BaselinePosition get_baseline_position ();\n\t\tpublic bool get_homogeneous ();\n\t\tpublic int get_spacing ();\n\t\tpublic void pack_end (Gtk.Widget child, bool expand = true, bool fill = true, uint padding = 0);\n\t\tpublic void pack_start (Gtk.Widget child, bool expand = true, bool fill = true, uint padding = 0);\n\t\tpublic void query_child_packing (Gtk.Widget child, out bool expand, out bool fill, out uint padding, out Gtk.PackType pack_type);\n\t\tpublic void reorder_child (Gtk.Widget child, int position);\n\t\tpublic void set_baseline_position (Gtk.BaselinePosition position);\n\t\tpublic void set_child_packing (Gtk.Widget child, bool expand, bool fill, uint padding, Gtk.PackType pack_type);\n\t\tpublic void set_homogeneous (bool homogeneous);\n\t\tpublic void set_spacing (int spacing);\n\t\tpublic Gtk.BaselinePosition baseline_position { get; set; }\n\t\tpublic bool homogeneous { get; set; }\n\t\tpublic int spacing { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Builder : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Builder ();\n\t\tpublic void add_callback_symbol (string callback_name, GLib.Callback callback_symbol);\n\t\tpublic void add_callback_symbols (string first_callback_name, ...);\n\t\tpublic uint add_from_file (string filename) throws GLib.Error;\n\t\tpublic uint add_from_resource (string resource_path) throws GLib.Error;\n\t\tpublic uint add_from_string (string buffer, size_t length) throws GLib.Error;\n\t\tpublic uint add_objects_from_file (string filename, [CCode (array_length = false)] string[] object_ids) throws GLib.Error;\n\t\tpublic uint add_objects_from_resource (string resource_path, [CCode (array_length = false)] string[] object_ids) throws GLib.Error;\n\t\tpublic uint add_objects_from_string (string buffer, size_t length, [CCode (array_length = false)] string[] object_ids) throws GLib.Error;\n\t\tpublic void connect_signals (void* user_data);\n\t\tpublic void connect_signals_full (Gtk.BuilderConnectFunc func);\n\t\tpublic static GLib.Quark error_quark ();\n\t\tpublic void expose_object (string name, GLib.Object object);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Builder.from_file (string filename);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Builder.from_resource (string resource_path);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Builder.from_string (string str, ssize_t length);\n\t\tpublic unowned GLib.Object get_object (string name);\n\t\tpublic GLib.SList<weak GLib.Object> get_objects ();\n\t\tpublic unowned string get_translation_domain ();\n\t\tpublic virtual GLib.Type get_type_from_name (string type_name);\n\t\tpublic unowned GLib.Callback lookup_callback_symbol (string callback_name);\n\t\tpublic void set_translation_domain (string domain);\n\t\tpublic bool value_from_string (GLib.ParamSpec pspec, string str, GLib.Value value) throws GLib.Error;\n\t\tpublic bool value_from_string_type (GLib.Type type, string str, GLib.Value value) throws GLib.Error;\n\t\tpublic string translation_domain { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Button : Gtk.Bin, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Button ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Button.from_icon_name (string icon_name, Gtk.IconSize size);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Button.from_stock (string stock_id);\n\t\tpublic void get_alignment (out float xalign, out float yalign);\n\t\tpublic bool get_always_show_image ();\n\t\tpublic unowned Gdk.Window get_event_window ();\n\t\tpublic bool get_focus_on_click ();\n\t\tpublic unowned Gtk.Widget get_image ();\n\t\tpublic Gtk.PositionType get_image_position ();\n\t\tpublic unowned string get_label ();\n\t\tpublic Gtk.ReliefStyle get_relief ();\n\t\tpublic bool get_use_stock ();\n\t\tpublic bool get_use_underline ();\n\t\tpublic void set_alignment (float xalign, float yalign);\n\t\tpublic void set_always_show_image (bool always_show);\n\t\tpublic void set_focus_on_click (bool focus_on_click);\n\t\tpublic void set_image (Gtk.Widget image);\n\t\tpublic void set_image_position (Gtk.PositionType position);\n\t\tpublic void set_label (string? label);\n\t\tpublic void set_relief (Gtk.ReliefStyle newstyle);\n\t\tpublic void set_use_stock (bool use_stock);\n\t\tpublic void set_use_underline (bool use_underline);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Button.with_label (string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Button.with_mnemonic (string label);\n\t\tpublic bool always_show_image { get; set construct; }\n\t\tpublic bool focus_on_click { get; set; }\n\t\tpublic Gtk.Widget image { get; set; }\n\t\tpublic Gtk.PositionType image_position { get; set; }\n\t\tpublic string label { get; set construct; }\n\t\tpublic Gtk.ReliefStyle relief { get; set; }\n\t\tpublic bool use_stock { get; set construct; }\n\t\tpublic bool use_underline { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yalign { get; set; }\n\t\tpublic virtual signal void activate ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void clicked ();\n\t\t[Deprecated (replacement = \"Gtk.Widget.enter_notify_event\", since = \"2.8\")]\n\t\t[HasEmitter]\n\t\tpublic virtual signal void enter ();\n\t\t[Deprecated (replacement = \"Gtk.Widget.leave_notify_event\", since = \"2.8\")]\n\t\t[HasEmitter]\n\t\tpublic virtual signal void leave ();\n\t\t[Deprecated (replacement = \"Gtk.Widget.button_press_event\", since = \"2.8\")]\n\t\t[HasEmitter]\n\t\tpublic virtual signal void pressed ();\n\t\t[Deprecated (replacement = \"Gtk.Widget.button_release_event\", since = \"2.8\")]\n\t\t[HasEmitter]\n\t\tpublic virtual signal void released ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ButtonAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Action, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ButtonBox : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ButtonBox (Gtk.Orientation orientation);\n\t\tpublic bool get_child_non_homogeneous (Gtk.Widget child);\n\t\tpublic bool get_child_secondary (Gtk.Widget child);\n\t\tpublic Gtk.ButtonBoxStyle get_layout ();\n\t\tpublic void set_child_non_homogeneous (Gtk.Widget child, bool non_homogeneous);\n\t\tpublic void set_child_secondary (Gtk.Widget child, bool is_secondary);\n\t\tpublic void set_layout (Gtk.ButtonBoxStyle layout_style);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ButtonBoxStyle layout_style { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Calendar : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Calendar ();\n\t\tpublic void clear_marks ();\n\t\tpublic void get_date (out uint year, out uint month, out uint day);\n\t\tpublic bool get_day_is_marked (uint day);\n\t\tpublic int get_detail_height_rows ();\n\t\tpublic int get_detail_width_chars ();\n\t\tpublic Gtk.CalendarDisplayOptions get_display_options ();\n\t\tpublic void mark_day (uint day);\n\t\tpublic void select_day (uint day);\n\t\tpublic void select_month (uint month, uint year);\n\t\tpublic void set_detail_func (owned Gtk.CalendarDetailFunc func);\n\t\tpublic void set_detail_height_rows (int rows);\n\t\tpublic void set_detail_width_chars (int chars);\n\t\tpublic void set_display_options (Gtk.CalendarDisplayOptions flags);\n\t\tpublic void unmark_day (uint day);\n\t\t[NoAccessorMethod]\n\t\tpublic int day { get; set; }\n\t\tpublic int detail_height_rows { get; set; }\n\t\tpublic int detail_width_chars { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int month { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool no_month_change { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_day_names { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_details { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_heading { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_week_numbers { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int year { get; set; }\n\t\tpublic virtual signal void day_selected ();\n\t\tpublic virtual signal void day_selected_double_click ();\n\t\tpublic virtual signal void month_changed ();\n\t\tpublic virtual signal void next_month ();\n\t\tpublic virtual signal void next_year ();\n\t\tpublic virtual signal void prev_month ();\n\t\tpublic virtual signal void prev_year ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellAccessible : Gtk.Accessible, Atk.Action, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected CellAccessible ();\n\t\t[NoWrapper]\n\t\tpublic virtual void update_cache ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellArea : GLib.InitiallyUnowned, Gtk.CellLayout, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected CellArea ();\n\t\tpublic virtual bool activate (Gtk.CellAreaContext context, Gtk.Widget widget, Gdk.Rectangle cell_area, Gtk.CellRendererState flags, bool edit_only);\n\t\tpublic bool activate_cell (Gtk.Widget widget, Gtk.CellRenderer renderer, Gdk.Event event, Gdk.Rectangle cell_area, Gtk.CellRendererState flags);\n\t\tpublic virtual void add (Gtk.CellRenderer renderer);\n\t\tpublic void add_focus_sibling (Gtk.CellRenderer renderer, Gtk.CellRenderer sibling);\n\t\tpublic void add_with_properties (Gtk.CellRenderer renderer, ...);\n\t\tpublic void attribute_connect (Gtk.CellRenderer renderer, string attribute, int column);\n\t\tpublic void attribute_disconnect (Gtk.CellRenderer renderer, string attribute);\n\t\tpublic void cell_get (Gtk.CellRenderer renderer, ...);\n\t\tpublic void cell_get_property (Gtk.CellRenderer renderer, string property_name, GLib.Value value);\n\t\tpublic void cell_get_valist (Gtk.CellRenderer renderer, string first_property_name, void* var_args);\n\t\tpublic void cell_set (Gtk.CellRenderer renderer, ...);\n\t\tpublic void cell_set_property (Gtk.CellRenderer renderer, string property_name, GLib.Value value);\n\t\tpublic void cell_set_valist (Gtk.CellRenderer renderer, string first_property_name, void* var_args);\n\t\tpublic virtual unowned Gtk.CellAreaContext copy_context (Gtk.CellAreaContext context);\n\t\tpublic virtual unowned Gtk.CellAreaContext create_context ();\n\t\tpublic virtual int event (Gtk.CellAreaContext context, Gtk.Widget widget, Gdk.Event event, Gdk.Rectangle cell_area, Gtk.CellRendererState flags);\n\t\t[CCode (cname = \"gtk_cell_area_class_find_cell_property\")]\n\t\tpublic class unowned GLib.ParamSpec find_cell_property (string property_name);\n\t\tpublic virtual bool focus (Gtk.DirectionType direction);\n\t\tpublic virtual void @foreach (Gtk.CellCallback callback);\n\t\tpublic virtual void foreach_alloc (Gtk.CellAreaContext context, Gtk.Widget widget, Gdk.Rectangle cell_area, Gdk.Rectangle background_area, Gtk.CellAllocCallback callback, void* callback_data);\n\t\tpublic void get_cell_allocation (Gtk.CellAreaContext context, Gtk.Widget widget, Gtk.CellRenderer renderer, Gdk.Rectangle cell_area, Gdk.Rectangle allocation);\n\t\tpublic unowned Gtk.CellRenderer get_cell_at_position (Gtk.CellAreaContext context, Gtk.Widget widget, Gdk.Rectangle cell_area, int x, int y, Gdk.Rectangle alloc_area);\n\t\t[NoWrapper]\n\t\tpublic virtual void get_cell_property (Gtk.CellRenderer renderer, uint property_id, GLib.Value value, GLib.ParamSpec pspec);\n\t\tpublic unowned string get_current_path_string ();\n\t\tpublic unowned Gtk.CellEditable get_edit_widget ();\n\t\tpublic unowned Gtk.CellRenderer get_edited_cell ();\n\t\tpublic unowned Gtk.CellRenderer get_focus_cell ();\n\t\tpublic unowned Gtk.CellRenderer get_focus_from_sibling (Gtk.CellRenderer renderer);\n\t\tpublic unowned GLib.List get_focus_siblings (Gtk.CellRenderer renderer);\n\t\tpublic virtual void get_preferred_height (Gtk.CellAreaContext context, Gtk.Widget widget, out int minimum_height, out int natural_height);\n\t\tpublic virtual void get_preferred_height_for_width (Gtk.CellAreaContext context, Gtk.Widget widget, int width, out int minimum_height, out int natural_height);\n\t\tpublic virtual void get_preferred_width (Gtk.CellAreaContext context, Gtk.Widget widget, out int minimum_width, out int natural_width);\n\t\tpublic virtual void get_preferred_width_for_height (Gtk.CellAreaContext context, Gtk.Widget widget, int height, out int minimum_width, out int natural_width);\n\t\tpublic virtual Gtk.SizeRequestMode get_request_mode ();\n\t\tpublic bool has_renderer (Gtk.CellRenderer renderer);\n\t\tpublic void inner_cell_area (Gtk.Widget widget, Gdk.Rectangle cell_area, Gdk.Rectangle inner_area);\n\t\t[CCode (cname = \"gtk_cell_area_class_install_cell_property\")]\n\t\tpublic class void install_cell_property (uint property_id, GLib.ParamSpec pspec);\n\t\tpublic virtual bool is_activatable ();\n\t\tpublic bool is_focus_sibling (Gtk.CellRenderer renderer, Gtk.CellRenderer sibling);\n\t\t[CCode (cname = \"gtk_cell_area_class_list_cell_properties\")]\n\t\tpublic class unowned GLib.ParamSpec list_cell_properties (uint n_properties);\n\t\tpublic virtual void remove (Gtk.CellRenderer renderer);\n\t\tpublic void remove_focus_sibling (Gtk.CellRenderer renderer, Gtk.CellRenderer sibling);\n\t\tpublic virtual void render (Gtk.CellAreaContext context, Gtk.Widget widget, Cairo.Context cr, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags, bool paint_focus);\n\t\tpublic void request_renderer (Gtk.CellRenderer renderer, Gtk.Orientation orientation, Gtk.Widget widget, int for_size, int minimum_size, int natural_size);\n\t\t[NoWrapper]\n\t\tpublic virtual void set_cell_property (Gtk.CellRenderer renderer, uint property_id, GLib.Value value, GLib.ParamSpec pspec);\n\t\tpublic void set_focus_cell (Gtk.CellRenderer renderer);\n\t\tpublic void stop_editing (bool canceled);\n\t\tpublic Gtk.CellEditable edit_widget { get; }\n\t\tpublic Gtk.CellRenderer edited_cell { get; }\n\t\tpublic Gtk.CellRenderer focus_cell { get; set; }\n\t\tpublic virtual signal void add_editable (Gtk.CellRenderer p0, Gtk.CellEditable p1, Gdk.Rectangle p2, string p3);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void apply_attributes (Gtk.TreeModel tree_model, Gtk.TreeIter iter, bool is_expander, bool is_expanded);\n\t\tpublic virtual signal void focus_changed (Gtk.CellRenderer p0, string p1);\n\t\tpublic virtual signal void remove_editable (Gtk.CellRenderer p0, Gtk.CellEditable p1);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellAreaBox : Gtk.CellArea, Gtk.CellLayout, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellArea*\")]\n\t\tpublic CellAreaBox ();\n\t\tpublic int get_spacing ();\n\t\tpublic void set_spacing (int spacing);\n\t\tpublic int spacing { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellAreaContext : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected CellAreaContext ();\n\t\tpublic virtual void allocate (int width, int height);\n\t\tpublic void get_allocation (int width, int height);\n\t\tpublic unowned Gtk.CellArea get_area ();\n\t\tpublic void get_preferred_height (out int minimum_height, out int natural_height);\n\t\tpublic virtual void get_preferred_height_for_width (int width, out int minimum_height, out int natural_height);\n\t\tpublic void get_preferred_width (out int minimum_width, out int natural_width);\n\t\tpublic virtual void get_preferred_width_for_height (int height, out int minimum_width, out int natural_width);\n\t\tpublic void push_preferred_height (int minimum_height, int natural_height);\n\t\tpublic void push_preferred_width (int minimum_width, int natural_width);\n\t\tpublic virtual void reset ();\n\t\tpublic Gtk.CellArea area { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int minimum_height { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic int minimum_width { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic int natural_height { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic int natural_width { get; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic abstract class CellRenderer : GLib.InitiallyUnowned {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected CellRenderer ();\n\t\tpublic virtual bool activate (Gdk.Event event, Gtk.Widget widget, string path, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags);\n\t\tpublic virtual Gdk.Rectangle get_aligned_area (Gtk.Widget widget, Gtk.CellRendererState flags, Gdk.Rectangle cell_area);\n\t\tpublic void get_alignment (out float xalign, out float yalign);\n\t\tpublic void get_fixed_size (out int width, out int height);\n\t\tpublic void get_padding (out int xpad, out int ypad);\n\t\tpublic virtual void get_preferred_height (Gtk.Widget widget, out int minimum_size, out int natural_size);\n\t\tpublic virtual void get_preferred_height_for_width (Gtk.Widget widget, int width, out int minimum_height, out int natural_height);\n\t\tpublic void get_preferred_size (Gtk.Widget widget, out Gtk.Requisition minimum_size, out Gtk.Requisition natural_size);\n\t\tpublic virtual void get_preferred_width (Gtk.Widget widget, out int minimum_size, out int natural_size);\n\t\tpublic virtual void get_preferred_width_for_height (Gtk.Widget widget, int height, out int minimum_width, out int natural_width);\n\t\tpublic virtual Gtk.SizeRequestMode get_request_mode ();\n\t\tpublic bool get_sensitive ();\n\t\t[Deprecated (replacement = \"get_preferred_size\", since = \"3.0\")]\n\t\tpublic abstract void get_size (Gtk.Widget widget, Gdk.Rectangle? cell_area, out int x_offset, out int y_offset, out int width, out int height);\n\t\tpublic Gtk.StateFlags get_state (Gtk.Widget widget, Gtk.CellRendererState cell_state);\n\t\tpublic bool get_visible ();\n\t\tpublic bool is_activatable ();\n\t\tpublic abstract void render (Cairo.Context cr, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags);\n\t\t[CCode (cname = \"gtk_cell_renderer_class_set_accessible_type\")]\n\t\tpublic class void set_accessible_type (GLib.Type type);\n\t\tpublic void set_alignment (float xalign, float yalign);\n\t\tpublic void set_fixed_size (int width, int height);\n\t\tpublic void set_padding (int xpad, int ypad);\n\t\tpublic void set_sensitive (bool sensitive);\n\t\tpublic void set_visible (bool visible);\n\t\tpublic virtual unowned Gtk.CellEditable start_editing (Gdk.Event event, Gtk.Widget widget, string path, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags);\n\t\tpublic void stop_editing (bool canceled);\n\t\t[NoAccessorMethod]\n\t\tpublic string cell_background { set; }\n\t\t[Deprecated (replacement = \"Gtk.CellRenderer.cell_background_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color cell_background_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA cell_background_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool cell_background_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool editing { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic int height { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool is_expanded { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool is_expander { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellRendererMode mode { get; set; }\n\t\tpublic bool sensitive { get; set; }\n\t\tpublic bool visible { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int width { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint xpad { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint ypad { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void editing_canceled ();\n\t\tpublic virtual signal void editing_started (Gtk.CellEditable editable, string path);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererAccel : Gtk.CellRendererText {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererAccel ();\n\t\t[NoAccessorMethod]\n\t\tpublic uint accel_key { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellRendererAccelMode accel_mode { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.ModifierType accel_mods { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint keycode { get; set; }\n\t\tpublic virtual signal void accel_cleared (string path_string);\n\t\tpublic virtual signal void accel_edited (string path_string, uint accel_key, Gdk.ModifierType accel_mods, uint hardware_keycode);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererCombo : Gtk.CellRendererText {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererCombo ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool has_entry { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TreeModel model { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int text_column { get; set; }\n\t\tpublic virtual signal void changed (string p0, Gtk.TreeIter p1);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererPixbuf : Gtk.CellRenderer {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererPixbuf ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool follow_state { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Icon gicon { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string icon_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf pixbuf { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf pixbuf_expander_closed { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf pixbuf_expander_open { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string stock_detail { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string stock_id { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint stock_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Cairo.Surface surface { owned get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererProgress : Gtk.CellRenderer, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererProgress ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool inverted { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int pulse { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float text_xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float text_yalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int value { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererSpin : Gtk.CellRendererText {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererSpin ();\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Adjustment adjustment { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic double climb_rate { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint digits { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererSpinner : Gtk.CellRenderer {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererSpinner ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool active { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint pulse { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.IconSize size { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererText : Gtk.CellRenderer {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererText ();\n\t\tpublic void set_fixed_height_from_font (int number_of_rows);\n\t\t[NoAccessorMethod]\n\t\tpublic bool align_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Alignment alignment { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.AttrList attributes { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string background { set; }\n\t\t[Deprecated (replacement = \"background_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color background_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA background_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool editable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool editable_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.EllipsizeMode ellipsize { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool ellipsize_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string family { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool family_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string font { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.FontDescription font_desc { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string foreground { set; }\n\t\t[Deprecated (replacement = \"foreground_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color foreground_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA foreground_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool foreground_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string language { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool language_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string markup { set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int max_width_chars { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string placeholder_text { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int rise { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool rise_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic double scale { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool scale_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool single_paragraph_mode { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic double size_points { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool size_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Stretch stretch { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool stretch_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool strikethrough { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool strikethrough_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Style style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool style_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Underline underline { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool underline_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Variant variant { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool variant_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int weight { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool weight_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int width_chars { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.WrapMode wrap_mode { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int wrap_width { get; set; }\n\t\tpublic virtual signal void edited (string path, string new_text);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellRendererToggle : Gtk.CellRenderer {\n\t\t[CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n\t\tpublic CellRendererToggle ();\n\t\tpublic bool get_activatable ();\n\t\tpublic bool get_active ();\n\t\tpublic bool get_radio ();\n\t\tpublic void set_activatable (bool setting);\n\t\tpublic void set_active (bool setting);\n\t\tpublic void set_radio (bool radio);\n\t\tpublic bool activatable { get; set; }\n\t\tpublic bool active { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool inconsistent { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int indicator_size { get; set; }\n\t\tpublic bool radio { get; set; }\n\t\tpublic virtual signal void toggled (string path);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CellView : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.CellLayout, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CellView ();\n\t\tpublic unowned Gtk.TreePath get_displayed_row ();\n\t\tpublic bool get_draw_sensitive ();\n\t\tpublic bool get_fit_model ();\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic bool get_size_of_row (Gtk.TreePath path, out Gtk.Requisition requisition);\n\t\t[Deprecated (replacement = \"set_background_rgba\", since = \"3.4\")]\n\t\tpublic void set_background_color (Gdk.Color color);\n\t\tpublic void set_background_rgba (Gdk.RGBA rgba);\n\t\tpublic void set_displayed_row (Gtk.TreePath path);\n\t\tpublic void set_draw_sensitive (bool draw_sensitive);\n\t\tpublic void set_fit_model (bool fit_model);\n\t\tpublic void set_model (Gtk.TreeModel? model);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CellView.with_context (Gtk.CellArea area, Gtk.CellAreaContext context);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CellView.with_markup (string markup);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CellView.with_pixbuf (Gdk.Pixbuf pixbuf);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CellView.with_text (string text);\n\t\t[NoAccessorMethod]\n\t\tpublic string background { set; }\n\t\t[Deprecated (replacement = \"background_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color background_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA background_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellArea cell_area { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellAreaContext cell_area_context { owned get; construct; }\n\t\tpublic bool draw_sensitive { get; set; }\n\t\tpublic bool fit_model { get; set; }\n\t\tpublic Gtk.TreeModel model { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CheckButton : Gtk.ToggleButton, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CheckButton ();\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_indicator (Cairo.Context cr);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CheckButton.with_label (string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CheckButton.with_mnemonic (string label);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CheckMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CheckMenuItem ();\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_indicator (Cairo.Context cr);\n\t\tpublic bool get_active ();\n\t\tpublic bool get_draw_as_radio ();\n\t\tpublic bool get_inconsistent ();\n\t\tpublic void set_active (bool is_active);\n\t\tpublic void set_draw_as_radio (bool draw_as_radio);\n\t\tpublic void set_inconsistent (bool setting);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CheckMenuItem.with_label (string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic CheckMenuItem.with_mnemonic (string label);\n\t\tpublic bool active { get; set; }\n\t\tpublic bool draw_as_radio { get; set; }\n\t\tpublic bool inconsistent { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void toggled ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CheckMenuItemAccessible : Gtk.MenuItemAccessible, Atk.Component, Atk.Action, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected CheckMenuItemAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Clipboard : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Clipboard ();\n\t\tpublic void clear ();\n\t\tpublic static unowned Gtk.Clipboard @get (Gdk.Atom selection);\n\t\tpublic unowned Gdk.Display get_display ();\n\t\tpublic static unowned Gtk.Clipboard get_for_display (Gdk.Display display, Gdk.Atom selection);\n\t\tpublic unowned GLib.Object get_owner ();\n\t\tpublic void request_contents (Gdk.Atom target, Gtk.ClipboardReceivedFunc callback);\n\t\tpublic void request_image (Gtk.ClipboardImageReceivedFunc callback);\n\t\tpublic void request_rich_text (Gtk.TextBuffer buffer, Gtk.ClipboardRichTextReceivedFunc callback);\n\t\tpublic void request_targets (Gtk.ClipboardTargetsReceivedFunc callback);\n\t\tpublic void request_text (Gtk.ClipboardTextReceivedFunc callback);\n\t\tpublic void request_uris (Gtk.ClipboardURIReceivedFunc callback);\n\t\tpublic void set_can_store (Gtk.TargetEntry[] targets);\n\t\tpublic void set_image (Gdk.Pixbuf pixbuf);\n\t\tpublic void set_text (string text, int len);\n\t\tpublic bool set_with_data (Gtk.TargetEntry[] targets, Gtk.ClipboardGetFunc get_func, Gtk.ClipboardClearFunc clear_func);\n\t\tpublic bool set_with_owner (Gtk.TargetEntry[] targets, Gtk.ClipboardGetFunc get_func, Gtk.ClipboardClearFunc clear_func, GLib.Object owner);\n\t\tpublic void store ();\n\t\tpublic Gtk.SelectionData? wait_for_contents (Gdk.Atom target);\n\t\tpublic Gdk.Pixbuf? wait_for_image ();\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic uint8[]? wait_for_rich_text (Gtk.TextBuffer buffer, out Gdk.Atom format);\n\t\tpublic bool wait_for_targets (out Gdk.Atom[] targets);\n\t\tpublic string? wait_for_text ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[]? wait_for_uris ();\n\t\tpublic bool wait_is_image_available ();\n\t\tpublic bool wait_is_rich_text_available (Gtk.TextBuffer buffer);\n\t\tpublic bool wait_is_target_available (Gdk.Atom target);\n\t\tpublic bool wait_is_text_available ();\n\t\tpublic bool wait_is_uris_available ();\n\t\tpublic virtual signal void owner_change (Gdk.Event p0);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ColorButton : Gtk.Button, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable, Gtk.ColorChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorButton ();\n\t\tpublic uint16 get_alpha ();\n\t\tpublic void get_color (out Gdk.Color color);\n\t\tpublic unowned string get_title ();\n\t\tpublic bool get_use_alpha ();\n\t\tpublic void set_alpha (uint16 alpha);\n\t\tpublic void set_color (Gdk.Color color);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_use_alpha (bool use_alpha);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorButton.with_color (Gdk.Color color);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorButton.with_rgba (Gdk.RGBA rgba);\n\t\tpublic uint alpha { get; set; }\n\t\t[Deprecated (replacement = \"rgba\", since = \"3.4\")]\n\t\tpublic Gdk.Color color { get; set; }\n\t\tpublic Gdk.RGBA rgba { get; set; }\n\t\tpublic string title { get; set; }\n\t\tpublic bool use_alpha { get; set; }\n\t\tpublic virtual signal void color_set ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ColorChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.ColorChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorChooserDialog (string? title, Gtk.Window? parent);\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_editor { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ColorChooserWidget : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.ColorChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorChooserWidget ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_editor { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ColorSelection : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorSelection ();\n\t\tpublic uint16 get_current_alpha ();\n\t\t[Deprecated (replacement = \"get_current_rgba\", since = \"3.4\")]\n\t\tpublic void get_current_color (out Gdk.Color color);\n\t\tpublic void get_current_rgba (Gdk.RGBA rgba);\n\t\tpublic bool get_has_opacity_control ();\n\t\tpublic bool get_has_palette ();\n\t\tpublic uint16 get_previous_alpha ();\n\t\tpublic void get_previous_color (out Gdk.Color color);\n\t\tpublic void get_previous_rgba (Gdk.RGBA rgba);\n\t\tpublic bool is_adjusting ();\n\t\tpublic static bool palette_from_string (string str, Gdk.Color[] colors);\n\t\tpublic static unowned string palette_to_string (Gdk.Color[] colors);\n\t\tpublic static unowned Gtk.ColorSelectionChangePaletteWithScreenFunc set_change_palette_with_screen_hook (Gtk.ColorSelectionChangePaletteWithScreenFunc func);\n\t\tpublic void set_current_alpha (uint16 alpha);\n\t\t[Deprecated (replacement = \"set_current_rgba\", since = \"3.4\")]\n\t\tpublic void set_current_color (Gdk.Color color);\n\t\tpublic void set_current_rgba (Gdk.RGBA rgba);\n\t\tpublic void set_has_opacity_control (bool has_opacity);\n\t\tpublic void set_has_palette (bool has_palette);\n\t\tpublic void set_previous_alpha (uint16 alpha);\n\t\tpublic void set_previous_color (Gdk.Color color);\n\t\tpublic void set_previous_rgba (Gdk.RGBA rgba);\n\t\tpublic uint current_alpha { get; set; }\n\t\tpublic Gdk.Color current_color { get; set; }\n\t\tpublic Gdk.RGBA current_rgba { get; set; }\n\t\tpublic bool has_opacity_control { get; set; }\n\t\tpublic bool has_palette { get; set; }\n\t\tpublic virtual signal void color_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ColorSelectionDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ColorSelectionDialog (string title);\n\t\tpublic unowned Gtk.ColorSelection get_color_selection ();\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Widget cancel_button { owned get; }\n\t\tpublic Gtk.Widget color_selection { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Widget help_button { owned get; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Widget ok_button { owned get; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ComboBox : Gtk.Bin, Atk.Implementor, Gtk.Buildable, Gtk.CellLayout, Gtk.CellEditable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBox ();\n\t\tpublic int get_active ();\n\t\tpublic unowned string get_active_id ();\n\t\tpublic bool get_active_iter (out Gtk.TreeIter iter);\n\t\tpublic bool get_add_tearoffs ();\n\t\tpublic Gtk.SensitivityType get_button_sensitivity ();\n\t\tpublic int get_column_span_column ();\n\t\tpublic int get_entry_text_column ();\n\t\tpublic bool get_focus_on_click ();\n\t\tpublic bool get_has_entry ();\n\t\tpublic int get_id_column ();\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic unowned Atk.Object get_popup_accessible ();\n\t\tpublic bool get_popup_fixed_width ();\n\t\tpublic unowned Gtk.TreeViewRowSeparatorFunc get_row_separator_func ();\n\t\tpublic int get_row_span_column ();\n\t\tpublic unowned string get_title ();\n\t\tpublic int get_wrap_width ();\n\t\tpublic void popup_for_device (Gdk.Device device);\n\t\tpublic void set_active (int index_);\n\t\tpublic bool set_active_id (string active_id);\n\t\tpublic void set_active_iter (Gtk.TreeIter iter);\n\t\tpublic void set_add_tearoffs (bool add_tearoffs);\n\t\tpublic void set_button_sensitivity (Gtk.SensitivityType sensitivity);\n\t\tpublic void set_column_span_column (int column_span);\n\t\tpublic void set_entry_text_column (int text_column);\n\t\tpublic void set_focus_on_click (bool focus_on_click);\n\t\tpublic void set_id_column (int id_column);\n\t\tpublic void set_model (Gtk.TreeModel? model);\n\t\tpublic void set_popup_fixed_width (bool fixed);\n\t\tpublic void set_row_separator_func (owned Gtk.TreeViewRowSeparatorFunc func);\n\t\tpublic void set_row_span_column (int row_span);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_wrap_width (int width);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBox.with_area (Gtk.CellArea area);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBox.with_area_and_entry (Gtk.CellArea area);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBox.with_entry ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBox.with_model (Gtk.TreeModel model);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBox.with_model_and_entry (Gtk.TreeModel model);\n\t\tpublic int active { get; set; }\n\t\tpublic string active_id { get; set; }\n\t\tpublic bool add_tearoffs { get; set; }\n\t\tpublic Gtk.SensitivityType button_sensitivity { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellArea cell_area { owned get; construct; }\n\t\tpublic int column_span_column { get; set; }\n\t\tpublic int entry_text_column { get; set; }\n\t\tpublic bool focus_on_click { get; set; }\n\t\tpublic bool has_entry { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool has_frame { get; set; }\n\t\tpublic int id_column { get; set; }\n\t\tpublic Gtk.TreeModel model { get; set; }\n\t\tpublic bool popup_fixed_width { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool popup_shown { get; }\n\t\tpublic int row_span_column { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string tearoff_title { owned get; set; }\n\t\tpublic int wrap_width { get; set; }\n\t\tpublic virtual signal void changed ();\n\t\tpublic virtual signal unowned string format_entry_text (string path);\n\t\tpublic virtual signal void move_active (Gtk.ScrollType p0);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool popdown ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void popup ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ComboBoxAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Action, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ComboBoxAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ComboBoxText : Gtk.ComboBox, Atk.Implementor, Gtk.Buildable, Gtk.CellLayout, Gtk.CellEditable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBoxText ();\n\t\tpublic void append (string id, string text);\n\t\tpublic void append_text (string text);\n\t\tpublic unowned string get_active_text ();\n\t\tpublic void insert (int position, string id, string text);\n\t\tpublic void insert_text (int position, string text);\n\t\tpublic void prepend (string id, string text);\n\t\tpublic void prepend_text (string text);\n\t\tpublic void remove (int position);\n\t\tpublic void remove_all ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ComboBoxText.with_entry ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Container : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Container ();\n\t\tpublic void add_with_properties (Gtk.Widget widget, ...);\n\t\tpublic void child_get (Gtk.Widget child, ...);\n\t\tpublic void child_get_property (Gtk.Widget child, string property_name, GLib.Value value);\n\t\tpublic void child_get_valist (Gtk.Widget child, string first_property_name, void* var_args);\n\t\tpublic void child_notify (Gtk.Widget child, string child_property);\n\t\tpublic void child_set (Gtk.Widget child, ...);\n\t\tpublic void child_set_property (Gtk.Widget child, string property_name, GLib.Value value);\n\t\tpublic void child_set_valist (Gtk.Widget child, string first_property_name, void* var_args);\n\t\tpublic virtual GLib.Type child_type ();\n\t\tpublic static unowned GLib.ParamSpec class_find_child_property (GLib.ObjectClass cclass, string property_name);\n\t\tpublic static unowned GLib.ParamSpec class_list_child_properties (GLib.ObjectClass cclass, uint n_properties);\n\t\t[NoWrapper]\n\t\tpublic virtual unowned string composite_name (Gtk.Widget child);\n\t\tpublic void forall (Gtk.Callback callback);\n\t\t[CCode (vfunc_name = \"forall\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void forall_internal (bool include_internal, Gtk.Callback callback);\n\t\tpublic void @foreach (Gtk.Callback callback);\n\t\tpublic uint get_border_width ();\n\t\t[NoWrapper]\n\t\tpublic virtual void get_child_property (Gtk.Widget child, uint property_id, GLib.Value value, GLib.ParamSpec pspec);\n\t\tpublic GLib.List<weak Gtk.Widget> get_children ();\n\t\tpublic bool get_focus_chain (out GLib.List<Gtk.Widget> focusable_widgets);\n\t\tpublic unowned Gtk.Widget get_focus_child ();\n\t\tpublic unowned Gtk.Adjustment get_focus_hadjustment ();\n\t\tpublic unowned Gtk.Adjustment get_focus_vadjustment ();\n\t\tpublic virtual unowned Gtk.WidgetPath get_path_for_child (Gtk.Widget child);\n\t\tpublic Gtk.ResizeMode get_resize_mode ();\n\t\t[CCode (cname = \"gtk_container_class_handle_border_width\")]\n\t\tpublic class void handle_border_width ();\n\t\t[CCode (cname = \"gtk_container_class_install_child_property\")]\n\t\tpublic class void install_child_property (uint property_id, GLib.ParamSpec pspec);\n\t\tpublic void propagate_draw (Gtk.Widget child, Cairo.Context cr);\n\t\tpublic void resize_children ();\n\t\tpublic void set_border_width (uint border_width);\n\t\t[NoWrapper]\n\t\tpublic virtual void set_child_property (Gtk.Widget child, uint property_id, GLib.Value value, GLib.ParamSpec pspec);\n\t\tpublic void set_focus_chain (GLib.List<Gtk.Widget> focusable_widgets);\n\t\tpublic void set_focus_hadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_focus_vadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_reallocate_redraws (bool needs_redraws);\n\t\tpublic void set_resize_mode (Gtk.ResizeMode resize_mode);\n\t\tpublic void unset_focus_chain ();\n\t\tpublic uint border_width { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Widget child { set; }\n\t\tpublic Gtk.ResizeMode resize_mode { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void add (Gtk.Widget widget);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void check_resize ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void remove (Gtk.Widget widget);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void set_focus_child (Gtk.Widget? child);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ContainerAccessible : Gtk.WidgetAccessible, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ContainerAccessible ();\n\t\t[NoWrapper]\n\t\tpublic virtual int add_gtk (Gtk.Container container, Gtk.Widget widget, void* data);\n\t\t[NoWrapper]\n\t\tpublic virtual int remove_gtk (Gtk.Container container, Gtk.Widget widget, void* data);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ContainerCellAccessible : Gtk.CellAccessible, Atk.Action, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContainerCellAccessible ();\n\t\tpublic void add_child (Gtk.CellAccessible child);\n\t\tpublic unowned GLib.List get_children ();\n\t\tpublic void remove_child (Gtk.CellAccessible child);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class CssProvider : GLib.Object, Gtk.StyleProvider {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic CssProvider ();\n\t\tpublic static GLib.Quark error_quark ();\n\t\tpublic static unowned Gtk.CssProvider get_default ();\n\t\tpublic static unowned Gtk.CssProvider get_named (string name, string? variant);\n\t\tpublic bool load_from_data (string data, ssize_t length) throws GLib.Error;\n\t\tpublic bool load_from_file (GLib.File file) throws GLib.Error;\n\t\tpublic bool load_from_path (string path) throws GLib.Error;\n\t\tpublic unowned string to_string ();\n\t\tpublic virtual signal void parsing_error (Gtk.CssSection section, GLib.Error error);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_css_section_ref\", type_id = \"gtk_css_section_get_type ()\", unref_function = \"gtk_css_section_unref\")]\n\t[Compact]\n\tpublic class CssSection {\n\t\tpublic uint get_end_line ();\n\t\tpublic uint get_end_position ();\n\t\tpublic unowned GLib.File get_file ();\n\t\tpublic unowned Gtk.CssSection get_parent ();\n\t\tpublic Gtk.CssSectionType get_section_type ();\n\t\tpublic uint get_start_line ();\n\t\tpublic uint get_start_position ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Dialog : Gtk.Window, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Dialog ();\n\t\tpublic void add_action_widget (Gtk.Widget child, int response_id);\n\t\tpublic unowned Gtk.Widget add_button (string button_text, int response_id);\n\t\tpublic void add_buttons (...);\n\t\tpublic unowned Gtk.Widget get_action_area ();\n\t\t[CCode (type = \"GtkWidget*\")]\n\t\tpublic unowned Gtk.Box get_content_area ();\n\t\tpublic int get_response_for_widget (Gtk.Widget widget);\n\t\tpublic unowned Gtk.Widget get_widget_for_response (int response_id);\n\t\tpublic int run ();\n\t\t[CCode (sentinel = \"-1\")]\n\t\tpublic void set_alternative_button_order (...);\n\t\tpublic void set_alternative_button_order_from_array (int n_params, int new_order);\n\t\tpublic void set_default_response (int response_id);\n\t\tpublic void set_response_sensitive (int response_id, bool setting);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Dialog.with_buttons (string? title, Gtk.Window? parent, Gtk.DialogFlags flags, ...);\n\t\tpublic virtual signal void close ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void response (int response_id);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class DrawingArea : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\tpublic void* dummy;\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic DrawingArea ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Entry : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Editable, Gtk.CellEditable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Entry ();\n\t\tpublic bool get_activates_default ();\n\t\tpublic float get_alignment ();\n\t\tpublic unowned Pango.AttrList get_attributes ();\n\t\tpublic unowned Gtk.EntryBuffer get_buffer ();\n\t\tpublic unowned Gtk.EntryCompletion get_completion ();\n\t\tpublic int get_current_icon_drag_source ();\n\t\tpublic unowned Gtk.Adjustment get_cursor_hadjustment ();\n\t\t[NoWrapper]\n\t\tpublic virtual void get_frame_size (int x, int y, int width, int height);\n\t\tpublic bool get_has_frame ();\n\t\tpublic bool get_icon_activatable (Gtk.EntryIconPosition icon_pos);\n\t\tpublic void get_icon_area (Gtk.EntryIconPosition icon_pos, Gdk.Rectangle icon_area);\n\t\tpublic int get_icon_at_pos (int x, int y);\n\t\tpublic unowned GLib.Icon get_icon_gicon (Gtk.EntryIconPosition icon_pos);\n\t\tpublic unowned string get_icon_name (Gtk.EntryIconPosition icon_pos);\n\t\tpublic unowned Gdk.Pixbuf get_icon_pixbuf (Gtk.EntryIconPosition icon_pos);\n\t\tpublic bool get_icon_sensitive (Gtk.EntryIconPosition icon_pos);\n\t\tpublic unowned string get_icon_stock (Gtk.EntryIconPosition icon_pos);\n\t\tpublic Gtk.ImageType get_icon_storage_type (Gtk.EntryIconPosition icon_pos);\n\t\tpublic unowned string get_icon_tooltip_markup (Gtk.EntryIconPosition icon_pos);\n\t\tpublic unowned string get_icon_tooltip_text (Gtk.EntryIconPosition icon_pos);\n\t\tpublic unowned Gtk.Border? get_inner_border ();\n\t\tpublic Gtk.InputHints get_input_hints ();\n\t\tpublic Gtk.InputPurpose get_input_purpose ();\n\t\tpublic unichar get_invisible_char ();\n\t\tpublic unowned Pango.Layout get_layout ();\n\t\tpublic void get_layout_offsets (out int x, out int y);\n\t\tpublic int get_max_length ();\n\t\tpublic bool get_overwrite_mode ();\n\t\tpublic unowned string get_placeholder_text ();\n\t\tpublic double get_progress_fraction ();\n\t\tpublic double get_progress_pulse_step ();\n\t\tpublic unowned Pango.TabArray? get_tabs ();\n\t\tpublic unowned string get_text ();\n\t\tpublic void get_text_area (out Gdk.Rectangle text_area);\n\t\t[NoWrapper]\n\t\tpublic virtual void get_text_area_size (out int x, out int y, out int width, out int height);\n\t\tpublic uint16 get_text_length ();\n\t\tpublic bool get_visibility ();\n\t\tpublic int get_width_chars ();\n\t\tpublic bool im_context_filter_keypress (Gdk.EventKey event);\n\t\tpublic int layout_index_to_text_index (int layout_index);\n\t\tpublic void progress_pulse ();\n\t\tpublic void reset_im_context ();\n\t\tpublic void set_activates_default (bool setting);\n\t\tpublic void set_alignment (float xalign);\n\t\tpublic void set_attributes (Pango.AttrList attrs);\n\t\tpublic void set_buffer (Gtk.EntryBuffer buffer);\n\t\tpublic void set_completion (Gtk.EntryCompletion completion);\n\t\tpublic void set_cursor_hadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_has_frame (bool setting);\n\t\tpublic void set_icon_activatable (Gtk.EntryIconPosition icon_pos, bool activatable);\n\t\tpublic void set_icon_drag_source (Gtk.EntryIconPosition icon_pos, Gtk.TargetList target_list, Gdk.DragAction actions);\n\t\tpublic void set_icon_from_gicon (Gtk.EntryIconPosition icon_pos, GLib.Icon? icon);\n\t\tpublic void set_icon_from_icon_name (Gtk.EntryIconPosition icon_pos, string? icon_name);\n\t\tpublic void set_icon_from_pixbuf (Gtk.EntryIconPosition icon_pos, Gdk.Pixbuf? pixbuf);\n\t\tpublic void set_icon_from_stock (Gtk.EntryIconPosition icon_pos, string? stock_id);\n\t\tpublic void set_icon_sensitive (Gtk.EntryIconPosition icon_pos, bool sensitive);\n\t\tpublic void set_icon_tooltip_markup (Gtk.EntryIconPosition icon_pos, string? tooltip);\n\t\tpublic void set_icon_tooltip_text (Gtk.EntryIconPosition icon_pos, string? tooltip);\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic void set_inner_border (Gtk.Border border);\n\t\tpublic void set_input_hints (Gtk.InputHints hints);\n\t\tpublic void set_input_purpose (Gtk.InputPurpose purpose);\n\t\tpublic void set_invisible_char (unichar ch);\n\t\tpublic void set_max_length (int max);\n\t\tpublic void set_overwrite_mode (bool overwrite);\n\t\tpublic void set_placeholder_text (string text);\n\t\tpublic void set_progress_fraction (double fraction);\n\t\tpublic void set_progress_pulse_step (double fraction);\n\t\tpublic void set_tabs (Pango.TabArray tabs);\n\t\tpublic void set_text (string text);\n\t\tpublic void set_visibility (bool visible);\n\t\tpublic void set_width_chars (int n_chars);\n\t\tpublic int text_index_to_layout_index (int text_index);\n\t\tpublic void unset_invisible_char ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Entry.with_buffer (Gtk.EntryBuffer buffer);\n\t\tpublic bool activates_default { get; set; }\n\t\tpublic Pango.AttrList attributes { get; set; }\n\t\tpublic Gtk.EntryBuffer buffer { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool caps_lock_warning { get; set; }\n\t\tpublic Gtk.EntryCompletion completion { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int cursor_position { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool editable { get; set; }\n\t\tpublic bool has_frame { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string im_module { owned get; set; }\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic Gtk.Border inner_border { get; set; }\n\t\tpublic Gtk.InputHints input_hints { get; set; }\n\t\tpublic Gtk.InputPurpose input_purpose { get; set; }\n\t\tpublic uint invisible_char { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool invisible_char_set { get; set; }\n\t\tpublic int max_length { get; set; }\n\t\tpublic bool overwrite_mode { get; set; }\n\t\tpublic string placeholder_text { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool populate_all { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool primary_icon_activatable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Icon primary_icon_gicon { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string primary_icon_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf primary_icon_pixbuf { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool primary_icon_sensitive { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string primary_icon_stock { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ImageType primary_icon_storage_type { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic string primary_icon_tooltip_markup { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string primary_icon_tooltip_text { owned get; set; }\n\t\tpublic double progress_fraction { get; set; }\n\t\tpublic double progress_pulse_step { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int scroll_offset { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool secondary_icon_activatable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Icon secondary_icon_gicon { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string secondary_icon_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf secondary_icon_pixbuf { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool secondary_icon_sensitive { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string secondary_icon_stock { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ImageType secondary_icon_storage_type { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic string secondary_icon_tooltip_markup { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string secondary_icon_tooltip_text { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int selection_bound { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ShadowType shadow_type { get; set; }\n\t\tpublic Pango.TabArray tabs { get; set; }\n\t\tpublic string text { get; set; }\n\t\tpublic uint text_length { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool truncate_multiline { get; set; }\n\t\tpublic bool visibility { get; set; }\n\t\tpublic int width_chars { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set; }\n\t\tpublic virtual signal void activate ();\n\t\tpublic virtual signal void backspace ();\n\t\tpublic virtual signal void copy_clipboard ();\n\t\tpublic virtual signal void cut_clipboard ();\n\t\tpublic virtual signal void delete_from_cursor (Gtk.DeleteType type, int count);\n\t\tpublic virtual signal void icon_press (Gtk.EntryIconPosition p0, Gdk.Event p1);\n\t\tpublic virtual signal void icon_release (Gtk.EntryIconPosition p0, Gdk.Event p1);\n\t\tpublic virtual signal void insert_at_cursor (string str);\n\t\tpublic virtual signal void move_cursor (Gtk.MovementStep step, int count, bool extend_selection);\n\t\tpublic virtual signal void paste_clipboard ();\n\t\tpublic virtual signal void populate_popup (Gtk.Menu popup);\n\t\tpublic virtual signal void preedit_changed (string p0);\n\t\tpublic virtual signal void toggle_overwrite ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class EntryAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.EditableText, Atk.Text, Atk.Action {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected EntryAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class EntryBuffer : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic EntryBuffer (uint8[] initial_chars);\n\t\tpublic virtual uint delete_text (uint position, int n_chars);\n\t\tpublic void emit_deleted_text (uint position, uint n_chars);\n\t\tpublic void emit_inserted_text (uint position, uint8[] chars);\n\t\tpublic size_t get_bytes ();\n\t\tpublic virtual uint get_length ();\n\t\tpublic int get_max_length ();\n\t\tpublic virtual unowned string get_text ();\n\t\tpublic virtual uint insert_text (uint position, uint8[] chars);\n\t\tpublic void set_max_length (int max_length);\n\t\tpublic void set_text (uint8[] chars);\n\t\tpublic uint length { get; }\n\t\tpublic int max_length { get; set; }\n\t\tpublic string text { get; set; }\n\t\tpublic virtual signal void deleted_text (uint position, uint n_chars);\n\t\tpublic virtual signal void inserted_text (uint position, string chars, uint n_chars);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class EntryCompletion : GLib.Object, Gtk.CellLayout, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic EntryCompletion ();\n\t\tpublic void complete ();\n\t\tpublic unowned string compute_prefix (string key);\n\t\tpublic void delete_action (int index_);\n\t\tpublic unowned string get_completion_prefix ();\n\t\tpublic unowned Gtk.Widget get_entry ();\n\t\tpublic bool get_inline_completion ();\n\t\tpublic bool get_inline_selection ();\n\t\tpublic int get_minimum_key_length ();\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic bool get_popup_completion ();\n\t\tpublic bool get_popup_set_width ();\n\t\tpublic bool get_popup_single_match ();\n\t\tpublic int get_text_column ();\n\t\tpublic void insert_action_markup (int index_, string markup);\n\t\tpublic void insert_action_text (int index_, string text);\n\t\tpublic void set_inline_completion (bool inline_completion);\n\t\tpublic void set_inline_selection (bool inline_selection);\n\t\tpublic void set_match_func (owned Gtk.EntryCompletionMatchFunc func);\n\t\tpublic void set_minimum_key_length (int length);\n\t\tpublic void set_model (Gtk.TreeModel? model);\n\t\tpublic void set_popup_completion (bool popup_completion);\n\t\tpublic void set_popup_set_width (bool popup_set_width);\n\t\tpublic void set_popup_single_match (bool popup_single_match);\n\t\tpublic void set_text_column (int column);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic EntryCompletion.with_area (Gtk.CellArea area);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellArea cell_area { owned get; construct; }\n\t\tpublic bool inline_completion { get; set; }\n\t\tpublic bool inline_selection { get; set; }\n\t\tpublic int minimum_key_length { get; set; }\n\t\tpublic Gtk.TreeModel model { get; set; }\n\t\tpublic bool popup_completion { get; set; }\n\t\tpublic bool popup_set_width { get; set; }\n\t\tpublic bool popup_single_match { get; set; }\n\t\tpublic int text_column { get; set; }\n\t\tpublic virtual signal void action_activated (int index_);\n\t\tpublic virtual signal bool cursor_on_match (Gtk.TreeModel model, Gtk.TreeIter iter);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool insert_prefix (string prefix);\n\t\tpublic virtual signal bool match_selected (Gtk.TreeModel model, Gtk.TreeIter iter);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class EntryIconAccessible : Atk.Object, Atk.Action, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected EntryIconAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class EventBox : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic EventBox ();\n\t\tpublic bool get_above_child ();\n\t\tpublic bool get_visible_window ();\n\t\tpublic void set_above_child (bool above_child);\n\t\tpublic void set_visible_window (bool visible_window);\n\t\tpublic bool above_child { get; set; }\n\t\tpublic bool visible_window { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Expander : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Expander (string label);\n\t\tpublic bool get_expanded ();\n\t\tpublic unowned string get_label ();\n\t\tpublic bool get_label_fill ();\n\t\tpublic unowned Gtk.Widget get_label_widget ();\n\t\tpublic bool get_resize_toplevel ();\n\t\tpublic int get_spacing ();\n\t\tpublic bool get_use_markup ();\n\t\tpublic bool get_use_underline ();\n\t\tpublic void set_expanded (bool expanded);\n\t\tpublic void set_label (string label);\n\t\tpublic void set_label_fill (bool label_fill);\n\t\tpublic void set_label_widget (Gtk.Widget label_widget);\n\t\tpublic void set_resize_toplevel (bool resize_toplevel);\n\t\tpublic void set_spacing (int spacing);\n\t\tpublic void set_use_markup (bool use_markup);\n\t\tpublic void set_use_underline (bool use_underline);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Expander.with_mnemonic (string label);\n\t\tpublic bool expanded { get; set construct; }\n\t\tpublic string label { get; set construct; }\n\t\tpublic bool label_fill { get; set construct; }\n\t\tpublic Gtk.Widget label_widget { get; set; }\n\t\tpublic bool resize_toplevel { get; set; }\n\t\tpublic int spacing { get; set; }\n\t\tpublic bool use_markup { get; set construct; }\n\t\tpublic bool use_underline { get; set construct; }\n\t\tpublic virtual signal void activate ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ExpanderAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Action {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ExpanderAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FileChooserButton : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.FileChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FileChooserButton (string title, Gtk.FileChooserAction action);\n\t\tpublic bool get_focus_on_click ();\n\t\tpublic unowned string get_title ();\n\t\tpublic int get_width_chars ();\n\t\tpublic void set_focus_on_click (bool focus_on_click);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_width_chars (int n_chars);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FileChooserButton.with_dialog (Gtk.Dialog dialog);\n\t\tpublic Gtk.FileChooser dialog { construct; }\n\t\tpublic bool focus_on_click { get; set; }\n\t\tpublic string title { get; set; }\n\t\tpublic int width_chars { get; set; }\n\t\tpublic virtual signal void file_set ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FileChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.FileChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FileChooserDialog (string? title, Gtk.Window? parent, Gtk.FileChooserAction action, ...);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FileChooserWidget : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.FileChooser, Gtk.FileChooserEmbed {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FileChooserWidget (Gtk.FileChooserAction action);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FileFilter : GLib.InitiallyUnowned, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic FileFilter ();\n\t\tpublic void add_custom (Gtk.FileFilterFlags needed, owned Gtk.FileFilterFunc func);\n\t\tpublic void add_mime_type (string mime_type);\n\t\tpublic void add_pattern (string pattern);\n\t\tpublic void add_pixbuf_formats ();\n\t\tpublic bool filter (Gtk.FileFilterInfo filter_info);\n\t\t[CCode (cname = \"gtk_file_filter_get_name\")]\n\t\tpublic unowned string get_filter_name ();\n\t\tpublic Gtk.FileFilterFlags get_needed ();\n\t\t[CCode (cname = \"gtk_file_filter_set_name\")]\n\t\tpublic void set_filter_name (string name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class FileFilterInfo {\n\t\tpublic Gtk.FileFilterFlags contains;\n\t\tpublic weak string display_name;\n\t\tpublic weak string filename;\n\t\tpublic weak string mime_type;\n\t\tpublic weak string uri;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Fixed : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Fixed ();\n\t\tpublic void move (Gtk.Widget widget, int x, int y);\n\t\tpublic void put (Gtk.Widget widget, int x, int y);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class FixedChild {\n\t\tpublic weak Gtk.Widget widget;\n\t\tpublic int x;\n\t\tpublic int y;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FontButton : Gtk.Button, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable, Gtk.FontChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FontButton ();\n\t\tpublic unowned string get_font_name ();\n\t\tpublic bool get_show_size ();\n\t\tpublic bool get_show_style ();\n\t\tpublic unowned string get_title ();\n\t\tpublic bool get_use_font ();\n\t\tpublic bool get_use_size ();\n\t\tpublic bool set_font_name (string fontname);\n\t\tpublic void set_show_size (bool show_size);\n\t\tpublic void set_show_style (bool show_style);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_use_font (bool use_font);\n\t\tpublic void set_use_size (bool use_size);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FontButton.with_font (string fontname);\n\t\tpublic string font_name { get; set; }\n\t\tpublic bool show_size { get; set; }\n\t\tpublic bool show_style { get; set; }\n\t\tpublic string title { get; set; }\n\t\tpublic bool use_font { get; set; }\n\t\tpublic bool use_size { get; set; }\n\t\tpublic virtual signal void font_set ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FontChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.FontChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FontChooserDialog (string? title, Gtk.Window? parent);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FontChooserWidget : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.FontChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FontChooserWidget ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FontSelection : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FontSelection ();\n\t\tpublic unowned Pango.FontFace get_face ();\n\t\tpublic unowned Gtk.Widget get_face_list ();\n\t\tpublic unowned Pango.FontFamily get_family ();\n\t\tpublic unowned Gtk.Widget get_family_list ();\n\t\tpublic unowned string get_font_name ();\n\t\tpublic unowned Gtk.Widget get_preview_entry ();\n\t\tpublic unowned string get_preview_text ();\n\t\tpublic int get_size ();\n\t\tpublic unowned Gtk.Widget get_size_entry ();\n\t\tpublic unowned Gtk.Widget get_size_list ();\n\t\tpublic bool set_font_name (string fontname);\n\t\tpublic void set_preview_text (string text);\n\t\tpublic string font_name { get; set; }\n\t\tpublic string preview_text { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"FontChooserDialog\", since = \"3.2\")]\n\tpublic class FontSelectionDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic FontSelectionDialog (string title);\n\t\tpublic unowned Gtk.Widget get_cancel_button ();\n\t\tpublic unowned string get_font_name ();\n\t\tpublic unowned Gtk.Widget get_font_selection ();\n\t\tpublic unowned Gtk.Widget get_ok_button ();\n\t\tpublic unowned string get_preview_text ();\n\t\tpublic bool set_font_name (string fontname);\n\t\tpublic void set_preview_text (string text);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Frame : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Frame (string? label);\n\t\t[NoWrapper]\n\t\tpublic virtual void compute_child_allocation (Gtk.Allocation allocation);\n\t\tpublic unowned string get_label ();\n\t\tpublic void get_label_align (float xalign, float yalign);\n\t\tpublic unowned Gtk.Widget? get_label_widget ();\n\t\tpublic Gtk.ShadowType get_shadow_type ();\n\t\tpublic void set_label (string? label);\n\t\tpublic void set_label_align (float xalign, float yalign);\n\t\tpublic void set_label_widget (Gtk.Widget? label_widget);\n\t\tpublic void set_shadow_type (Gtk.ShadowType type);\n\t\tpublic string label { get; set; }\n\t\tpublic Gtk.Widget label_widget { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float label_xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float label_yalign { get; set; }\n\t\tpublic Gtk.ShadowType shadow_type { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class FrameAccessible : Gtk.ContainerAccessible, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected FrameAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_gradient_ref\", type_id = \"gtk_gradient_get_type ()\", unref_function = \"gtk_gradient_unref\")]\n\t[Compact]\n\tpublic class Gradient {\n\t\tpublic void add_color_stop (double offset, Gtk.SymbolicColor color);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Gradient.linear (double x0, double y0, double x1, double y1);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Gradient.radial (double x0, double y0, double radius0, double x1, double y1, double radius1);\n\t\tpublic bool resolve (Gtk.StyleProperties props, out unowned Cairo.Pattern resolved_gradient);\n\t\tpublic unowned Cairo.Pattern resolve_for_context (Gtk.StyleContext context);\n\t\tpublic unowned string to_string ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Grid : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Grid ();\n\t\tpublic void attach (Gtk.Widget child, int left, int top, int width, int height);\n\t\tpublic void attach_next_to (Gtk.Widget child, Gtk.Widget? sibling, Gtk.PositionType side, int width, int height);\n\t\tpublic int get_baseline_row ();\n\t\tpublic unowned Gtk.Widget get_child_at (int left, int top);\n\t\tpublic bool get_column_homogeneous ();\n\t\tpublic uint get_column_spacing ();\n\t\tpublic Gtk.BaselinePosition get_row_baseline_position (int row);\n\t\tpublic bool get_row_homogeneous ();\n\t\tpublic uint get_row_spacing ();\n\t\tpublic void insert_column (int position);\n\t\tpublic void insert_next_to (Gtk.Widget sibling, Gtk.PositionType side);\n\t\tpublic void insert_row (int position);\n\t\tpublic void remove_column (int position);\n\t\tpublic void remove_row (int position);\n\t\tpublic void set_baseline_row (int row);\n\t\tpublic void set_column_homogeneous (bool homogeneous);\n\t\tpublic void set_column_spacing (uint spacing);\n\t\tpublic void set_row_baseline_position (int row, Gtk.BaselinePosition pos);\n\t\tpublic void set_row_homogeneous (bool homogeneous);\n\t\tpublic void set_row_spacing (uint spacing);\n\t\tpublic int baseline_row { get; set; }\n\t\tpublic bool column_homogeneous { get; set; }\n\t\tpublic int column_spacing { get; set; }\n\t\tpublic bool row_homogeneous { get; set; }\n\t\tpublic int row_spacing { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Grid\", since = \"3.2\")]\n\tpublic class HBox : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HBox (bool homogeneous, int spacing);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class HButtonBox : Gtk.ButtonBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HButtonBox ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Paned\", since = \"3.2\")]\n\tpublic class HPaned : Gtk.Paned, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HPaned ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class HSV : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HSV ();\n\t\tpublic void get_color (out double h, out double s, out double v);\n\t\tpublic void get_metrics (out int size, out int ring_width);\n\t\tpublic bool is_adjusting ();\n\t\tpublic void set_color (double h, double s, double v);\n\t\tpublic void set_metrics (int size, int ring_width);\n\t\tpublic static void to_rgb (double h, double s, double v, out double r, out double g, out double b);\n\t\tpublic virtual signal void changed ();\n\t\tpublic virtual signal void move (Gtk.DirectionType type);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.2\")]\n\tpublic class HScale : Gtk.Scale, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HScale (Gtk.Adjustment? adjustment);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HScale.with_range (double min, double max, double step);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.2\")]\n\tpublic class HScrollbar : Gtk.Scrollbar, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HScrollbar (Gtk.Adjustment? adjustment);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Separator\", since = \"3.2\")]\n\tpublic class HSeparator : Gtk.Separator, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HSeparator ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.4\")]\n\tpublic class HandleBox : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HandleBox ();\n\t\tpublic bool get_child_detached ();\n\t\tpublic Gtk.PositionType get_handle_position ();\n\t\tpublic Gtk.ShadowType get_shadow_type ();\n\t\tpublic Gtk.PositionType get_snap_edge ();\n\t\tpublic void set_handle_position (Gtk.PositionType position);\n\t\tpublic void set_shadow_type (Gtk.ShadowType type);\n\t\tpublic void set_snap_edge (Gtk.PositionType edge);\n\t\tpublic bool child_detached { get; }\n\t\tpublic Gtk.PositionType handle_position { get; set; }\n\t\tpublic Gtk.ShadowType shadow_type { get; set; }\n\t\tpublic Gtk.PositionType snap_edge { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool snap_edge_set { get; set; }\n\t\tpublic virtual signal void child_attached (Gtk.Widget child);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class HeaderBar : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic HeaderBar ();\n\t\tpublic unowned Gtk.Widget get_custom_title ();\n\t\tpublic bool get_show_close_button ();\n\t\tpublic unowned string get_subtitle ();\n\t\tpublic unowned string get_title ();\n\t\tpublic void pack_end (Gtk.Widget child);\n\t\tpublic void pack_start (Gtk.Widget child);\n\t\tpublic void set_custom_title (Gtk.Widget title_widget);\n\t\tpublic void set_show_close_button (bool setting);\n\t\tpublic void set_subtitle (string? subtitle);\n\t\tpublic void set_title (string title);\n\t\tpublic Gtk.Widget custom_title { get; set construct; }\n\t\tpublic bool show_close_button { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int spacing { get; set; }\n\t\tpublic string subtitle { get; set; }\n\t\tpublic string title { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h,gtk/gtkimmodule.h\")]\n\tpublic class IMContext : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected IMContext ();\n\t\tpublic virtual bool filter_keypress (Gdk.EventKey event);\n\t\tpublic virtual void focus_in ();\n\t\tpublic virtual void focus_out ();\n\t\tpublic virtual void get_preedit_string (out unowned string str, out Pango.AttrList attrs, out int cursor_pos);\n\t\tpublic virtual bool get_surrounding (out unowned string text, out int cursor_index);\n\t\tpublic virtual void reset ();\n\t\tpublic virtual void set_client_window (Gdk.Window window);\n\t\tpublic virtual void set_cursor_location (Gdk.Rectangle area);\n\t\tpublic virtual void set_surrounding (string text, int len, int cursor_index);\n\t\tpublic virtual void set_use_preedit (bool use_preedit);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.InputHints input_hints { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.InputPurpose input_purpose { get; set; }\n\t\tpublic virtual signal void commit (string str);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool delete_surrounding (int offset, int n_chars);\n\t\tpublic virtual signal void preedit_changed ();\n\t\tpublic virtual signal void preedit_end ();\n\t\tpublic virtual signal void preedit_start ();\n\t\tpublic virtual signal bool retrieve_surrounding ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class IMContextSimple : Gtk.IMContext {\n\t\t[CCode (has_construct_function = false, type = \"GtkIMContext*\")]\n\t\tpublic IMContextSimple ();\n\t\tpublic void add_table (uint16 data, int max_seq_len, int n_seqs);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class IMMulticontext : Gtk.IMContext {\n\t\t[CCode (has_construct_function = false, type = \"GtkIMContext*\")]\n\t\tpublic IMMulticontext ();\n\t\tpublic void append_menuitems (Gtk.MenuShell menushell);\n\t\tpublic unowned string get_context_id ();\n\t\tpublic void set_context_id (string context_id);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.IconTheme\", since = \"3.10\")]\n\tpublic class IconFactory : GLib.Object, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic IconFactory ();\n\t\tpublic void add (string stock_id, Gtk.IconSet icon_set);\n\t\tpublic void add_default ();\n\t\tpublic unowned Gtk.IconSet lookup (string stock_id);\n\t\tpublic static unowned Gtk.IconSet lookup_default (string stock_id);\n\t\tpublic void remove_default ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", copy_function = \"gtk_icon_info_copy\", free_function = \"gtk_icon_info_free\")]\n\t[Compact]\n\tpublic class IconInfo {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected IconInfo ();\n\t\tpublic Gtk.IconInfo copy ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic IconInfo.for_pixbuf (Gtk.IconTheme icon_theme, Gdk.Pixbuf pixbuf);\n\t\tpublic void free ();\n\t\tpublic bool get_attach_points (Gdk.Point[] points);\n\t\tpublic int get_base_scale ();\n\t\tpublic int get_base_size ();\n\t\tpublic unowned Gdk.Pixbuf get_builtin_pixbuf ();\n\t\tpublic unowned string get_display_name ();\n\t\tpublic bool get_embedded_rect (out Gdk.Rectangle rectangle);\n\t\tpublic unowned string get_filename ();\n\t\tpublic Gdk.Pixbuf load_icon () throws GLib.Error;\n\t\tpublic async Gdk.Pixbuf load_icon_async (GLib.Cancellable? cancellable = null) throws GLib.Error;\n\t\tpublic Cairo.Surface load_surface (Gdk.Window for_window) throws GLib.Error;\n\t\tpublic Gdk.Pixbuf load_symbolic (Gdk.RGBA fg, Gdk.RGBA? success_color = null, Gdk.RGBA? warning_color = null, Gdk.RGBA? error_color = null, out bool was_symbolic = null) throws GLib.Error;\n\t\tpublic async Gdk.Pixbuf load_symbolic_async (Gdk.RGBA fg, Gdk.RGBA? success_color = null, Gdk.RGBA? warning_color = null, Gdk.RGBA? error_color = null, GLib.Cancellable? cancellable = null) throws GLib.Error;\n\t\tpublic Gdk.Pixbuf load_symbolic_for_context (Gtk.StyleContext context, out bool was_symbolic = null) throws GLib.Error;\n\t\tpublic async Gdk.Pixbuf load_symbolic_for_context_async (Gtk.StyleContext context, GLib.Cancellable? cancellable = null) throws GLib.Error;\n\t\t[Deprecated (replacement = \"load_symbolic_for_context\", since = \"3.0\")]\n\t\tpublic Gdk.Pixbuf load_symbolic_for_style (Gtk.Style style, Gtk.StateType state, out bool was_symbolic = null) throws GLib.Error;\n\t\tpublic void set_raw_coordinates (bool raw_coordinates);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class IconInfoClass {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_icon_set_ref\", type_id = \"gtk_icon_set_get_type ()\", unref_function = \"gtk_icon_set_unref\")]\n\t[Compact]\n\t[Deprecated (replacement = \"Gtk.IconTheme\", since = \"3.10\")]\n\tpublic class IconSet {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic IconSet ();\n\t\tpublic void add_source (Gtk.IconSource source);\n\t\tpublic Gtk.IconSet copy ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic IconSet.from_pixbuf (Gdk.Pixbuf pixbuf);\n\t\tpublic void get_sizes (out Gtk.IconSize[] sizes);\n\t\t[Deprecated (replacement = \"set_render_icon_pixbuf\", since = \"3.0\")]\n\t\tpublic Gdk.Pixbuf render_icon (Gtk.Style style, Gtk.TextDirection direction, Gtk.StateType state, Gtk.IconSize size, Gtk.Widget widget, string detail);\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic Gdk.Pixbuf render_icon_pixbuf (Gtk.StyleContext context, Gtk.IconSize size);\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic Cairo.Surface render_icon_surface (Gtk.StyleContext context, Gtk.IconSize size, int scale, Gdk.Window for_window);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", copy_function = \"gtk_icon_source_copy\", type_id = \"gtk_icon_source_get_type ()\")]\n\t[Compact]\n\t[Deprecated (replacement = \"Gtk.IconTheme\", since = \"3.10\")]\n\tpublic class IconSource {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic IconSource ();\n\t\tpublic Gtk.IconSource copy ();\n\t\tpublic Gtk.TextDirection get_direction ();\n\t\tpublic bool get_direction_wildcarded ();\n\t\tpublic unowned string get_filename ();\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\tpublic Gtk.IconSize get_size ();\n\t\tpublic bool get_size_wildcarded ();\n\t\tpublic Gtk.StateType get_state ();\n\t\tpublic bool get_state_wildcarded ();\n\t\tpublic void set_direction (Gtk.TextDirection direction);\n\t\tpublic void set_direction_wildcarded (bool setting);\n\t\tpublic void set_filename (string filename);\n\t\tpublic void set_icon_name (string icon_name);\n\t\tpublic void set_pixbuf (Gdk.Pixbuf pixbuf);\n\t\tpublic void set_size (Gtk.IconSize size);\n\t\tpublic void set_size_wildcarded (bool setting);\n\t\tpublic void set_state (Gtk.StateType state);\n\t\tpublic void set_state_wildcarded (bool setting);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class IconTheme : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic IconTheme ();\n\t\tpublic static void add_builtin_icon (string icon_name, int size, Gdk.Pixbuf pixbuf);\n\t\tpublic void append_search_path (string path);\n\t\tpublic Gtk.IconInfo? choose_icon ([CCode (array_length = false, array_null_terminated = true)] string[] icon_names, int size, Gtk.IconLookupFlags flags);\n\t\tpublic Gtk.IconInfo? choose_icon_for_scale (string[] icon_names, int size, int scale, Gtk.IconLookupFlags flags);\n\t\tpublic static GLib.Quark error_quark ();\n\t\tpublic static unowned Gtk.IconTheme get_default ();\n\t\tpublic unowned string get_example_icon_name ();\n\t\tpublic static unowned Gtk.IconTheme get_for_screen (Gdk.Screen screen);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic int[] get_icon_sizes (string icon_name);\n\t\tpublic void get_search_path (out string[] path);\n\t\tpublic bool has_icon (string icon_name);\n\t\tpublic GLib.List<string> list_contexts ();\n\t\tpublic GLib.List<string> list_icons (string? context);\n\t\tpublic Gdk.Pixbuf? load_icon (string icon_name, int size, Gtk.IconLookupFlags flags) throws GLib.Error;\n\t\tpublic Gdk.Pixbuf? load_icon_for_scale (string icon_name, int size, int scale, Gtk.IconLookupFlags flags) throws GLib.Error;\n\t\tpublic Cairo.Surface? load_surface (string icon_name, int size, int scale, Gdk.Window for_window, Gtk.IconLookupFlags flags) throws GLib.Error;\n\t\tpublic Gtk.IconInfo? lookup_by_gicon (GLib.Icon icon, int size, Gtk.IconLookupFlags flags);\n\t\tpublic Gtk.IconInfo? lookup_by_gicon_for_scale (GLib.Icon icon, int size, int scale, Gtk.IconLookupFlags flags);\n\t\tpublic Gtk.IconInfo? lookup_icon (string icon_name, int size, Gtk.IconLookupFlags flags);\n\t\tpublic Gtk.IconInfo? lookup_icon_for_scale (string icon_name, int size, int scale, Gtk.IconLookupFlags flags);\n\t\tpublic void prepend_search_path (string path);\n\t\tpublic bool rescan_if_needed ();\n\t\tpublic void set_custom_theme (string theme_name);\n\t\tpublic void set_screen (Gdk.Screen screen);\n\t\tpublic void set_search_path (string[] path, int n_elements);\n\t\tpublic virtual signal void changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class IconView : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.CellLayout, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic IconView ();\n\t\tpublic void convert_widget_to_bin_window_coords (int wx, int wy, int bx, int by);\n\t\tpublic unowned Cairo.Surface create_drag_icon (Gtk.TreePath path);\n\t\tpublic void enable_model_drag_dest (Gtk.TargetEntry[] targets, Gdk.DragAction actions);\n\t\tpublic void enable_model_drag_source (Gdk.ModifierType start_button_mask, Gtk.TargetEntry[] targets, Gdk.DragAction actions);\n\t\tpublic bool get_activate_on_single_click ();\n\t\tpublic bool get_cell_rect (Gtk.TreePath path, Gtk.CellRenderer? cell, out Gdk.Rectangle rect);\n\t\tpublic int get_column_spacing ();\n\t\tpublic int get_columns ();\n\t\tpublic bool get_cursor (out Gtk.TreePath path, out unowned Gtk.CellRenderer cell);\n\t\tpublic bool get_dest_item_at_pos (int drag_x, int drag_y, out unowned Gtk.TreePath path, Gtk.IconViewDropPosition pos);\n\t\tpublic void get_drag_dest_item (out unowned Gtk.TreePath path, Gtk.IconViewDropPosition pos);\n\t\tpublic bool get_item_at_pos (int x, int y, out unowned Gtk.TreePath path, out unowned Gtk.CellRenderer cell);\n\t\tpublic int get_item_column (Gtk.TreePath path);\n\t\tpublic Gtk.Orientation get_item_orientation ();\n\t\tpublic int get_item_padding ();\n\t\tpublic int get_item_row (Gtk.TreePath path);\n\t\tpublic int get_item_width ();\n\t\tpublic int get_margin ();\n\t\tpublic int get_markup_column ();\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic unowned Gtk.TreePath get_path_at_pos (int x, int y);\n\t\tpublic int get_pixbuf_column ();\n\t\tpublic bool get_reorderable ();\n\t\tpublic int get_row_spacing ();\n\t\tpublic GLib.List<Gtk.TreePath> get_selected_items ();\n\t\tpublic Gtk.SelectionMode get_selection_mode ();\n\t\tpublic int get_spacing ();\n\t\tpublic int get_text_column ();\n\t\tpublic int get_tooltip_column ();\n\t\tpublic bool get_tooltip_context (out int x, out int y, bool keyboard_tip, out unowned Gtk.TreeModel model, out unowned Gtk.TreePath path, out Gtk.TreeIter iter);\n\t\tpublic bool get_visible_range (out Gtk.TreePath start_path, out Gtk.TreePath end_path);\n\t\tpublic bool path_is_selected (Gtk.TreePath path);\n\t\tpublic void scroll_to_path (Gtk.TreePath path, bool use_align, float row_align, float col_align);\n\t\tpublic void select_path (Gtk.TreePath path);\n\t\tpublic void selected_foreach (Gtk.IconViewForeachFunc func);\n\t\tpublic void set_activate_on_single_click (bool single);\n\t\tpublic void set_column_spacing (int column_spacing);\n\t\tpublic void set_columns (int columns);\n\t\tpublic void set_cursor (Gtk.TreePath path, Gtk.CellRenderer? cell, bool start_editing);\n\t\tpublic void set_drag_dest_item (Gtk.TreePath path, Gtk.IconViewDropPosition pos);\n\t\tpublic void set_item_orientation (Gtk.Orientation orientation);\n\t\tpublic void set_item_padding (int item_padding);\n\t\tpublic void set_item_width (int item_width);\n\t\tpublic void set_margin (int margin);\n\t\tpublic void set_markup_column (int column);\n\t\tpublic void set_model (Gtk.TreeModel? model);\n\t\tpublic void set_pixbuf_column (int column);\n\t\tpublic void set_reorderable (bool reorderable);\n\t\tpublic void set_row_spacing (int row_spacing);\n\t\tpublic void set_selection_mode (Gtk.SelectionMode mode);\n\t\tpublic void set_spacing (int spacing);\n\t\tpublic void set_text_column (int column);\n\t\tpublic void set_tooltip_cell (Gtk.Tooltip tooltip, Gtk.TreePath path, Gtk.CellRenderer cell);\n\t\tpublic void set_tooltip_column (int column);\n\t\tpublic void set_tooltip_item (Gtk.Tooltip tooltip, Gtk.TreePath path);\n\t\tpublic void unselect_path (Gtk.TreePath path);\n\t\tpublic void unset_model_drag_dest ();\n\t\tpublic void unset_model_drag_source ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic IconView.with_area (Gtk.CellArea area);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic IconView.with_model (Gtk.TreeModel model);\n\t\tpublic bool activate_on_single_click { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellArea cell_area { owned get; construct; }\n\t\tpublic int column_spacing { get; set; }\n\t\tpublic int columns { get; set; }\n\t\tpublic Gtk.Orientation item_orientation { get; set; }\n\t\tpublic int item_padding { get; set; }\n\t\tpublic int item_width { get; set; }\n\t\tpublic int margin { get; set; }\n\t\tpublic int markup_column { get; set; }\n\t\tpublic Gtk.TreeModel model { get; set; }\n\t\tpublic int pixbuf_column { get; set; }\n\t\tpublic bool reorderable { get; set; }\n\t\tpublic int row_spacing { get; set; }\n\t\tpublic Gtk.SelectionMode selection_mode { get; set; }\n\t\tpublic int spacing { get; set; }\n\t\tpublic int text_column { get; set; }\n\t\tpublic int tooltip_column { get; set; }\n\t\tpublic virtual signal bool activate_cursor_item ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void item_activated (Gtk.TreePath path);\n\t\tpublic virtual signal bool move_cursor (Gtk.MovementStep step, int count);\n\t\tpublic virtual signal void select_all ();\n\t\tpublic virtual signal void select_cursor_item ();\n\t\tpublic virtual signal void selection_changed ();\n\t\tpublic virtual signal void toggle_cursor_item ();\n\t\tpublic virtual signal void unselect_all ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class IconViewAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected IconViewAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Image : Gtk.Misc, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image ();\n\t\tpublic void clear ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_animation (Gdk.PixbufAnimation animation);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_file (string filename);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_gicon (GLib.Icon icon, Gtk.IconSize size);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_icon_name (string icon_name, Gtk.IconSize size);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_icon_set (Gtk.IconSet icon_set, Gtk.IconSize size);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_pixbuf (Gdk.Pixbuf pixbuf);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_resource (string resource_path);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_stock (string stock_id, Gtk.IconSize size);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Image.from_surface (Cairo.Surface surface);\n\t\tpublic unowned Gdk.PixbufAnimation get_animation ();\n\t\tpublic void get_gicon (out unowned GLib.Icon gicon, Gtk.IconSize size);\n\t\tpublic void get_icon_name (out unowned string icon_name, out Gtk.IconSize size);\n\t\tpublic void get_icon_set (out unowned Gtk.IconSet icon_set, out Gtk.IconSize size);\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\tpublic int get_pixel_size ();\n\t\tpublic void get_stock (out string stock_id, out Gtk.IconSize size);\n\t\tpublic Gtk.ImageType get_storage_type ();\n\t\tpublic void set_from_animation (Gdk.PixbufAnimation animation);\n\t\tpublic void set_from_file (string filename);\n\t\tpublic void set_from_gicon (GLib.Icon icon, Gtk.IconSize size);\n\t\tpublic void set_from_icon_name (string icon_name, Gtk.IconSize size);\n\t\tpublic void set_from_icon_set (Gtk.IconSet icon_set, Gtk.IconSize size);\n\t\tpublic void set_from_pixbuf (Gdk.Pixbuf pixbuf);\n\t\tpublic void set_from_resource (string resource_path);\n\t\tpublic void set_from_stock (string stock_id, Gtk.IconSize size);\n\t\tpublic void set_from_surface (Cairo.Surface surface);\n\t\tpublic void set_pixel_size (int pixel_size);\n\t\t[NoAccessorMethod]\n\t\tpublic string file { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Icon gicon { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string icon_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.IconSet icon_set { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int icon_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf pixbuf { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.PixbufAnimation pixbuf_animation { owned get; set; }\n\t\tpublic int pixel_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string resource { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string stock { owned get; set; }\n\t\tpublic Gtk.ImageType storage_type { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic Cairo.Surface surface { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool use_fallback { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ImageAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ImageAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ImageCellAccessible : Gtk.RendererCellAccessible, Atk.Action, Atk.Component, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ImageCellAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ImageMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ImageMenuItem ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ImageMenuItem.from_stock (string stock_id, Gtk.AccelGroup? accel_group);\n\t\tpublic bool get_always_show_image ();\n\t\tpublic unowned Gtk.Widget get_image ();\n\t\tpublic bool get_use_stock ();\n\t\tpublic void set_accel_group (Gtk.AccelGroup accel_group);\n\t\tpublic void set_always_show_image (bool always_show);\n\t\tpublic void set_image (Gtk.Widget image);\n\t\tpublic void set_use_stock (bool use_stock);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ImageMenuItem.with_label (string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ImageMenuItem.with_mnemonic (string label);\n\t\tpublic Gtk.AccelGroup accel_group { set; }\n\t\tpublic bool always_show_image { get; set construct; }\n\t\tpublic Gtk.Widget image { get; set; }\n\t\tpublic bool use_stock { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class InfoBar : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic InfoBar ();\n\t\tpublic void add_action_widget (Gtk.Widget child, int response_id);\n\t\tpublic unowned Gtk.Button add_button (string button_text, int response_id);\n\t\tpublic void add_buttons (...);\n\t\tpublic unowned Gtk.Widget get_action_area ();\n\t\tpublic unowned Gtk.Container get_content_area ();\n\t\tpublic Gtk.MessageType get_message_type ();\n\t\tpublic bool get_show_close_button ();\n\t\tpublic void set_default_response (int response_id);\n\t\tpublic void set_message_type (Gtk.MessageType message_type);\n\t\tpublic void set_response_sensitive (int response_id, bool setting);\n\t\tpublic void set_show_close_button (bool setting);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic InfoBar.with_buttons (...);\n\t\tpublic Gtk.MessageType message_type { get; set construct; }\n\t\tpublic bool show_close_button { get; set construct; }\n\t\tpublic virtual signal void close ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void response (int response_id);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Invisible : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Invisible ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Invisible.for_screen (Gdk.Screen screen);\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic void set_screen (Gdk.Screen screen);\n\t\tpublic Gdk.Screen screen { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Label : Gtk.Misc, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Label (string? str);\n\t\tpublic double get_angle ();\n\t\tpublic unowned Pango.AttrList get_attributes ();\n\t\tpublic unowned string get_current_uri ();\n\t\tpublic Pango.EllipsizeMode get_ellipsize ();\n\t\tpublic Gtk.Justification get_justify ();\n\t\tpublic unowned string get_label ();\n\t\tpublic unowned Pango.Layout get_layout ();\n\t\tpublic void get_layout_offsets (out int x, out int y);\n\t\tpublic bool get_line_wrap ();\n\t\tpublic Pango.WrapMode get_line_wrap_mode ();\n\t\tpublic int get_lines ();\n\t\tpublic int get_max_width_chars ();\n\t\tpublic uint get_mnemonic_keyval ();\n\t\tpublic unowned Gtk.Widget get_mnemonic_widget ();\n\t\tpublic bool get_selectable ();\n\t\tpublic bool get_selection_bounds (out int start, out int end);\n\t\tpublic bool get_single_line_mode ();\n\t\tpublic unowned string get_text ();\n\t\tpublic bool get_track_visited_links ();\n\t\tpublic bool get_use_markup ();\n\t\tpublic bool get_use_underline ();\n\t\tpublic int get_width_chars ();\n\t\tpublic void select_region (int start_offset, int end_offset);\n\t\tpublic void set_angle (double angle);\n\t\tpublic void set_attributes (Pango.AttrList attrs);\n\t\tpublic void set_ellipsize (Pango.EllipsizeMode mode);\n\t\tpublic void set_justify (Gtk.Justification jtype);\n\t\tpublic void set_label (string str);\n\t\tpublic void set_line_wrap (bool wrap);\n\t\tpublic void set_line_wrap_mode (Pango.WrapMode wrap_mode);\n\t\tpublic void set_lines (int lines);\n\t\tpublic void set_markup (string str);\n\t\tpublic void set_markup_with_mnemonic (string str);\n\t\tpublic void set_max_width_chars (int n_chars);\n\t\tpublic void set_mnemonic_widget (Gtk.Widget widget);\n\t\tpublic void set_pattern (string pattern);\n\t\tpublic void set_selectable (bool setting);\n\t\tpublic void set_single_line_mode (bool single_line_mode);\n\t\tpublic void set_text (string str);\n\t\tpublic void set_text_with_mnemonic (string str);\n\t\tpublic void set_track_visited_links (bool track_links);\n\t\tpublic void set_use_markup (bool setting);\n\t\tpublic void set_use_underline (bool setting);\n\t\tpublic void set_width_chars (int n_chars);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Label.with_mnemonic (string str);\n\t\tpublic double angle { get; set; }\n\t\tpublic Pango.AttrList attributes { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int cursor_position { get; }\n\t\tpublic Pango.EllipsizeMode ellipsize { get; set; }\n\t\tpublic Gtk.Justification justify { get; set; }\n\t\tpublic string label { get; set; }\n\t\tpublic int lines { get; set; }\n\t\tpublic int max_width_chars { get; set; }\n\t\tpublic uint mnemonic_keyval { get; }\n\t\tpublic Gtk.Widget mnemonic_widget { get; set; }\n\t\tpublic string pattern { set; }\n\t\tpublic bool selectable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int selection_bound { get; }\n\t\tpublic bool single_line_mode { get; set; }\n\t\tpublic bool track_visited_links { get; set; }\n\t\tpublic bool use_markup { get; set; }\n\t\tpublic bool use_underline { get; set; }\n\t\tpublic int width_chars { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool wrap { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.WrapMode wrap_mode { get; set; }\n\t\tpublic virtual signal void activate_current_link ();\n\t\tpublic virtual signal bool activate_link (string uri);\n\t\tpublic virtual signal void copy_clipboard ();\n\t\tpublic virtual signal void move_cursor (Gtk.MovementStep step, int count, bool extend_selection);\n\t\tpublic virtual signal void populate_popup (Gtk.Menu menu);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LabelAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Text {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected LabelAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class LabelSelectionInfo {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Layout : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Layout (Gtk.Adjustment? hadjustment = null, Gtk.Adjustment? vadjustment = null);\n\t\tpublic unowned Gdk.Window get_bin_window ();\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic void get_size (out uint width, out uint height);\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic void move (Gtk.Widget child_widget, int x, int y);\n\t\tpublic void put (Gtk.Widget child_widget, int x, int y);\n\t\tpublic void set_hadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_size (uint width, uint height);\n\t\tpublic void set_vadjustment (Gtk.Adjustment adjustment);\n\t\t[NoAccessorMethod]\n\t\tpublic uint height { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint width { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LevelBar : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic LevelBar ();\n\t\tpublic void add_offset_value (string name, double value);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic LevelBar.for_interval (double min_value, double max_value);\n\t\tpublic bool get_inverted ();\n\t\tpublic double get_max_value ();\n\t\tpublic double get_min_value ();\n\t\tpublic Gtk.LevelBarMode get_mode ();\n\t\tpublic bool get_offset_value (string name, double value);\n\t\tpublic double get_value ();\n\t\tpublic void remove_offset_value (string name);\n\t\tpublic void set_inverted (bool inverted);\n\t\tpublic void set_max_value (double value);\n\t\tpublic void set_min_value (double value);\n\t\tpublic void set_mode (Gtk.LevelBarMode mode);\n\t\tpublic void set_value (double value);\n\t\tpublic bool inverted { get; set; }\n\t\tpublic double max_value { get; set; }\n\t\tpublic double min_value { get; set; }\n\t\tpublic Gtk.LevelBarMode mode { get; set; }\n\t\tpublic double value { get; set; }\n\t\tpublic virtual signal void offset_changed (string name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LevelBarAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected LevelBarAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LinkButton : Gtk.Button, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic LinkButton (string uri);\n\t\tpublic unowned string get_uri ();\n\t\tpublic bool get_visited ();\n\t\tpublic void set_uri (string uri);\n\t\tpublic void set_visited (bool visited);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic LinkButton.with_label (string uri, string label);\n\t\tpublic string uri { get; set; }\n\t\tpublic bool visited { get; set; }\n\t\tpublic virtual signal bool activate_link ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LinkButtonAccessible : Gtk.ButtonAccessible, Atk.Component, Atk.Action, Atk.Image, Atk.HyperlinkImpl {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected LinkButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ListBox : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ListBox ();\n\t\tpublic void drag_highlight_row (Gtk.ListBoxRow row);\n\t\tpublic void drag_unhighlight_row ();\n\t\tpublic bool get_activate_on_single_click ();\n\t\tpublic unowned Gtk.Adjustment get_adjustment ();\n\t\tpublic unowned Gtk.ListBoxRow get_row_at_index (int index_);\n\t\tpublic unowned Gtk.ListBoxRow get_row_at_y (int y);\n\t\tpublic unowned Gtk.ListBoxRow get_selected_row ();\n\t\tpublic Gtk.SelectionMode get_selection_mode ();\n\t\tpublic void insert (Gtk.Widget child, int position);\n\t\tpublic void invalidate_filter ();\n\t\tpublic void invalidate_headers ();\n\t\tpublic void invalidate_sort ();\n\t\tpublic void prepend (Gtk.Widget child);\n\t\tpublic void select_row (Gtk.ListBoxRow? row);\n\t\tpublic void set_activate_on_single_click (bool single);\n\t\tpublic void set_adjustment (Gtk.Adjustment? adjustment);\n\t\tpublic void set_filter_func (owned Gtk.ListBoxFilterFunc? filter_func);\n\t\tpublic void set_header_func (owned Gtk.ListBoxUpdateHeaderFunc? update_header);\n\t\tpublic void set_placeholder (Gtk.Widget? placeholder);\n\t\tpublic void set_selection_mode (Gtk.SelectionMode mode);\n\t\tpublic void set_sort_func (owned Gtk.ListBoxSortFunc? sort_func);\n\t\tpublic bool activate_on_single_click { get; set; }\n\t\tpublic Gtk.SelectionMode selection_mode { get; set; }\n\t\tpublic virtual signal void activate_cursor_row ();\n\t\tpublic virtual signal void move_cursor (Gtk.MovementStep step, int count);\n\t\tpublic virtual signal void row_activated (Gtk.ListBoxRow row);\n\t\tpublic virtual signal void row_selected (Gtk.ListBoxRow row);\n\t\tpublic virtual signal void toggle_cursor_row ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ListBoxAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ListBoxAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ListBoxRow : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ListBoxRow ();\n\t\tpublic void changed ();\n\t\tpublic unowned Gtk.Widget get_header ();\n\t\tpublic int get_index ();\n\t\tpublic void set_header (Gtk.Widget? header);\n\t\tpublic virtual signal void activate ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ListBoxRowAccessible : Gtk.ContainerAccessible, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ListBoxRowAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ListStore : GLib.Object, Gtk.TreeModel, Gtk.TreeDragSource, Gtk.TreeDragDest, Gtk.TreeSortable, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, sentinel = \"\")]\n\t\tpublic ListStore (int n_columns, ...);\n\t\tpublic void append (out Gtk.TreeIter iter);\n\t\tpublic void clear ();\n\t\tpublic void insert (out Gtk.TreeIter iter, int position);\n\t\tpublic void insert_after (out Gtk.TreeIter iter, Gtk.TreeIter? sibling);\n\t\tpublic void insert_before (out Gtk.TreeIter iter, Gtk.TreeIter? sibling);\n\t\t[CCode (sentinel = \"-1\")]\n\t\tpublic void insert_with_values (out Gtk.TreeIter iter, int position, ...);\n\t\tpublic void insert_with_valuesv (out Gtk.TreeIter iter, int position, int columns, GLib.Value[] values);\n\t\tpublic bool iter_is_valid (Gtk.TreeIter iter);\n\t\tpublic void move_after (ref Gtk.TreeIter iter, Gtk.TreeIter? position);\n\t\tpublic void move_before (ref Gtk.TreeIter iter, Gtk.TreeIter? position);\n\t\t[CCode (cname = \"gtk_list_store_newv\", has_construct_function = false)]\n\t\tpublic ListStore.newv ([CCode (array_length_pos = 0.9)] GLib.Type[] types);\n\t\tpublic void prepend (out Gtk.TreeIter iter);\n\t\tpublic bool remove (Gtk.TreeIter iter);\n\t\tpublic void reorder (int new_order);\n\t\t[CCode (sentinel = \"-1\")]\n\t\tpublic void @set (Gtk.TreeIter iter, ...);\n\t\tpublic void set_column_types ([CCode (array_length_pos = 0.9)] GLib.Type[] types);\n\t\tpublic void set_valist (Gtk.TreeIter iter, void* var_args);\n\t\tpublic void set_value (Gtk.TreeIter iter, int column, GLib.Value value);\n\t\tpublic void set_valuesv (Gtk.TreeIter iter, int columns, GLib.Value[] values);\n\t\tpublic void swap (Gtk.TreeIter a, Gtk.TreeIter b);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LockButton : Gtk.Button, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic LockButton (GLib.Permission permission);\n\t\tpublic unowned GLib.Permission get_permission ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved0 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved1 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved2 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved3 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved4 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved5 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved6 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void reserved7 ();\n\t\tpublic void set_permission (GLib.Permission permission);\n\t\tpublic GLib.Permission permission { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text_lock { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text_unlock { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string tooltip_lock { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string tooltip_not_authorized { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string tooltip_unlock { owned get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class LockButtonAccessible : Gtk.ButtonAccessible, Atk.Component, Atk.Action, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected LockButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Menu : Gtk.MenuShell, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Menu ();\n\t\tpublic void attach (Gtk.Widget child, uint left_attach, uint right_attach, uint top_attach, uint bottom_attach);\n\t\tpublic void attach_to_widget (Gtk.Widget attach_widget, Gtk.MenuDetachFunc? detacher);\n\t\tpublic void detach ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Menu.from_model (GLib.MenuModel model);\n\t\tpublic unowned Gtk.AccelGroup get_accel_group ();\n\t\tpublic unowned string get_accel_path ();\n\t\tpublic unowned Gtk.Widget get_active ();\n\t\tpublic unowned Gtk.Widget get_attach_widget ();\n\t\tpublic static unowned GLib.List<Gtk.Menu> get_for_attach_widget (Gtk.Widget widget);\n\t\tpublic int get_monitor ();\n\t\tpublic bool get_reserve_toggle_size ();\n\t\tpublic bool get_tearoff_state ();\n\t\tpublic unowned string get_title ();\n\t\tpublic void popdown ();\n\t\tpublic void popup (Gtk.Widget? parent_menu_shell, Gtk.Widget? parent_menu_item, Gtk.MenuPositionFunc? func, uint button, uint32 activate_time);\n\t\tpublic void popup_for_device (Gdk.Device device, Gtk.Widget parent_menu_shell, Gtk.Widget parent_menu_item, Gtk.MenuPositionFunc func, void* data, GLib.DestroyNotify destroy, uint button, uint32 activate_time);\n\t\tpublic void reorder_child (Gtk.Widget child, int position);\n\t\tpublic void reposition ();\n\t\tpublic void set_accel_group (Gtk.AccelGroup accel_group);\n\t\tpublic void set_accel_path (string accel_path);\n\t\tpublic void set_active (uint index);\n\t\tpublic void set_monitor (int monitor_num);\n\t\tpublic void set_reserve_toggle_size (bool reserve_toggle_size);\n\t\tpublic void set_screen (Gdk.Screen? screen);\n\t\tpublic void set_tearoff_state (bool torn_off);\n\t\tpublic void set_title (string title);\n\t\tpublic Gtk.AccelGroup accel_group { get; set; }\n\t\tpublic string accel_path { get; set; }\n\t\tpublic int active { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Widget attach_widget { owned get; set; }\n\t\tpublic int monitor { get; set; }\n\t\tpublic bool reserve_toggle_size { get; set; }\n\t\tpublic bool tearoff_state { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string tearoff_title { owned get; set; }\n\t\tpublic virtual signal void move_scroll (Gtk.ScrollType p0);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuAccessible : Gtk.MenuShellAccessible, Atk.Component, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected MenuAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuBar : Gtk.MenuShell, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic MenuBar ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic MenuBar.from_model (GLib.MenuModel model);\n\t\tpublic Gtk.PackDirection get_child_pack_direction ();\n\t\tpublic Gtk.PackDirection get_pack_direction ();\n\t\tpublic void set_child_pack_direction (Gtk.PackDirection child_pack_dir);\n\t\tpublic void set_pack_direction (Gtk.PackDirection pack_dir);\n\t\tpublic Gtk.PackDirection child_pack_direction { get; set; }\n\t\tpublic Gtk.PackDirection pack_direction { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuButton : Gtk.ToggleButton, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic MenuButton ();\n\t\tpublic unowned Gtk.Widget get_align_widget ();\n\t\tpublic Gtk.ArrowType get_direction ();\n\t\tpublic unowned GLib.MenuModel get_menu_model ();\n\t\tpublic unowned Gtk.Menu get_popup ();\n\t\tpublic void set_align_widget (Gtk.Widget align_widget);\n\t\tpublic void set_direction (Gtk.ArrowType direction);\n\t\tpublic void set_menu_model (GLib.MenuModel menu_model);\n\t\tpublic void set_popup (Gtk.Widget popup);\n\t\tpublic Gtk.Container align_widget { get; set; }\n\t\tpublic Gtk.ArrowType direction { get; set; }\n\t\tpublic GLib.MenuModel menu_model { get; set; }\n\t\tpublic Gtk.Menu popup { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuItem : Gtk.Bin, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic MenuItem ();\n\t\tpublic unowned string get_accel_path ();\n\t\tpublic virtual unowned string get_label ();\n\t\tpublic bool get_reserve_indicator ();\n\t\t[Deprecated (replacement = \"Widget.get_hexpand and Widget.get_halign\", since = \"3.2\")]\n\t\tpublic bool get_right_justified ();\n\t\tpublic unowned Gtk.Widget get_submenu ();\n\t\tpublic bool get_use_underline ();\n\t\tpublic void set_accel_path (string accel_path);\n\t\tpublic virtual void set_label (string label);\n\t\tpublic void set_reserve_indicator (bool reserve);\n\t\t[Deprecated (replacement = \"Widget.set_hexpand and Widget.set_halign\", since = \"3.2\")]\n\t\tpublic void set_right_justified (bool right_justified);\n\t\tpublic void set_submenu (Gtk.Widget submenu);\n\t\tpublic void set_use_underline (bool setting);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic MenuItem.with_label (string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic MenuItem.with_mnemonic (string label);\n\t\tpublic string accel_path { get; set; }\n\t\tpublic string label { get; set; }\n\t\tpublic bool right_justified { get; set; }\n\t\tpublic Gtk.Menu submenu { get; set; }\n\t\tpublic bool use_underline { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void activate ();\n\t\tpublic virtual signal void activate_item ();\n\t\tpublic virtual signal void deselect ();\n\t\tpublic virtual signal void select ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void toggle_size_allocate (int allocation);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void toggle_size_request (void* requisition);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuItemAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Action, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected MenuItemAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic abstract class MenuShell : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected MenuShell ();\n\t\tpublic void activate_item (Gtk.Widget menu_item, bool force_deactivate);\n\t\tpublic void append ([CCode (type = \"GtkWidget*\")] Gtk.MenuItem child);\n\t\tpublic void bind_model (GLib.MenuModel model, string action_namespace, bool with_separators);\n\t\tpublic void deselect ();\n\t\tpublic unowned Gtk.Widget get_parent_shell ();\n\t\t[NoWrapper]\n\t\tpublic virtual int get_popup_delay ();\n\t\tpublic unowned Gtk.Widget get_selected_item ();\n\t\tpublic bool get_take_focus ();\n\t\tpublic void prepend (Gtk.Widget child);\n\t\tpublic void select_first (bool search_sensitive);\n\t\tpublic virtual void select_item (Gtk.Widget menu_item);\n\t\tpublic void set_take_focus (bool take_focus);\n\t\tpublic bool take_focus { get; set; }\n\t\tpublic virtual signal void activate_current (bool force_hide);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void cancel ();\n\t\tpublic virtual signal void cycle_focus (Gtk.DirectionType p0);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void deactivate ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void insert (Gtk.Widget child, int position);\n\t\tpublic virtual signal void move_current (Gtk.MenuDirectionType direction);\n\t\tpublic virtual signal bool move_selected (int distance);\n\t\tpublic virtual signal void selection_done ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuShellAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected MenuShellAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MenuToolButton : Gtk.ToolButton, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic MenuToolButton (Gtk.Widget? icon_widget, string? label);\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic MenuToolButton.from_stock (string stock_id);\n\t\tpublic unowned Gtk.Widget get_menu ();\n\t\tpublic void set_arrow_tooltip_markup (string markup);\n\t\tpublic void set_arrow_tooltip_text (string text);\n\t\tpublic void set_menu (Gtk.Widget menu);\n\t\tpublic Gtk.Menu menu { get; set; }\n\t\tpublic virtual signal void show_menu ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MessageDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\t[PrintfFormat]\n\t\tpublic MessageDialog (Gtk.Window? parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string message_format, ...);\n\t\t[PrintfFormat]\n\t\tpublic void format_secondary_markup (string message_format, ...);\n\t\t[PrintfFormat]\n\t\tpublic void format_secondary_text (string message_format, ...);\n\t\tpublic unowned Gtk.Widget get_image ();\n\t\tpublic unowned Gtk.Widget get_message_area ();\n\t\tpublic void set_image (Gtk.Widget image);\n\t\tpublic void set_markup (string str);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\t[PrintfFormat]\n\t\tpublic MessageDialog.with_markup (Gtk.Window? parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string message_format, ...);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ButtonsType buttons { construct; }\n\t\tpublic Gtk.Widget image { get; set; }\n\t\tpublic Gtk.Widget message_area { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.MessageType message_type { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string secondary_text { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool secondary_use_markup { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool use_markup { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Misc : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Misc ();\n\t\tpublic void get_alignment (out float xalign, out float yalign);\n\t\tpublic void get_padding (out int xpad, out int ypad);\n\t\tpublic void set_alignment (float xalign, float yalign);\n\t\tpublic void set_padding (int xpad, int ypad);\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int xpad { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yalign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int ypad { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class MountOperation : GLib.MountOperation {\n\t\t[CCode (has_construct_function = false, type = \"GMountOperation*\")]\n\t\tpublic MountOperation (Gtk.Window? parent);\n\t\tpublic unowned Gtk.Window get_parent ();\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic void set_parent (Gtk.Window parent);\n\t\tpublic void set_screen (Gdk.Screen screen);\n\t\t[NoAccessorMethod]\n\t\tpublic bool is_showing { get; }\n\t\tpublic Gtk.Window parent { get; set; }\n\t\tpublic Gdk.Screen screen { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Notebook : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Notebook ();\n\t\tpublic int append_page (Gtk.Widget child, Gtk.Widget? tab_label = null);\n\t\tpublic int append_page_menu (Gtk.Widget child, Gtk.Widget? tab_label, Gtk.Widget? menu_label);\n\t\tpublic unowned Gtk.Widget get_action_widget (Gtk.PackType pack_type);\n\t\tpublic int get_current_page ();\n\t\tpublic unowned string get_group_name ();\n\t\tpublic unowned Gtk.Widget get_menu_label (Gtk.Widget child);\n\t\tpublic unowned string get_menu_label_text (Gtk.Widget child);\n\t\tpublic int get_n_pages ();\n\t\tpublic unowned Gtk.Widget get_nth_page (int page_num);\n\t\tpublic bool get_scrollable ();\n\t\tpublic bool get_show_border ();\n\t\tpublic bool get_show_tabs ();\n\t\tpublic bool get_tab_detachable (Gtk.Widget child);\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic uint16 get_tab_hborder ();\n\t\tpublic unowned Gtk.Widget get_tab_label (Gtk.Widget child);\n\t\tpublic unowned string get_tab_label_text (Gtk.Widget child);\n\t\tpublic Gtk.PositionType get_tab_pos ();\n\t\tpublic bool get_tab_reorderable (Gtk.Widget child);\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic uint16 get_tab_vborder ();\n\t\tpublic int insert_page (Gtk.Widget child, Gtk.Widget? tab_label, int position);\n\t\t[CCode (vfunc_name = \"insert_page\")]\n\t\tpublic virtual int insert_page_menu (Gtk.Widget child, Gtk.Widget? tab_label, Gtk.Widget? menu_label, int position);\n\t\tpublic void next_page ();\n\t\tpublic int page_num (Gtk.Widget child);\n\t\tpublic void popup_disable ();\n\t\tpublic void popup_enable ();\n\t\tpublic int prepend_page (Gtk.Widget child, Gtk.Widget? tab_label = null);\n\t\tpublic int prepend_page_menu (Gtk.Widget child, Gtk.Widget? tab_label, Gtk.Widget? menu_label);\n\t\tpublic void prev_page ();\n\t\tpublic void remove_page (int page_num);\n\t\tpublic void reorder_child (Gtk.Widget child, int position);\n\t\tpublic void set_action_widget (Gtk.Widget widget, Gtk.PackType pack_type);\n\t\tpublic void set_current_page (int page_num);\n\t\tpublic void set_group_name (string group_name);\n\t\tpublic void set_menu_label (Gtk.Widget child, Gtk.Widget? menu_label);\n\t\tpublic void set_menu_label_text (Gtk.Widget child, string menu_text);\n\t\tpublic void set_scrollable (bool scrollable);\n\t\tpublic void set_show_border (bool show_border);\n\t\tpublic void set_show_tabs (bool show_tabs);\n\t\tpublic void set_tab_detachable (Gtk.Widget child, bool detachable);\n\t\tpublic void set_tab_label (Gtk.Widget child, Gtk.Widget? tab_label);\n\t\tpublic void set_tab_label_text (Gtk.Widget child, string tab_text);\n\t\tpublic void set_tab_pos (Gtk.PositionType pos);\n\t\tpublic void set_tab_reorderable (Gtk.Widget child, bool reorderable);\n\t\t[NoAccessorMethod]\n\t\tpublic bool enable_popup { get; set; }\n\t\tpublic string group_name { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int page { get; set; }\n\t\tpublic bool scrollable { get; set; }\n\t\tpublic bool show_border { get; set; }\n\t\tpublic bool show_tabs { get; set; }\n\t\tpublic Gtk.PositionType tab_pos { get; set; }\n\t\tpublic virtual signal bool change_current_page (int offset);\n\t\tpublic virtual signal unowned Gtk.Notebook create_window (Gtk.Widget page, int x, int y);\n\t\tpublic virtual signal bool focus_tab (Gtk.NotebookTab type);\n\t\tpublic virtual signal void move_focus_out (Gtk.DirectionType direction);\n\t\tpublic virtual signal void page_added (Gtk.Widget child, uint page_num);\n\t\tpublic virtual signal void page_removed (Gtk.Widget child, uint page_num);\n\t\tpublic virtual signal void page_reordered (Gtk.Widget child, uint page_num);\n\t\tpublic virtual signal bool reorder_tab (Gtk.DirectionType direction, bool move_to_last);\n\t\tpublic virtual signal bool select_page (bool move_focus);\n\t\tpublic virtual signal void switch_page (Gtk.Widget page, uint page_num);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class NotebookAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected NotebookAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class NotebookPageAccessible : Atk.Object, Atk.Component {\n\t\t[CCode (has_construct_function = false, type = \"AtkObject*\")]\n\t\tpublic NotebookPageAccessible (Gtk.NotebookAccessible notebook, Gtk.Widget child);\n\t\tpublic void invalidate ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class NumerableIcon : GLib.EmblemedIcon, GLib.Icon {\n\t\t[CCode (has_construct_function = false, type = \"GIcon*\")]\n\t\tpublic NumerableIcon (GLib.Icon base_icon);\n\t\tpublic unowned GLib.Icon get_background_gicon ();\n\t\tpublic unowned string get_background_icon_name ();\n\t\tpublic int get_count ();\n\t\tpublic unowned string get_label ();\n\t\tpublic unowned Gtk.StyleContext get_style_context ();\n\t\tpublic void set_background_gicon (GLib.Icon icon);\n\t\tpublic void set_background_icon_name (string icon_name);\n\t\tpublic void set_count (int count);\n\t\tpublic void set_label (string label);\n\t\tpublic void set_style_context (Gtk.StyleContext style);\n\t\t[CCode (has_construct_function = false, type = \"GIcon*\")]\n\t\tpublic NumerableIcon.with_style_context (GLib.Icon base_icon, Gtk.StyleContext context);\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Icon background_icon { owned get; set; }\n\t\tpublic string background_icon_name { get; set; }\n\t\tpublic int count { get; set; }\n\t\tpublic string label { get; set; }\n\t\tpublic Gtk.StyleContext style_context { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class OffscreenWindow : Gtk.Window, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic OffscreenWindow ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\tpublic unowned Cairo.Surface get_surface ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Overlay : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Overlay ();\n\t\tpublic void add_overlay (Gtk.Widget widget);\n\t\tpublic virtual signal bool get_child_position (Gtk.Widget widget, Gdk.Rectangle allocation);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class PageRange {\n\t\tpublic int end;\n\t\tpublic int start;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class PageSetup : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PageSetup ();\n\t\tpublic Gtk.PageSetup copy ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PageSetup.from_file (string file_name) throws GLib.Error;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PageSetup.from_key_file (GLib.KeyFile key_file, string group_name) throws GLib.Error;\n\t\tpublic double get_bottom_margin (Gtk.Unit unit);\n\t\tpublic double get_left_margin (Gtk.Unit unit);\n\t\tpublic Gtk.PageOrientation get_orientation ();\n\t\tpublic double get_page_height (Gtk.Unit unit);\n\t\tpublic double get_page_width (Gtk.Unit unit);\n\t\tpublic double get_paper_height (Gtk.Unit unit);\n\t\tpublic unowned Gtk.PaperSize get_paper_size ();\n\t\tpublic double get_paper_width (Gtk.Unit unit);\n\t\tpublic double get_right_margin (Gtk.Unit unit);\n\t\tpublic double get_top_margin (Gtk.Unit unit);\n\t\tpublic bool load_file (string file_name) throws GLib.Error;\n\t\tpublic bool load_key_file (GLib.KeyFile key_file, string group_name) throws GLib.Error;\n\t\tpublic void set_bottom_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_left_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_orientation (Gtk.PageOrientation orientation);\n\t\tpublic void set_paper_size (Gtk.PaperSize size);\n\t\tpublic void set_paper_size_and_default_margins (Gtk.PaperSize size);\n\t\tpublic void set_right_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_top_margin (double margin, Gtk.Unit unit);\n\t\tpublic bool to_file (string file_name) throws GLib.Error;\n\t\tpublic void to_key_file (GLib.KeyFile key_file, string group_name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Paned : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Paned (Gtk.Orientation orientation);\n\t\tpublic void add1 (Gtk.Widget child);\n\t\tpublic void add2 (Gtk.Widget child);\n\t\tpublic unowned Gtk.Widget get_child1 ();\n\t\tpublic unowned Gtk.Widget get_child2 ();\n\t\tpublic unowned Gdk.Window get_handle_window ();\n\t\tpublic int get_position ();\n\t\tpublic void pack1 (Gtk.Widget child, bool resize, bool shrink);\n\t\tpublic void pack2 (Gtk.Widget child, bool resize, bool shrink);\n\t\tpublic void set_position (int position);\n\t\t[NoAccessorMethod]\n\t\tpublic int max_position { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic int min_position { get; }\n\t\tpublic int position { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool position_set { get; set; }\n\t\tpublic virtual signal bool accept_position ();\n\t\tpublic virtual signal bool cancel_position ();\n\t\tpublic virtual signal bool cycle_child_focus (bool reverse);\n\t\tpublic virtual signal bool cycle_handle_focus (bool reverse);\n\t\tpublic virtual signal bool move_handle (Gtk.ScrollType scroll);\n\t\tpublic virtual signal bool toggle_handle_focus ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class PanedAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected PanedAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", copy_function = \"gtk_paper_size_copy\", type_id = \"gtk_paper_size_get_type ()\")]\n\t[Compact]\n\tpublic class PaperSize {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PaperSize (string name);\n\t\tpublic Gtk.PaperSize copy ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PaperSize.custom (string name, string display_name, double width, double height, Gtk.Unit unit);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PaperSize.from_key_file (GLib.KeyFile key_file, string group_name) throws GLib.Error;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PaperSize.from_ppd (string ppd_name, string ppd_display_name, double width, double height);\n\t\tpublic static unowned string get_default ();\n\t\tpublic double get_default_bottom_margin (Gtk.Unit unit);\n\t\tpublic double get_default_left_margin (Gtk.Unit unit);\n\t\tpublic double get_default_right_margin (Gtk.Unit unit);\n\t\tpublic double get_default_top_margin (Gtk.Unit unit);\n\t\tpublic unowned string get_display_name ();\n\t\tpublic double get_height (Gtk.Unit unit);\n\t\tpublic unowned string get_name ();\n\t\tpublic static GLib.List<Gtk.PaperSize> get_paper_sizes (bool include_custom);\n\t\tpublic unowned string get_ppd_name ();\n\t\tpublic double get_width (Gtk.Unit unit);\n\t\tpublic bool is_custom ();\n\t\tpublic bool is_equal (Gtk.PaperSize size2);\n\t\tpublic void set_size (double width, double height, Gtk.Unit unit);\n\t\tpublic void to_key_file (GLib.KeyFile key_file, string group_name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class PlacesSidebar : Gtk.ScrolledWindow, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic PlacesSidebar ();\n\t\tpublic void add_shortcut (GLib.File location);\n\t\tpublic unowned GLib.File get_location ();\n\t\tpublic unowned GLib.File get_nth_bookmark (int n);\n\t\tpublic Gtk.PlacesOpenFlags get_open_flags ();\n\t\tpublic bool get_show_connect_to_server ();\n\t\tpublic bool get_show_desktop ();\n\t\tpublic unowned GLib.SList list_shortcuts ();\n\t\tpublic void remove_shortcut (GLib.File location);\n\t\tpublic void set_location (GLib.File location);\n\t\tpublic void set_open_flags (Gtk.PlacesOpenFlags flags);\n\t\tpublic void set_show_connect_to_server (bool show_connect_to_server);\n\t\tpublic void set_show_desktop (bool show_desktop);\n\t\tpublic GLib.File location { get; set; }\n\t\tpublic Gtk.PlacesOpenFlags open_flags { get; set; }\n\t\tpublic bool show_connect_to_server { get; set; }\n\t\tpublic bool show_desktop { get; set; }\n\t\tpublic virtual signal int drag_action_ask (int p0);\n\t\tpublic virtual signal int drag_action_requested (Gdk.DragContext p0, GLib.Object p1, void* p2);\n\t\tpublic virtual signal void drag_perform_drop (GLib.Object p0, void* p1, int p2);\n\t\tpublic virtual signal void open_location (GLib.Object p0, Gtk.PlacesOpenFlags p1);\n\t\tpublic virtual signal void populate_popup (GLib.Object p0, GLib.Object p1, GLib.Object p2);\n\t\tpublic virtual signal void show_error_message (string p0, string p1);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtkx.h\")]\n\tpublic class Plug : Gtk.Window, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Plug (X.Window socket_id);\n\t\tpublic void @construct (X.Window socket_id);\n\t\tpublic void construct_for_display (Gdk.Display display, X.Window socket_id);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Plug.for_display (Gdk.Display display, X.Window socket_id);\n\t\tpublic bool get_embedded ();\n\t\tpublic X.Window get_id ();\n\t\tpublic unowned Gdk.Window get_socket_window ();\n\t\tpublic bool embedded { get; }\n\t\tpublic Gdk.Window socket_window { get; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class PrintContext : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected PrintContext ();\n\t\tpublic unowned Pango.Context create_pango_context ();\n\t\tpublic unowned Pango.Layout create_pango_layout ();\n\t\tpublic unowned Cairo.Context get_cairo_context ();\n\t\tpublic double get_dpi_x ();\n\t\tpublic double get_dpi_y ();\n\t\tpublic bool get_hard_margins (double top, double bottom, double left, double right);\n\t\tpublic double get_height ();\n\t\tpublic unowned Gtk.PageSetup get_page_setup ();\n\t\tpublic unowned Pango.FontMap get_pango_fontmap ();\n\t\tpublic double get_width ();\n\t\tpublic void set_cairo_context (Cairo.Context cr, double dpi_x, double dpi_y);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class PrintOperation : GLib.Object, Gtk.PrintOperationPreview {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PrintOperation ();\n\t\tpublic void cancel ();\n\t\tpublic void draw_page_finish ();\n\t\tpublic unowned Gtk.PageSetup get_default_page_setup ();\n\t\tpublic bool get_embed_page_setup ();\n\t\tpublic void get_error () throws GLib.Error;\n\t\tpublic bool get_has_selection ();\n\t\tpublic int get_n_pages_to_print ();\n\t\tpublic unowned Gtk.PrintSettings get_print_settings ();\n\t\tpublic Gtk.PrintStatus get_status ();\n\t\tpublic unowned string get_status_string ();\n\t\tpublic bool get_support_selection ();\n\t\tpublic bool is_finished ();\n\t\tpublic Gtk.PrintOperationResult run (Gtk.PrintOperationAction action, Gtk.Window parent) throws GLib.Error;\n\t\tpublic void set_allow_async (bool allow_async);\n\t\tpublic void set_current_page (int current_page);\n\t\tpublic void set_custom_tab_label (string label);\n\t\tpublic void set_default_page_setup (Gtk.PageSetup default_page_setup);\n\t\tpublic void set_defer_drawing ();\n\t\tpublic void set_embed_page_setup (bool embed);\n\t\tpublic void set_export_filename (string filename);\n\t\tpublic void set_has_selection (bool has_selection);\n\t\tpublic void set_job_name (string job_name);\n\t\tpublic void set_n_pages (int n_pages);\n\t\tpublic void set_print_settings (Gtk.PrintSettings print_settings);\n\t\tpublic void set_show_progress (bool show_progress);\n\t\tpublic void set_support_selection (bool support_selection);\n\t\tpublic void set_track_print_status (bool track_status);\n\t\tpublic void set_unit (Gtk.Unit unit);\n\t\tpublic void set_use_full_page (bool full_page);\n\t\t[NoAccessorMethod]\n\t\tpublic bool allow_async { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int current_page { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string custom_tab_label { owned get; set; }\n\t\tpublic Gtk.PageSetup default_page_setup { get; set; }\n\t\tpublic bool embed_page_setup { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string export_filename { owned get; set; }\n\t\tpublic bool has_selection { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string job_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int n_pages { get; set; }\n\t\tpublic int n_pages_to_print { get; }\n\t\tpublic Gtk.PrintSettings print_settings { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_progress { get; set; }\n\t\tpublic Gtk.PrintStatus status { get; }\n\t\tpublic string status_string { get; }\n\t\tpublic bool support_selection { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool track_print_status { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Unit unit { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool use_full_page { get; set; }\n\t\tpublic virtual signal void begin_print (Gtk.PrintContext context);\n\t\tpublic virtual signal unowned GLib.Object create_custom_widget ();\n\t\tpublic virtual signal void custom_widget_apply (Gtk.Widget widget);\n\t\tpublic virtual signal void done (Gtk.PrintOperationResult result);\n\t\tpublic virtual signal void draw_page (Gtk.PrintContext context, int page_nr);\n\t\tpublic virtual signal void end_print (Gtk.PrintContext context);\n\t\tpublic virtual signal bool paginate (Gtk.PrintContext context);\n\t\tpublic virtual signal bool preview (Gtk.PrintOperationPreview preview, Gtk.PrintContext context, Gtk.Window parent);\n\t\tpublic virtual signal void request_page_setup (Gtk.PrintContext context, int page_nr, Gtk.PageSetup setup);\n\t\tpublic virtual signal void status_changed ();\n\t\tpublic virtual signal void update_custom_widget (Gtk.Widget widget, Gtk.PageSetup setup, Gtk.PrintSettings settings);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class PrintSettings : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PrintSettings ();\n\t\tpublic Gtk.PrintSettings copy ();\n\t\tpublic void @foreach (Gtk.PrintSettingsFunc func);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PrintSettings.from_file (string file_name) throws GLib.Error;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PrintSettings.from_key_file (GLib.KeyFile key_file, string group_name) throws GLib.Error;\n\t\tpublic unowned string @get (string key);\n\t\tpublic bool get_bool (string key);\n\t\tpublic bool get_collate ();\n\t\tpublic unowned string get_default_source ();\n\t\tpublic unowned string get_dither ();\n\t\tpublic double get_double (string key);\n\t\tpublic double get_double_with_default (string key, double def);\n\t\tpublic Gtk.PrintDuplex get_duplex ();\n\t\tpublic unowned string get_finishings ();\n\t\tpublic int get_int (string key);\n\t\tpublic int get_int_with_default (string key, int def);\n\t\tpublic double get_length (string key, Gtk.Unit unit);\n\t\tpublic unowned string get_media_type ();\n\t\tpublic int get_n_copies ();\n\t\tpublic int get_number_up ();\n\t\tpublic Gtk.NumberUpLayout get_number_up_layout ();\n\t\tpublic Gtk.PageOrientation get_orientation ();\n\t\tpublic unowned string get_output_bin ();\n\t\tpublic unowned Gtk.PageRange get_page_ranges (int num_ranges);\n\t\tpublic Gtk.PageSet get_page_set ();\n\t\tpublic double get_paper_height (Gtk.Unit unit);\n\t\tpublic unowned Gtk.PaperSize get_paper_size ();\n\t\tpublic double get_paper_width (Gtk.Unit unit);\n\t\tpublic Gtk.PrintPages get_print_pages ();\n\t\tpublic unowned string get_printer ();\n\t\tpublic double get_printer_lpi ();\n\t\tpublic Gtk.PrintQuality get_quality ();\n\t\tpublic int get_resolution ();\n\t\tpublic int get_resolution_x ();\n\t\tpublic int get_resolution_y ();\n\t\tpublic bool get_reverse ();\n\t\tpublic double get_scale ();\n\t\tpublic bool get_use_color ();\n\t\tpublic bool has_key (string key);\n\t\tpublic bool load_file (string file_name) throws GLib.Error;\n\t\tpublic bool load_key_file (GLib.KeyFile key_file, string group_name) throws GLib.Error;\n\t\tpublic void @set (string key, string value);\n\t\tpublic void set_bool (string key, bool value);\n\t\tpublic void set_collate (bool collate);\n\t\tpublic void set_default_source (string default_source);\n\t\tpublic void set_dither (string dither);\n\t\tpublic void set_double (string key, double value);\n\t\tpublic void set_duplex (Gtk.PrintDuplex duplex);\n\t\tpublic void set_finishings (string finishings);\n\t\tpublic void set_int (string key, int value);\n\t\tpublic void set_length (string key, double value, Gtk.Unit unit);\n\t\tpublic void set_media_type (string media_type);\n\t\tpublic void set_n_copies (int num_copies);\n\t\tpublic void set_number_up (int number_up);\n\t\tpublic void set_number_up_layout (Gtk.NumberUpLayout number_up_layout);\n\t\tpublic void set_orientation (Gtk.PageOrientation orientation);\n\t\tpublic void set_output_bin (string output_bin);\n\t\tpublic void set_page_ranges (Gtk.PageRange page_ranges, int num_ranges);\n\t\tpublic void set_page_set (Gtk.PageSet page_set);\n\t\tpublic void set_paper_height (double height, Gtk.Unit unit);\n\t\tpublic void set_paper_size (Gtk.PaperSize paper_size);\n\t\tpublic void set_paper_width (double width, Gtk.Unit unit);\n\t\tpublic void set_print_pages (Gtk.PrintPages pages);\n\t\tpublic void set_printer (string printer);\n\t\tpublic void set_printer_lpi (double lpi);\n\t\tpublic void set_quality (Gtk.PrintQuality quality);\n\t\tpublic void set_resolution (int resolution);\n\t\tpublic void set_resolution_xy (int resolution_x, int resolution_y);\n\t\tpublic void set_reverse (bool reverse);\n\t\tpublic void set_scale (double scale);\n\t\tpublic void set_use_color (bool use_color);\n\t\tpublic bool to_file (string file_name) throws GLib.Error;\n\t\tpublic void to_key_file (GLib.KeyFile key_file, string group_name);\n\t\tpublic void unset (string key);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ProgressBar : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ProgressBar ();\n\t\tpublic Pango.EllipsizeMode get_ellipsize ();\n\t\tpublic double get_fraction ();\n\t\tpublic bool get_inverted ();\n\t\tpublic double get_pulse_step ();\n\t\tpublic bool get_show_text ();\n\t\tpublic unowned string get_text ();\n\t\tpublic void pulse ();\n\t\tpublic void set_ellipsize (Pango.EllipsizeMode mode);\n\t\tpublic void set_fraction (double fraction);\n\t\tpublic void set_inverted (bool inverted);\n\t\tpublic void set_pulse_step (double fraction);\n\t\tpublic void set_show_text (bool show_text);\n\t\tpublic void set_text (string text);\n\t\tpublic Pango.EllipsizeMode ellipsize { get; set; }\n\t\tpublic double fraction { get; set; }\n\t\tpublic bool inverted { get; set; }\n\t\tpublic double pulse_step { get; set; }\n\t\tpublic bool show_text { get; set; }\n\t\tpublic string text { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ProgressBarAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ProgressBarAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RadioAction : Gtk.ToggleAction, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic RadioAction (string name, string? label, string? tooltip, string? stock_id, int value);\n\t\tpublic int get_current_value ();\n\t\tpublic unowned GLib.SList<Gtk.RadioAction> get_group ();\n\t\tpublic void join_group (Gtk.RadioAction group_source);\n\t\tpublic void set_current_value (int current_value);\n\t\tpublic void set_group (GLib.SList<Gtk.RadioAction> group);\n\t\tpublic int current_value { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.RadioAction group { set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int value { get; set; }\n\t\tpublic virtual signal void changed (Gtk.RadioAction current);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RadioButton : Gtk.CheckButton, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioButton (GLib.SList<Gtk.RadioButton>? group);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioButton.from_widget (Gtk.RadioButton? radio_group_member);\n\t\tpublic unowned GLib.SList<Gtk.RadioButton> get_group ();\n\t\tpublic void join_group (Gtk.RadioButton group_source);\n\t\tpublic void set_group (GLib.SList<Gtk.RadioButton> group);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioButton.with_label (GLib.SList<Gtk.RadioButton>? group, string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioButton.with_label_from_widget (Gtk.RadioButton? radio_group_member, string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioButton.with_mnemonic (GLib.SList<Gtk.RadioButton>? group, string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioButton.with_mnemonic_from_widget (Gtk.RadioButton? radio_group_member, string label);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.RadioButton group { set; }\n\t\tpublic virtual signal void group_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RadioButtonAccessible : Gtk.ToggleButtonAccessible, Atk.Component, Atk.Action, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected RadioButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RadioMenuItem : Gtk.CheckMenuItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioMenuItem (GLib.SList<Gtk.RadioMenuItem>? group);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioMenuItem.from_widget (Gtk.RadioMenuItem group);\n\t\tpublic unowned GLib.SList<Gtk.RadioMenuItem> get_group ();\n\t\tpublic void set_group (GLib.SList<Gtk.RadioMenuItem>? group);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioMenuItem.with_label (GLib.SList<Gtk.RadioMenuItem>? group, string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioMenuItem.with_label_from_widget (Gtk.RadioMenuItem group, string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioMenuItem.with_mnemonic (GLib.SList<Gtk.RadioMenuItem>? group, string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RadioMenuItem.with_mnemonic_from_widget (Gtk.RadioMenuItem group, string label);\n\t\tpublic Gtk.RadioMenuItem group { set; }\n\t\tpublic virtual signal void group_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RadioMenuItemAccessible : Gtk.CheckMenuItemAccessible, Atk.Component, Atk.Action, Atk.Selection {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected RadioMenuItemAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RadioToolButton : Gtk.ToggleToolButton, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic RadioToolButton (GLib.SList<Gtk.RadioToolButton>? group);\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic RadioToolButton.from_stock (GLib.SList<Gtk.RadioToolButton>? group, string stock_id);\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic RadioToolButton.from_widget (Gtk.RadioToolButton group);\n\t\tpublic unowned GLib.SList<Gtk.RadioToolButton> get_group ();\n\t\tpublic void set_group (GLib.SList<Gtk.RadioToolButton> group);\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic RadioToolButton.with_stock_from_widget (Gtk.RadioToolButton group, string stock_id);\n\t\tpublic Gtk.RadioToolButton group { set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Range : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Range ();\n\t\tpublic unowned Gtk.Adjustment get_adjustment ();\n\t\tpublic unowned Gdk.Window get_event_window ();\n\t\tpublic double get_fill_level ();\n\t\tpublic bool get_flippable ();\n\t\tpublic bool get_inverted ();\n\t\tpublic Gtk.SensitivityType get_lower_stepper_sensitivity ();\n\t\tpublic int get_min_slider_size ();\n\t\t[NoWrapper]\n\t\tpublic virtual void get_range_border (Gtk.Border border_);\n\t\tpublic void get_range_rect (Gdk.Rectangle range_rect);\n\t\tpublic bool get_restrict_to_fill_level ();\n\t\tpublic int get_round_digits ();\n\t\tpublic bool get_show_fill_level ();\n\t\tpublic void get_slider_range (out int slider_start, out int slider_end);\n\t\tpublic bool get_slider_size_fixed ();\n\t\tpublic Gtk.SensitivityType get_upper_stepper_sensitivity ();\n\t\tpublic double get_value ();\n\t\tpublic void set_adjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_fill_level (double fill_level);\n\t\tpublic void set_flippable (bool flippable);\n\t\tpublic void set_increments (double step, double page);\n\t\tpublic void set_inverted (bool setting);\n\t\tpublic void set_lower_stepper_sensitivity (Gtk.SensitivityType sensitivity);\n\t\tpublic void set_min_slider_size (int min_size);\n\t\tpublic void set_range (double min, double max);\n\t\tpublic void set_restrict_to_fill_level (bool restrict_to_fill_level);\n\t\tpublic void set_round_digits (int round_digits);\n\t\tpublic void set_show_fill_level (bool show_fill_level);\n\t\tpublic void set_slider_size_fixed (bool size_fixed);\n\t\tpublic void set_upper_stepper_sensitivity (Gtk.SensitivityType sensitivity);\n\t\tpublic void set_value (double value);\n\t\tpublic Gtk.Adjustment adjustment { get; set construct; }\n\t\tpublic double fill_level { get; set; }\n\t\tpublic bool inverted { get; set; }\n\t\tpublic Gtk.SensitivityType lower_stepper_sensitivity { get; set; }\n\t\tpublic bool restrict_to_fill_level { get; set; }\n\t\tpublic int round_digits { get; set; }\n\t\tpublic bool show_fill_level { get; set; }\n\t\tpublic Gtk.SensitivityType upper_stepper_sensitivity { get; set; }\n\t\tpublic virtual signal void adjust_bounds (double new_value);\n\t\tpublic virtual signal bool change_value (Gtk.ScrollType scroll, double new_value);\n\t\tpublic virtual signal void move_slider (Gtk.ScrollType scroll);\n\t\tpublic virtual signal void value_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RangeAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected RangeAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class RcContext {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class RcProperty {\n\t\tpublic weak string origin;\n\t\tpublic GLib.Quark property_name;\n\t\tpublic GLib.Quark type_name;\n\t\tpublic GLib.Value value;\n\t\tpublic static bool parse_border (GLib.ParamSpec pspec, GLib.StringBuilder gstring, GLib.Value property_value);\n\t\tpublic static bool parse_color (GLib.ParamSpec pspec, GLib.StringBuilder gstring, GLib.Value property_value);\n\t\tpublic static bool parse_enum (GLib.ParamSpec pspec, GLib.StringBuilder gstring, GLib.Value property_value);\n\t\tpublic static bool parse_flags (GLib.ParamSpec pspec, GLib.StringBuilder gstring, GLib.Value property_value);\n\t\tpublic static bool parse_requisition (GLib.ParamSpec pspec, GLib.StringBuilder gstring, GLib.Value property_value);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"CssProvider\", since = \"3.0\")]\n\tpublic class RcStyle : GLib.Object {\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Gdk.Color[] @base;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Gdk.Color[] bg;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak string[] bg_pixmap_name;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Gtk.RcFlags[] color_flags;\n\t\tpublic uint engine_specified;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Gdk.Color[] fg;\n\t\tpublic weak Pango.FontDescription font_desc;\n\t\tpublic weak GLib.SList icon_factories;\n\t\tpublic weak string name;\n\t\tpublic weak GLib.Array rc_properties;\n\t\tpublic weak GLib.SList rc_style_lists;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Gdk.Color[] text;\n\t\tpublic int xthickness;\n\t\tpublic int ythickness;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic RcStyle ();\n\t\tpublic Gtk.RcStyle copy ();\n\t\t[NoWrapper]\n\t\tpublic virtual unowned Gtk.RcStyle create_rc_style ();\n\t\t[NoWrapper]\n\t\tpublic virtual Gtk.Style create_style ();\n\t\t[NoWrapper]\n\t\tpublic virtual void merge (Gtk.RcStyle src);\n\t\t[NoWrapper]\n\t\tpublic virtual uint parse (Gtk.Settings settings, GLib.Scanner scanner);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RecentAction : Gtk.Action, Gtk.Buildable, Gtk.RecentChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkAction*\")]\n\t\tpublic RecentAction (string name, string label, string tooltip, string stock_id);\n\t\t[CCode (has_construct_function = false, type = \"GtkAction*\")]\n\t\tpublic RecentAction.for_manager (string name, string label, string tooltip, string stock_id, Gtk.RecentManager manager);\n\t\tpublic bool get_show_numbers ();\n\t\tpublic void set_show_numbers (bool show_numbers);\n\t\tpublic bool show_numbers { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RecentChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.RecentChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RecentChooserDialog (string title, Gtk.Window parent, ...);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RecentChooserDialog.for_manager (string title, Gtk.Window parent, Gtk.RecentManager manager, ...);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RecentChooserMenu : Gtk.Menu, Atk.Implementor, Gtk.Buildable, Gtk.RecentChooser, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RecentChooserMenu ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RecentChooserMenu.for_manager (Gtk.RecentManager manager);\n\t\tpublic bool get_show_numbers ();\n\t\t[NoWrapper]\n\t\tpublic virtual void gtk_recent1 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void gtk_recent2 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void gtk_recent3 ();\n\t\t[NoWrapper]\n\t\tpublic virtual void gtk_recent4 ();\n\t\tpublic void set_show_numbers (bool show_numbers);\n\t\tpublic bool show_numbers { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RecentChooserWidget : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.RecentChooser {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RecentChooserWidget ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic RecentChooserWidget.for_manager (Gtk.RecentManager manager);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RecentFilter : GLib.InitiallyUnowned, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic RecentFilter ();\n\t\tpublic void add_age (int days);\n\t\tpublic void add_application (string application);\n\t\tpublic void add_custom (Gtk.RecentFilterFlags needed, owned Gtk.RecentFilterFunc func);\n\t\tpublic void add_group (string group);\n\t\tpublic void add_mime_type (string mime_type);\n\t\tpublic void add_pattern (string pattern);\n\t\tpublic void add_pixbuf_formats ();\n\t\tpublic bool filter (Gtk.RecentFilterInfo filter_info);\n\t\tpublic Gtk.RecentFilterFlags get_needed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class RecentFilterInfo {\n\t\tpublic int age;\n\t\tpublic weak string applications;\n\t\tpublic Gtk.RecentFilterFlags contains;\n\t\tpublic weak string display_name;\n\t\tpublic weak string groups;\n\t\tpublic weak string mime_type;\n\t\tpublic weak string uri;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_recent_info_ref\", type_id = \"gtk_recent_info_get_type ()\", unref_function = \"gtk_recent_info_unref\")]\n\t[Compact]\n\tpublic class RecentInfo {\n\t\tpublic unowned GLib.AppInfo create_app_info (string app_name) throws GLib.Error;\n\t\tpublic bool exists ();\n\t\tpublic ulong get_added ();\n\t\tpublic int get_age ();\n\t\tpublic bool get_application_info (string app_name, out unowned string app_exec, out uint count, out ulong time_);\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic string[] get_applications ();\n\t\tpublic unowned string get_description ();\n\t\tpublic unowned string get_display_name ();\n\t\tpublic unowned GLib.Icon get_gicon ();\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic string[] get_groups ();\n\t\tpublic Gdk.Pixbuf? get_icon (int size);\n\t\tpublic unowned string get_mime_type ();\n\t\tpublic ulong get_modified ();\n\t\tpublic bool get_private_hint ();\n\t\tpublic string get_short_name ();\n\t\tpublic unowned string get_uri ();\n\t\tpublic string? get_uri_display ();\n\t\tpublic ulong get_visited ();\n\t\tpublic bool has_application (string app_name);\n\t\tpublic bool has_group (string group_name);\n\t\tpublic bool is_local ();\n\t\tpublic string last_application ();\n\t\tpublic bool match (Gtk.RecentInfo info_b);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RecentManager : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic RecentManager ();\n\t\tpublic bool add_full (string uri, Gtk.RecentData recent_data);\n\t\tpublic bool add_item (string uri);\n\t\tpublic static GLib.Quark error_quark ();\n\t\tpublic static unowned Gtk.RecentManager get_default ();\n\t\tpublic GLib.List<Gtk.RecentInfo> get_items ();\n\t\tpublic bool has_item (string uri);\n\t\tpublic unowned Gtk.RecentInfo lookup_item (string uri) throws GLib.Error;\n\t\tpublic bool move_item (string uri, string new_uri) throws GLib.Error;\n\t\tpublic int purge_items () throws GLib.Error;\n\t\tpublic bool remove_item (string uri) throws GLib.Error;\n\t\t[NoAccessorMethod]\n\t\tpublic string filename { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int size { get; }\n\t\tpublic virtual signal void changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class RendererCellAccessible : Gtk.CellAccessible, Atk.Action, Atk.Component {\n\t\t[CCode (has_construct_function = false, type = \"AtkObject*\")]\n\t\tpublic RendererCellAccessible (Gtk.CellRenderer renderer);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellRenderer renderer { owned get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class RequestedSize {\n\t\tpublic void* data;\n\t\tpublic int minimum_size;\n\t\tpublic int natural_size;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Revealer : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Revealer ();\n\t\tpublic bool get_child_revealed ();\n\t\tpublic bool get_reveal_child ();\n\t\tpublic uint get_transition_duration ();\n\t\tpublic Gtk.RevealerTransitionType get_transition_type ();\n\t\tpublic void set_reveal_child (bool reveal_child);\n\t\tpublic void set_transition_duration (uint duration);\n\t\tpublic void set_transition_type (Gtk.RevealerTransitionType transition);\n\t\tpublic bool child_revealed { get; }\n\t\tpublic bool reveal_child { get; set construct; }\n\t\tpublic uint transition_duration { get; set construct; }\n\t\tpublic Gtk.RevealerTransitionType transition_type { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Scale : Gtk.Range, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Scale (Gtk.Orientation orientation, Gtk.Adjustment? adjustment);\n\t\tpublic void add_mark (double value, Gtk.PositionType position, string? markup);\n\t\tpublic void clear_marks ();\n\t\tpublic int get_digits ();\n\t\tpublic bool get_draw_value ();\n\t\tpublic bool get_has_origin ();\n\t\tpublic unowned Pango.Layout get_layout ();\n\t\tpublic virtual void get_layout_offsets (out int x, out int y);\n\t\tpublic Gtk.PositionType get_value_pos ();\n\t\tpublic void set_digits (int digits);\n\t\tpublic void set_draw_value (bool draw_value);\n\t\tpublic void set_has_origin (bool has_origin);\n\t\tpublic void set_value_pos (Gtk.PositionType pos);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Scale.with_range (Gtk.Orientation orientation, double min, double max, double step);\n\t\tpublic int digits { get; set; }\n\t\tpublic bool draw_value { get; set; }\n\t\tpublic bool has_origin { get; set; }\n\t\tpublic Gtk.PositionType value_pos { get; set; }\n\t\tpublic virtual signal string format_value (double value);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ScaleAccessible : Gtk.RangeAccessible, Atk.Component, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ScaleAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ScaleButton : Gtk.Button, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ScaleButton (Gtk.IconSize size, double min = 0.0, double max = 100.0, double step = 2.0, [CCode (array_length = false)] string[]? icons = null);\n\t\tpublic unowned Gtk.Adjustment get_adjustment ();\n\t\tpublic unowned Gtk.Widget get_minus_button ();\n\t\tpublic unowned Gtk.Widget get_plus_button ();\n\t\tpublic unowned Gtk.Widget get_popup ();\n\t\tpublic double get_value ();\n\t\tpublic void set_adjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_icons ([CCode (array_length = false)] string[] icons);\n\t\tpublic void set_value (double value);\n\t\tpublic Gtk.Adjustment adjustment { get; set; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\t[NoAccessorMethod]\n\t\tpublic string[] icons { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.IconSize size { get; set; }\n\t\tpublic double value { get; set; }\n\t\tpublic virtual signal void popdown ();\n\t\tpublic virtual signal void popup ();\n\t\tpublic virtual signal void value_changed (double value);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ScaleButtonAccessible : Gtk.ButtonAccessible, Atk.Component, Atk.Action, Atk.Image, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ScaleButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Scrollbar : Gtk.Range, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Scrollbar (Gtk.Orientation orientation, Gtk.Adjustment? adjustment);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ScrolledWindow : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ScrolledWindow (Gtk.Adjustment? hadjustment, Gtk.Adjustment? vadjustment);\n\t\tpublic void add_with_viewport (Gtk.Widget child);\n\t\tpublic bool get_capture_button_press ();\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic unowned Gtk.Widget get_hscrollbar ();\n\t\tpublic bool get_kinetic_scrolling ();\n\t\tpublic int get_min_content_height ();\n\t\tpublic int get_min_content_width ();\n\t\tpublic Gtk.CornerType get_placement ();\n\t\tpublic void get_policy (Gtk.PolicyType hscrollbar_policy, Gtk.PolicyType vscrollbar_policy);\n\t\tpublic Gtk.ShadowType get_shadow_type ();\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic unowned Gtk.Widget get_vscrollbar ();\n\t\tpublic void set_capture_button_press (bool capture_button_press);\n\t\tpublic void set_hadjustment (Gtk.Adjustment hadjustment);\n\t\tpublic void set_kinetic_scrolling (bool kinetic_scrolling);\n\t\tpublic void set_min_content_height (int height);\n\t\tpublic void set_min_content_width (int width);\n\t\tpublic void set_placement (Gtk.CornerType window_placement);\n\t\tpublic void set_policy (Gtk.PolicyType hscrollbar_policy, Gtk.PolicyType vscrollbar_policy);\n\t\tpublic void set_shadow_type (Gtk.ShadowType type);\n\t\tpublic void set_vadjustment (Gtk.Adjustment vadjustment);\n\t\tpublic void unset_placement ();\n\t\tpublic Gtk.Adjustment hadjustment { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.PolicyType hscrollbar_policy { get; set; }\n\t\tpublic bool kinetic_scrolling { get; set; }\n\t\tpublic int min_content_height { get; set; }\n\t\tpublic int min_content_width { get; set; }\n\t\tpublic Gtk.ShadowType shadow_type { get; set; }\n\t\tpublic Gtk.Adjustment vadjustment { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.PolicyType vscrollbar_policy { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CornerType window_placement { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool window_placement_set { get; set; }\n\t\tpublic virtual signal void move_focus_out (Gtk.DirectionType direction);\n\t\tpublic virtual signal bool scroll_child (Gtk.ScrollType scroll, bool horizontal);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ScrolledWindowAccessible : Gtk.ContainerAccessible, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ScrolledWindowAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SearchBar : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SearchBar ();\n\t\tpublic void connect_entry (Gtk.Entry entry);\n\t\tpublic bool get_search_mode ();\n\t\tpublic bool get_show_close_button ();\n\t\tpublic bool handle_event (Gdk.Event event);\n\t\tpublic void set_search_mode (bool search_mode);\n\t\tpublic void set_show_close_button (bool visible);\n\t\t[NoAccessorMethod]\n\t\tpublic bool search_mode_enabled { get; set; }\n\t\tpublic bool show_close_button { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SearchEntry : Gtk.Entry, Atk.Implementor, Gtk.Buildable, Gtk.Editable, Gtk.CellEditable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SearchEntry ();\n\t\tpublic virtual signal void search_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", copy_function = \"gtk_selection_data_copy\", type_id = \"gtk_selection_data_get_type ()\")]\n\t[Compact]\n\tpublic class SelectionData {\n\t\tpublic Gtk.SelectionData copy ();\n\t\t[CCode (array_length = false)]\n\t\tpublic unowned uchar[] get_data ();\n\t\tpublic Gdk.Atom get_data_type ();\n\t\tpublic unowned uchar[] get_data_with_length ();\n\t\tpublic unowned Gdk.Display get_display ();\n\t\tpublic int get_format ();\n\t\tpublic int get_length ();\n\t\tpublic Gdk.Pixbuf? get_pixbuf ();\n\t\tpublic Gdk.Atom get_selection ();\n\t\tpublic Gdk.Atom get_target ();\n\t\tpublic bool get_targets (out Gdk.Atom[] targets);\n\t\tpublic string? get_text ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] get_uris ();\n\t\tpublic void @set (Gdk.Atom type, int format, uchar[] data);\n\t\tpublic bool set_pixbuf (Gdk.Pixbuf pixbuf);\n\t\tpublic bool set_text (string str, int len);\n\t\tpublic bool set_uris ([CCode (array_length = false)] string[] uris);\n\t\tpublic bool targets_include_image (bool writable);\n\t\tpublic bool targets_include_rich_text (Gtk.TextBuffer buffer);\n\t\tpublic bool targets_include_text ();\n\t\tpublic bool targets_include_uri ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Separator : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Separator (Gtk.Orientation orientation);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SeparatorMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SeparatorMenuItem ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SeparatorToolItem : Gtk.ToolItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic SeparatorToolItem ();\n\t\tpublic bool get_draw ();\n\t\tpublic void set_draw (bool draw);\n\t\tpublic bool draw { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Settings : GLib.Object, Gtk.StyleProvider {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Settings ();\n\t\tpublic static unowned Gtk.Settings get_default ();\n\t\tpublic static unowned Gtk.Settings get_for_screen (Gdk.Screen screen);\n\t\tpublic static void install_property (GLib.ParamSpec pspec);\n\t\tpublic static void install_property_parser (GLib.ParamSpec pspec, Gtk.RcPropertyParser parser);\n\t\tpublic void set_double_property (string name, double v_double, string origin);\n\t\tpublic void set_long_property (string name, long v_long, string origin);\n\t\tpublic void set_property_value (string name, Gtk.SettingsValue svalue);\n\t\tpublic void set_string_property (string name, string v_string, string origin);\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.HashTable<string,Gdk.Color> color_hash { owned get; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_alternative_button_order { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_alternative_sort_arrows { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_application_prefer_dark_theme { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_auto_mnemonics { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_button_images { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_can_change_accels { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_color_palette { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_color_scheme { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_cursor_blink { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_cursor_blink_time { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_cursor_blink_timeout { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_cursor_theme_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_cursor_theme_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_dnd_drag_threshold { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_double_click_distance { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_double_click_time { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_accels { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_animations { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_event_sounds { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_input_feedback_sounds { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_mnemonics { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_primary_paste { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_enable_tooltips { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint gtk_entry_password_hint_timeout { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_entry_select_on_focus { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_error_bell { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_fallback_icon_theme { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_file_chooser_backend { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_font_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint gtk_fontconfig_timestamp { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_icon_sizes { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_icon_theme_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_im_module { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.IMPreeditStyle gtk_im_preedit_style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.IMStatusStyle gtk_im_status_style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_key_theme_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_keynav_cursor_only { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_keynav_wrap_around { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_label_select_on_focus { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_menu_bar_accel { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_menu_bar_popup_delay { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_menu_images { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_menu_popdown_delay { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_menu_popup_delay { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_modules { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_primary_button_warps_slider { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_print_backends { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_print_preview_command { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_recent_files_enabled { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_recent_files_limit { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_recent_files_max_age { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CornerType gtk_scrolled_window_placement { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_shell_shows_app_menu { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_shell_shows_menubar { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_show_input_method_menu { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_show_unicode_menu { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_sound_theme_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_split_cursor { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_theme_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_timeout_expand { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_timeout_initial { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_timeout_repeat { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.IconSize gtk_toolbar_icon_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ToolbarStyle gtk_toolbar_style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_tooltip_browse_mode_timeout { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_tooltip_browse_timeout { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_tooltip_timeout { get; set; }\n\t\t[Deprecated (replacement = \"Gdk.Event.get_source_device\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic bool gtk_touchscreen_mode { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.PolicyType gtk_visible_focus { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_xft_antialias { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_xft_dpi { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int gtk_xft_hinting { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_xft_hintstyle { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string gtk_xft_rgba { owned get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class SettingsValue {\n\t\tpublic weak string origin;\n\t\tpublic GLib.Value value;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SizeGroup : GLib.Object, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SizeGroup (Gtk.SizeGroupMode mode);\n\t\tpublic void add_widget (Gtk.Widget widget);\n\t\tpublic bool get_ignore_hidden ();\n\t\tpublic Gtk.SizeGroupMode get_mode ();\n\t\tpublic unowned GLib.SList<Gtk.Widget> get_widgets ();\n\t\tpublic void remove_widget (Gtk.Widget widget);\n\t\tpublic void set_ignore_hidden (bool ignore_hidden);\n\t\tpublic void set_mode (Gtk.SizeGroupMode mode);\n\t\tpublic bool ignore_hidden { get; set; }\n\t\tpublic Gtk.SizeGroupMode mode { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtkx.h\")]\n\tpublic class Socket : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Socket ();\n\t\tpublic void add_id (X.Window window);\n\t\tpublic X.Window get_id ();\n\t\tpublic unowned Gdk.Window get_plug_window ();\n\t\tpublic virtual signal void plug_added ();\n\t\tpublic virtual signal bool plug_removed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SpinButton : Gtk.Entry, Atk.Implementor, Gtk.Buildable, Gtk.Editable, Gtk.CellEditable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SpinButton (Gtk.Adjustment adjustment, double climb_rate, uint digits);\n\t\tpublic void configure (Gtk.Adjustment adjustment, double climb_rate, uint digits);\n\t\tpublic unowned Gtk.Adjustment get_adjustment ();\n\t\tpublic uint get_digits ();\n\t\tpublic void get_increments (double step, double page);\n\t\tpublic bool get_numeric ();\n\t\tpublic void get_range (out double min, out double max);\n\t\tpublic bool get_snap_to_ticks ();\n\t\tpublic Gtk.SpinButtonUpdatePolicy get_update_policy ();\n\t\tpublic double get_value ();\n\t\tpublic int get_value_as_int ();\n\t\tpublic bool get_wrap ();\n\t\tpublic void set_adjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_digits (uint digits);\n\t\tpublic void set_increments (double step, double page);\n\t\tpublic void set_numeric (bool numeric);\n\t\tpublic void set_range (double min, double max);\n\t\tpublic void set_snap_to_ticks (bool snap_to_ticks);\n\t\tpublic void set_update_policy (Gtk.SpinButtonUpdatePolicy policy);\n\t\tpublic void set_value (double value);\n\t\tpublic void set_wrap (bool wrap);\n\t\tpublic void spin (Gtk.SpinType direction, double increment);\n\t\tpublic void update ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SpinButton.with_range (double min, double max, double step);\n\t\tpublic Gtk.Adjustment adjustment { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic double climb_rate { get; set; }\n\t\tpublic uint digits { get; set; }\n\t\tpublic bool numeric { get; set; }\n\t\tpublic bool snap_to_ticks { get; set; }\n\t\tpublic Gtk.SpinButtonUpdatePolicy update_policy { get; set; }\n\t\tpublic double value { get; set; }\n\t\tpublic bool wrap { get; set; }\n\t\tpublic virtual signal void change_value (Gtk.ScrollType scroll);\n\t\tpublic virtual signal int input (out double new_value);\n\t\tpublic virtual signal bool output ();\n\t\tpublic virtual signal void value_changed ();\n\t\tpublic virtual signal void wrapped ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SpinButtonAccessible : Gtk.EntryAccessible, Atk.Component, Atk.EditableText, Atk.Text, Atk.Action, Atk.Value {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SpinButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Spinner : Gtk.Widget, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Spinner ();\n\t\tpublic void start ();\n\t\tpublic void stop ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool active { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SpinnerAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SpinnerAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Stack : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Stack ();\n\t\tpublic void add_named (Gtk.Widget child, string name);\n\t\tpublic void add_titled (Gtk.Widget child, string name, string title);\n\t\tpublic bool get_homogeneous ();\n\t\tpublic uint get_transition_duration ();\n\t\tpublic Gtk.StackTransitionType get_transition_type ();\n\t\tpublic unowned Gtk.Widget get_visible_child ();\n\t\tpublic unowned string get_visible_child_name ();\n\t\tpublic void set_homogeneous (bool homogeneous);\n\t\tpublic void set_transition_duration (uint duration);\n\t\tpublic void set_transition_type (Gtk.StackTransitionType transition);\n\t\tpublic void set_visible_child (Gtk.Widget child);\n\t\tpublic void set_visible_child_full (string name, Gtk.StackTransitionType transition);\n\t\tpublic void set_visible_child_name (string name);\n\t\tpublic bool homogeneous { get; set construct; }\n\t\tpublic uint transition_duration { get; set construct; }\n\t\tpublic Gtk.StackTransitionType transition_type { get; set construct; }\n\t\tpublic Gtk.Widget visible_child { get; set; }\n\t\tpublic string visible_child_name { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class StackSwitcher : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic StackSwitcher ();\n\t\tpublic unowned Gtk.Stack get_stack ();\n\t\tpublic void set_stack (Gtk.Stack stack);\n\t\tpublic Gtk.Stack stack { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class StatusIcon : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StatusIcon ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StatusIcon.from_file (string filename);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StatusIcon.from_gicon (GLib.Icon icon);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StatusIcon.from_icon_name (string icon_name);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StatusIcon.from_pixbuf (Gdk.Pixbuf pixbuf);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StatusIcon.from_stock (string stock_id);\n\t\tpublic bool get_geometry (out unowned Gdk.Screen screen, out Gdk.Rectangle area, out Gtk.Orientation orientation);\n\t\tpublic unowned GLib.Icon get_gicon ();\n\t\tpublic bool get_has_tooltip ();\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic int get_size ();\n\t\tpublic unowned string get_stock ();\n\t\tpublic Gtk.ImageType get_storage_type ();\n\t\tpublic unowned string get_title ();\n\t\tpublic unowned string get_tooltip_markup ();\n\t\tpublic unowned string get_tooltip_text ();\n\t\tpublic bool get_visible ();\n\t\tpublic uint32 get_x11_window_id ();\n\t\tpublic bool is_embedded ();\n\t\t[CCode (instance_pos = -1)]\n\t\tpublic void position_menu (Gtk.Menu menu, out int x, out int y, out bool push_in);\n\t\tpublic void set_from_file (string filename);\n\t\tpublic void set_from_gicon (GLib.Icon icon);\n\t\tpublic void set_from_icon_name (string icon_name);\n\t\tpublic void set_from_pixbuf (Gdk.Pixbuf pixbuf);\n\t\tpublic void set_from_stock (string stock_id);\n\t\tpublic void set_has_tooltip (bool has_tooltip);\n\t\tpublic void set_name (string name);\n\t\tpublic void set_screen (Gdk.Screen screen);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_tooltip_markup (string markup);\n\t\tpublic void set_tooltip_text (string text);\n\t\tpublic void set_visible (bool visible);\n\t\t[NoAccessorMethod]\n\t\tpublic bool embedded { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic string file { set; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Icon gicon { owned get; set; }\n\t\tpublic bool has_tooltip { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string icon_name { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Orientation orientation { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf pixbuf { owned get; set; }\n\t\tpublic Gdk.Screen screen { get; set; }\n\t\tpublic int size { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic string stock { owned get; set; }\n\t\tpublic Gtk.ImageType storage_type { get; }\n\t\tpublic string title { get; set; }\n\t\tpublic string tooltip_markup { get; set; }\n\t\tpublic string tooltip_text { get; set; }\n\t\tpublic bool visible { get; set; }\n\t\tpublic virtual signal void activate ();\n\t\tpublic virtual signal bool button_press_event (Gdk.EventButton event);\n\t\tpublic virtual signal bool button_release_event (Gdk.EventButton event);\n\t\tpublic virtual signal void popup_menu (uint button, uint activate_time);\n\t\tpublic virtual signal bool query_tooltip (int x, int y, bool keyboard_mode, Gtk.Tooltip tooltip);\n\t\tpublic virtual signal bool scroll_event (Gdk.EventScroll event);\n\t\tpublic virtual signal bool size_changed (int size);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Statusbar : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Statusbar ();\n\t\tpublic uint get_context_id (string context_description);\n\t\tpublic unowned Gtk.Container get_message_area ();\n\t\tpublic void pop (uint context_id);\n\t\tpublic uint push (uint context_id, string text);\n\t\tpublic void remove (uint context_id, uint message_id);\n\t\tpublic void remove_all (uint context_id);\n\t\tpublic virtual signal void text_popped (uint context_id, string text);\n\t\tpublic virtual signal void text_pushed (uint context_id, string text);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class StatusbarAccessible : Gtk.ContainerAccessible, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected StatusbarAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext\", since = \"3.0\")]\n\tpublic class Style : GLib.Object {\n\t\tpublic int attach_count;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Cairo.Pattern[] background;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] @base;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] bg;\n\t\tpublic Gdk.Color black;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] dark;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] fg;\n\t\tpublic weak Pango.FontDescription font_desc;\n\t\tpublic weak GLib.SList icon_factories;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] light;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] mid;\n\t\tpublic weak GLib.Array property_cache;\n\t\tpublic weak Gtk.RcStyle rc_style;\n\t\tpublic weak GLib.SList styles;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] text;\n\t\t[CCode (array_length = false)]\n\t\tpublic Gdk.Color[] text_aa;\n\t\tpublic weak Gdk.Visual visual;\n\t\tpublic Gdk.Color white;\n\t\tpublic int xthickness;\n\t\tpublic int ythickness;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Style ();\n\t\tpublic void apply_default_background (Cairo.Context cr, Gdk.Window window, Gtk.StateType state_type, int x, int y, int width, int height);\n\t\tpublic unowned Gtk.Style attach (Gdk.Window window);\n\t\t[NoWrapper]\n\t\tpublic virtual Gtk.Style clone ();\n\t\tpublic Gtk.Style copy ();\n\t\t[CCode (instance_pos = -1, vfunc_name = \"copy\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void copy_to (Gtk.Style dest);\n\t\tpublic void detach ();\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_arrow (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, Gtk.ArrowType arrow_type, bool fill, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_box (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_box_gap (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height, Gtk.PositionType gap_side, int gap_x, int gap_width);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_check (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_diamond (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_expander (Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, int x, int y, Gtk.ExpanderStyle expander_style);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_extension (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height, Gtk.PositionType gap_side);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_flat_box (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_focus (Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_handle (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height, Gtk.Orientation orientation);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_hline (Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, int x1, int x2, int y);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_layout (Cairo.Context cr, Gtk.StateType state_type, bool use_text, Gtk.Widget widget, string detail, int x, int y, Pango.Layout layout);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_option (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_resize_grip (Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, Gdk.WindowEdge edge, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_shadow (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_shadow_gap (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height, Gtk.PositionType gap_side, int gap_x, int gap_width);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_slider (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height, Gtk.Orientation orientation);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_spinner (Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, uint step, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_tab (Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget widget, string detail, int x, int y, int width, int height);\n\t\t[NoWrapper]\n\t\tpublic virtual void draw_vline (Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, int y1_, int y2_, int x);\n\t\tpublic void @get (GLib.Type widget_type, ...);\n\t\tpublic void get_style_property (GLib.Type widget_type, string property_name, out GLib.Value value);\n\t\tpublic void get_valist (GLib.Type widget_type, string first_property_name, void* var_args);\n\t\tpublic bool has_context ();\n\t\t[NoWrapper]\n\t\tpublic virtual void init_from_rc (Gtk.RcStyle rc_style);\n\t\tpublic bool lookup_color (string color_name, out Gdk.Color color);\n\t\tpublic unowned Gtk.IconSet lookup_icon_set (string stock_id);\n\t\tpublic virtual unowned Gdk.Pixbuf render_icon (Gtk.IconSource source, Gtk.TextDirection direction, Gtk.StateType state, Gtk.IconSize size, Gtk.Widget widget, string detail);\n\t\tpublic virtual void set_background (Gdk.Window window, Gtk.StateType state_type);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.StyleContext context { owned get; construct; }\n\t\tpublic virtual signal void realize ();\n\t\tpublic virtual signal void unrealize ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class StyleContext : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StyleContext ();\n\t\tpublic void add_class (string class_name);\n\t\tpublic void add_provider (Gtk.StyleProvider provider, uint priority);\n\t\tpublic static void add_provider_for_screen (Gdk.Screen screen, Gtk.StyleProvider provider, uint priority);\n\t\tpublic void add_region (string region_name, Gtk.RegionFlags flags);\n\t\tpublic void cancel_animations (void* region_id);\n\t\tpublic void @get (Gtk.StateFlags state, ...);\n\t\tpublic Gdk.RGBA get_background_color (Gtk.StateFlags state);\n\t\tpublic Gtk.Border get_border (Gtk.StateFlags state);\n\t\tpublic Gdk.RGBA get_border_color (Gtk.StateFlags state);\n\t\tpublic Gdk.RGBA get_color (Gtk.StateFlags state);\n\t\tpublic Gtk.TextDirection get_direction ();\n\t\tpublic unowned Pango.FontDescription get_font (Gtk.StateFlags state);\n\t\tpublic unowned Gdk.FrameClock get_frame_clock ();\n\t\tpublic Gtk.JunctionSides get_junction_sides ();\n\t\tpublic Gtk.Border get_margin (Gtk.StateFlags state);\n\t\tpublic Gtk.Border get_padding (Gtk.StateFlags state);\n\t\tpublic unowned Gtk.StyleContext get_parent ();\n\t\tpublic unowned Gtk.WidgetPath get_path ();\n\t\tpublic void get_property (string property, Gtk.StateFlags state, GLib.Value value);\n\t\tpublic int get_scale ();\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic unowned Gtk.CssSection get_section (string property);\n\t\tpublic Gtk.StateFlags get_state ();\n\t\tpublic void get_style (...);\n\t\tpublic void get_style_property (string property_name, GLib.Value value);\n\t\tpublic void get_style_valist (void* args);\n\t\tpublic void get_valist (Gtk.StateFlags state, void* args);\n\t\tpublic bool has_class (string class_name);\n\t\tpublic bool has_region (string region_name, out Gtk.RegionFlags flags_return);\n\t\tpublic void invalidate ();\n\t\tpublic unowned GLib.List list_classes ();\n\t\tpublic unowned GLib.List list_regions ();\n\t\tpublic bool lookup_color (string color_name, out Gdk.RGBA color);\n\t\tpublic unowned Gtk.IconSet lookup_icon_set (string stock_id);\n\t\tpublic void notify_state_change (Gdk.Window window, void* region_id, Gtk.StateType state, bool state_value);\n\t\tpublic void pop_animatable_region ();\n\t\tpublic void push_animatable_region (void* region_id);\n\t\tpublic void remove_class (string class_name);\n\t\tpublic void remove_provider (Gtk.StyleProvider provider);\n\t\tpublic static void remove_provider_for_screen (Gdk.Screen screen, Gtk.StyleProvider provider);\n\t\tpublic void remove_region (string region_name);\n\t\t[CCode (cname = \"gtk_render_activity\")]\n\t\tpublic void render_activity (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_arrow\")]\n\t\tpublic void render_arrow (Cairo.Context cr, double angle, double x, double y, double size);\n\t\t[CCode (cname = \"gtk_render_background\")]\n\t\tpublic void render_background (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_check\")]\n\t\tpublic void render_check (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_expander\")]\n\t\tpublic void render_expander (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_extension\")]\n\t\tpublic void render_extension (Cairo.Context cr, double x, double y, double width, double height, Gtk.PositionType gap_side);\n\t\t[CCode (cname = \"gtk_render_focus\")]\n\t\tpublic void render_focus (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_frame\")]\n\t\tpublic void render_frame (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_frame_gap\")]\n\t\tpublic void render_frame_gap (Cairo.Context cr, double x, double y, double width, double height, Gtk.PositionType gap_side, double xy0_gap, double xy1_gap);\n\t\t[CCode (cname = \"gtk_render_handle\")]\n\t\tpublic void render_handle (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_icon\")]\n\t\tpublic void render_icon (Cairo.Context cr, Gdk.Pixbuf pixbuf, double x, double y);\n\t\t[CCode (cname = \"gtk_render_icon_pixbuf\")]\n\t\tpublic unowned Gdk.Pixbuf render_icon_pixbuf (Gtk.IconSource source, Gtk.IconSize size);\n\t\t[CCode (cname = \"gtk_render_layout\")]\n\t\tpublic void render_layout (Cairo.Context cr, double x, double y, Pango.Layout layout);\n\t\t[CCode (cname = \"gtk_render_line\")]\n\t\tpublic void render_line (Cairo.Context cr, double x0, double y0, double x1, double y1);\n\t\t[CCode (cname = \"gtk_render_option\")]\n\t\tpublic void render_option (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[CCode (cname = \"gtk_render_slider\")]\n\t\tpublic void render_slider (Cairo.Context cr, double x, double y, double width, double height, Gtk.Orientation orientation);\n\t\tpublic static void reset_widgets (Gdk.Screen screen);\n\t\tpublic void restore ();\n\t\tpublic void save ();\n\t\tpublic void scroll_animations (Gdk.Window window, int dx, int dy);\n\t\tpublic void set_background (Gdk.Window window);\n\t\tpublic void set_direction (Gtk.TextDirection direction);\n\t\tpublic void set_frame_clock (Gdk.FrameClock frame_clock);\n\t\tpublic void set_junction_sides (Gtk.JunctionSides sides);\n\t\tpublic void set_parent (Gtk.StyleContext parent);\n\t\tpublic void set_path (Gtk.WidgetPath path);\n\t\tpublic void set_scale (int scale);\n\t\tpublic void set_screen (Gdk.Screen screen);\n\t\tpublic void set_state (Gtk.StateFlags flags);\n\t\tpublic bool state_is_running (Gtk.StateType state, double progress);\n\t\tpublic Gtk.TextDirection direction { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.FrameClock paint_clock { owned get; set; }\n\t\tpublic Gtk.StyleContext parent { get; set; }\n\t\tpublic Gdk.Screen screen { get; set; }\n\t\tpublic virtual signal void changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class StyleProperties : GLib.Object, Gtk.StyleProvider {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic StyleProperties ();\n\t\tpublic void clear ();\n\t\tpublic void @get (Gtk.StateFlags state);\n\t\tpublic bool get_property (string property, Gtk.StateFlags state, GLib.Value value);\n\t\tpublic void get_valist (Gtk.StateFlags state, void* args);\n\t\tpublic unowned Gtk.SymbolicColor lookup_color (string name);\n\t\tpublic static bool lookup_property (string property_name, Gtk.StylePropertyParser parse_func, out unowned GLib.ParamSpec pspec);\n\t\tpublic void map_color (string name, Gtk.SymbolicColor color);\n\t\tpublic void merge (Gtk.StyleProperties props_to_merge, bool replace);\n\t\tpublic static void register_property (Gtk.StylePropertyParser? parse_func, GLib.ParamSpec pspec);\n\t\tpublic void @set (Gtk.StateFlags state);\n\t\tpublic void set_property (string property, Gtk.StateFlags state, GLib.Value value);\n\t\tpublic void set_valist (Gtk.StateFlags state, void* args);\n\t\tpublic void unset_property (string property, Gtk.StateFlags state);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Switch : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Switch ();\n\t\tpublic bool get_active ();\n\t\tpublic void set_active (bool is_active);\n\t\tpublic bool active { get; set; }\n\t\tpublic virtual signal void activate ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class SwitchAccessible : Gtk.WidgetAccessible, Atk.Component, Atk.Action {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SwitchAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_symbolic_color_ref\", type_id = \"gtk_symbolic_color_get_type ()\", unref_function = \"gtk_symbolic_color_unref\")]\n\t[Compact]\n\tpublic class SymbolicColor {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SymbolicColor.alpha (Gtk.SymbolicColor color, double factor);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SymbolicColor.literal (Gdk.RGBA color);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SymbolicColor.mix (Gtk.SymbolicColor color1, Gtk.SymbolicColor color2, double factor);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SymbolicColor.name (string name);\n\t\tpublic bool resolve (Gtk.StyleProperties props, out Gdk.RGBA resolved_color);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SymbolicColor.shade (Gtk.SymbolicColor color, double factor);\n\t\tpublic unowned string to_string ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SymbolicColor.win32 (string theme_class, int id);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Grid\", since = \"3.4\")]\n\tpublic class Table : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Table (uint rows, uint columns, bool homogeneous);\n\t\tpublic void attach (Gtk.Widget child, uint left_attach, uint right_attach, uint top_attach, uint bottom_attach, Gtk.AttachOptions xoptions, Gtk.AttachOptions yoptions, uint xpadding, uint ypadding);\n\t\tpublic void attach_defaults (Gtk.Widget widget, uint left_attach, uint right_attach, uint top_attach, uint bottom_attach);\n\t\tpublic uint get_col_spacing (uint column);\n\t\tpublic uint get_default_col_spacing ();\n\t\tpublic uint get_default_row_spacing ();\n\t\tpublic bool get_homogeneous ();\n\t\tpublic uint get_row_spacing (uint row);\n\t\tpublic void get_size (uint rows, uint columns);\n\t\tpublic void resize (uint rows, uint columns);\n\t\tpublic void set_col_spacing (uint column, uint spacing);\n\t\tpublic void set_col_spacings (uint spacing);\n\t\tpublic void set_homogeneous (bool homogeneous);\n\t\tpublic void set_row_spacing (uint row, uint spacing);\n\t\tpublic void set_row_spacings (uint spacing);\n\t\t[NoAccessorMethod]\n\t\tpublic uint column_spacing { get; set; }\n\t\tpublic bool homogeneous { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint n_columns { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint n_rows { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint row_spacing { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class TableChild {\n\t\tpublic uint16 bottom_attach;\n\t\tpublic uint16 left_attach;\n\t\tpublic uint16 right_attach;\n\t\tpublic uint16 top_attach;\n\t\tpublic weak Gtk.Widget widget;\n\t\tpublic uint xexpand;\n\t\tpublic uint xfill;\n\t\tpublic uint16 xpadding;\n\t\tpublic uint xshrink;\n\t\tpublic uint yexpand;\n\t\tpublic uint yfill;\n\t\tpublic uint16 ypadding;\n\t\tpublic uint yshrink;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class TableRowCol {\n\t\tpublic uint16 allocation;\n\t\tpublic uint empty;\n\t\tpublic uint expand;\n\t\tpublic uint need_expand;\n\t\tpublic uint need_shrink;\n\t\tpublic uint16 requisition;\n\t\tpublic uint shrink;\n\t\tpublic uint16 spacing;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_target_list_ref\", type_id = \"gtk_target_list_get_type ()\", unref_function = \"gtk_target_list_unref\")]\n\t[Compact]\n\tpublic class TargetList {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TargetList (Gtk.TargetEntry[] targets);\n\t\tpublic void add (Gdk.Atom target, uint flags, uint info);\n\t\tpublic void add_image_targets (uint info, bool writable);\n\t\tpublic void add_rich_text_targets (uint info, bool deserializable, Gtk.TextBuffer buffer);\n\t\tpublic void add_table (Gtk.TargetEntry[] targets);\n\t\tpublic void add_text_targets (uint info);\n\t\tpublic void add_uri_targets (uint info);\n\t\tpublic bool find (Gdk.Atom target, uint info);\n\t\tpublic void remove (Gdk.Atom target);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.4\")]\n\tpublic class TearoffMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic TearoffMenuItem ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class TextAppearance {\n\t\tpublic Gdk.Color bg_color;\n\t\tpublic uint draw_bg;\n\t\tpublic Gdk.Color fg_color;\n\t\tpublic uint inside_selection;\n\t\tpublic uint is_text;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak Gdk.RGBA[] rgba;\n\t\tpublic int rise;\n\t\tpublic uint strikethrough;\n\t\tpublic uint underline;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_text_attributes_ref\", type_id = \"gtk_text_attributes_get_type ()\", unref_function = \"gtk_text_attributes_unref\")]\n\t[Compact]\n\tpublic class TextAttributes {\n\t\tpublic weak Gtk.TextAppearance appearance;\n\t\tpublic uint bg_full_height;\n\t\tpublic Gtk.TextDirection direction;\n\t\tpublic uint editable;\n\t\tpublic weak Pango.FontDescription font;\n\t\tpublic double font_scale;\n\t\tpublic int indent;\n\t\tpublic uint invisible;\n\t\tpublic Gtk.Justification justification;\n\t\tpublic weak Pango.Language language;\n\t\tpublic int left_margin;\n\t\t[CCode (array_length = false)]\n\t\tpublic weak uint[] padding;\n\t\tpublic Gdk.Color pg_bg_color;\n\t\tpublic Gdk.RGBA pg_bg_rgba;\n\t\tpublic int pixels_above_lines;\n\t\tpublic int pixels_below_lines;\n\t\tpublic int pixels_inside_wrap;\n\t\tpublic uint refcount;\n\t\tpublic int right_margin;\n\t\tpublic weak Pango.TabArray tabs;\n\t\tpublic Gtk.WrapMode wrap_mode;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TextAttributes ();\n\t\tpublic Gtk.TextAttributes copy ();\n\t\tpublic void copy_values (Gtk.TextAttributes dest);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class TextBTree {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextBuffer : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TextBuffer (Gtk.TextTagTable? table);\n\t\tpublic void add_mark (Gtk.TextMark mark, Gtk.TextIter where);\n\t\tpublic void add_selection_clipboard (Gtk.Clipboard clipboard);\n\t\tpublic void apply_tag_by_name (string name, Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic bool backspace (Gtk.TextIter iter, bool interactive, bool default_editable);\n\t\tpublic void copy_clipboard (Gtk.Clipboard clipboard);\n\t\tpublic unowned Gtk.TextChildAnchor create_child_anchor (Gtk.TextIter iter);\n\t\tpublic unowned Gtk.TextMark create_mark (string? mark_name, Gtk.TextIter where, bool left_gravity);\n\t\tpublic unowned Gtk.TextTag create_tag (string? tag_name, ...);\n\t\tpublic void cut_clipboard (Gtk.Clipboard clipboard, bool default_editable);\n\t\tpublic void @delete (ref Gtk.TextIter start, ref Gtk.TextIter end);\n\t\tpublic bool delete_interactive (ref Gtk.TextIter start_iter, ref Gtk.TextIter end_iter, bool default_editable);\n\t\tpublic void delete_mark (Gtk.TextMark mark);\n\t\tpublic void delete_mark_by_name (string name);\n\t\tpublic bool delete_selection (bool interactive, bool default_editable);\n\t\tpublic bool deserialize (Gtk.TextBuffer content_buffer, Gdk.Atom format, Gtk.TextIter iter, [CCode (array_length_type = \"gsize\")] uint8[] data) throws GLib.Error;\n\t\tpublic bool deserialize_get_can_create_tags (Gdk.Atom format);\n\t\tpublic void deserialize_set_can_create_tags (Gdk.Atom format, bool can_create_tags);\n\t\tpublic void get_bounds (out Gtk.TextIter start, out Gtk.TextIter end);\n\t\tpublic int get_char_count ();\n\t\tpublic unowned Gtk.TargetList get_copy_target_list ();\n\t\tpublic Gdk.Atom[] get_deserialize_formats ();\n\t\tpublic void get_end_iter (out Gtk.TextIter iter);\n\t\tpublic bool get_has_selection ();\n\t\tpublic unowned Gtk.TextMark get_insert ();\n\t\tpublic void get_iter_at_child_anchor (out Gtk.TextIter iter, Gtk.TextChildAnchor anchor);\n\t\tpublic void get_iter_at_line (out Gtk.TextIter iter, int line_number);\n\t\tpublic void get_iter_at_line_index (out Gtk.TextIter iter, int line_number, int byte_index);\n\t\tpublic void get_iter_at_line_offset (out Gtk.TextIter iter, int line_number, int char_offset);\n\t\tpublic void get_iter_at_mark (out Gtk.TextIter iter, Gtk.TextMark mark);\n\t\tpublic void get_iter_at_offset (out Gtk.TextIter iter, int char_offset);\n\t\tpublic int get_line_count ();\n\t\tpublic unowned Gtk.TextMark get_mark (string name);\n\t\tpublic bool get_modified ();\n\t\tpublic unowned Gtk.TargetList get_paste_target_list ();\n\t\tpublic unowned Gtk.TextMark get_selection_bound ();\n\t\tpublic bool get_selection_bounds (out Gtk.TextIter start, out Gtk.TextIter end);\n\t\tpublic Gdk.Atom[] get_serialize_formats ();\n\t\tpublic string get_slice (Gtk.TextIter start, Gtk.TextIter end, bool include_hidden_chars);\n\t\tpublic void get_start_iter (out Gtk.TextIter iter);\n\t\tpublic unowned Gtk.TextTagTable get_tag_table ();\n\t\tpublic string get_text (Gtk.TextIter start, Gtk.TextIter end, bool include_hidden_chars);\n\t\tpublic void insert (ref Gtk.TextIter iter, string text, int len);\n\t\tpublic void insert_at_cursor (string text, int len);\n\t\tpublic bool insert_interactive (Gtk.TextIter iter, string text, int len, bool default_editable);\n\t\tpublic bool insert_interactive_at_cursor (string text, int len, bool default_editable);\n\t\tpublic void insert_range (Gtk.TextIter iter, Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic bool insert_range_interactive (Gtk.TextIter iter, Gtk.TextIter start, Gtk.TextIter end, bool default_editable);\n\t\tpublic void insert_with_tags (Gtk.TextIter iter, string text, int len, ...);\n\t\tpublic void insert_with_tags_by_name (Gtk.TextIter iter, string text, int len, ...);\n\t\tpublic void move_mark (Gtk.TextMark mark, Gtk.TextIter where);\n\t\tpublic void move_mark_by_name (string name, Gtk.TextIter where);\n\t\tpublic void paste_clipboard (Gtk.Clipboard clipboard, Gtk.TextIter? override_location, bool default_editable);\n\t\tpublic void place_cursor (Gtk.TextIter where);\n\t\tpublic Gdk.Atom register_deserialize_format (string mime_type, owned Gtk.TextBufferDeserializeFunc function);\n\t\tpublic Gdk.Atom register_deserialize_tagset (string tagset_name);\n\t\tpublic Gdk.Atom register_serialize_format (string mime_type, owned Gtk.TextBufferSerializeFunc function);\n\t\tpublic Gdk.Atom register_serialize_tagset (string tagset_name);\n\t\tpublic void remove_all_tags (Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic void remove_selection_clipboard (Gtk.Clipboard clipboard);\n\t\tpublic void remove_tag_by_name (string name, Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic void select_range (Gtk.TextIter ins, Gtk.TextIter bound);\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic uint8[] serialize (Gtk.TextBuffer content_buffer, Gdk.Atom format, Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic void set_modified (bool setting);\n\t\tpublic void set_text (string text, int len = -1);\n\t\tpublic void unregister_deserialize_format (Gdk.Atom format);\n\t\tpublic void unregister_serialize_format (Gdk.Atom format);\n\t\tpublic Gtk.TargetList copy_target_list { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic int cursor_position { get; }\n\t\tpublic bool has_selection { get; }\n\t\tpublic Gtk.TargetList paste_target_list { get; }\n\t\tpublic Gtk.TextTagTable tag_table { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void apply_tag (Gtk.TextTag tag, Gtk.TextIter start, Gtk.TextIter end);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void begin_user_action ();\n\t\tpublic virtual signal void changed ();\n\t\tpublic virtual signal void delete_range (Gtk.TextIter start, Gtk.TextIter end);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void end_user_action ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void insert_child_anchor (Gtk.TextIter iter, Gtk.TextChildAnchor anchor);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void insert_pixbuf (Gtk.TextIter iter, Gdk.Pixbuf pixbuf);\n\t\tpublic virtual signal void insert_text (ref Gtk.TextIter pos, string new_text, int new_text_length);\n\t\tpublic virtual signal void mark_deleted (Gtk.TextMark mark);\n\t\tpublic virtual signal void mark_set (Gtk.TextIter location, Gtk.TextMark mark);\n\t\tpublic virtual signal void modified_changed ();\n\t\tpublic virtual signal void paste_done (Gtk.Clipboard clipboard);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void remove_tag (Gtk.TextTag tag, Gtk.TextIter start, Gtk.TextIter end);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextCellAccessible : Gtk.RendererCellAccessible, Atk.Action, Atk.Component, Atk.Text {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected TextCellAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextChildAnchor : GLib.Object {\n\t\tpublic void* segment;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TextChildAnchor ();\n\t\tpublic bool get_deleted ();\n\t\tpublic GLib.List<weak Gtk.Widget> get_widgets ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextMark : GLib.Object {\n\t\tpublic void* segment;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TextMark (string name, bool left_gravity);\n\t\tpublic unowned Gtk.TextBuffer get_buffer ();\n\t\tpublic bool get_deleted ();\n\t\tpublic bool get_left_gravity ();\n\t\tpublic unowned string get_name ();\n\t\tpublic bool get_visible ();\n\t\tpublic void set_visible (bool setting);\n\t\tpublic bool left_gravity { get; construct; }\n\t\tpublic string name { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextTag : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TextTag (string? name = null);\n\t\tpublic int get_priority ();\n\t\tpublic void set_priority (int priority);\n\t\t[NoAccessorMethod]\n\t\tpublic bool accumulative_margin { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string background { set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_full_height { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_full_height_set { get; set; }\n\t\t[Deprecated (replacement = \"background_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color background_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA background_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TextDirection direction { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool editable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool editable_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string family { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool family_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string font { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.FontDescription font_desc { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string foreground { set; }\n\t\t[Deprecated (replacement = \"foreground_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color foreground_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA foreground_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool foreground_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int indent { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool indent_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool invisible { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool invisible_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.Justification justification { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool justification_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string language { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool language_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int left_margin { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool left_margin_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string name { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string paragraph_background { set; }\n\t\t[Deprecated (replacement = \"paragraph_background_rgba\", since = \"3.4\")]\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Color paragraph_background_gdk { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA paragraph_background_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool paragraph_background_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int pixels_above_lines { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool pixels_above_lines_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int pixels_below_lines { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool pixels_below_lines_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int pixels_inside_wrap { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool pixels_inside_wrap_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int right_margin { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool right_margin_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int rise { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool rise_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic double scale { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool scale_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic double size_points { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool size_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Stretch stretch { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool stretch_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool strikethrough { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool strikethrough_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Style style { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool style_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.TabArray tabs { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool tabs_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Underline underline { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool underline_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Pango.Variant variant { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool variant_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int weight { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool weight_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.WrapMode wrap_mode { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool wrap_mode_set { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool event (GLib.Object event_object, Gdk.Event event, Gtk.TextIter iter);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextTagTable : GLib.Object, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TextTagTable ();\n\t\tpublic void add (Gtk.TextTag tag);\n\t\tpublic void @foreach (Gtk.TextTagTableForeach func);\n\t\tpublic int get_size ();\n\t\tpublic unowned Gtk.TextTag lookup (string name);\n\t\tpublic void remove (Gtk.TextTag tag);\n\t\tpublic virtual signal void tag_added (Gtk.TextTag tag);\n\t\tpublic virtual signal void tag_changed (Gtk.TextTag tag, bool size_changed);\n\t\tpublic virtual signal void tag_removed (Gtk.TextTag tag);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextView : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic TextView ();\n\t\tpublic void add_child_at_anchor (Gtk.Widget child, Gtk.TextChildAnchor anchor);\n\t\tpublic void add_child_in_window (Gtk.Widget child, Gtk.TextWindowType which_window, int xpos, int ypos);\n\t\tpublic bool backward_display_line (Gtk.TextIter iter);\n\t\tpublic bool backward_display_line_start (Gtk.TextIter iter);\n\t\tpublic void buffer_to_window_coords (Gtk.TextWindowType win, int buffer_x, int buffer_y, out int window_x, out int window_y);\n\t\tpublic bool forward_display_line (Gtk.TextIter iter);\n\t\tpublic bool forward_display_line_end (Gtk.TextIter iter);\n\t\tpublic bool get_accepts_tab ();\n\t\tpublic int get_border_window_size (Gtk.TextWindowType type);\n\t\tpublic unowned Gtk.TextBuffer get_buffer ();\n\t\tpublic void get_cursor_locations (Gtk.TextIter iter, Gdk.Rectangle strong, Gdk.Rectangle @weak);\n\t\tpublic bool get_cursor_visible ();\n\t\tpublic unowned Gtk.TextAttributes get_default_attributes ();\n\t\tpublic bool get_editable ();\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic int get_indent ();\n\t\tpublic Gtk.InputHints get_input_hints ();\n\t\tpublic Gtk.InputPurpose get_input_purpose ();\n\t\tpublic void get_iter_at_location (out Gtk.TextIter iter, int x, int y);\n\t\tpublic void get_iter_at_position (out Gtk.TextIter iter, out int trailing, int x, int y);\n\t\tpublic void get_iter_location (Gtk.TextIter iter, out Gdk.Rectangle location);\n\t\tpublic Gtk.Justification get_justification ();\n\t\tpublic int get_left_margin ();\n\t\tpublic void get_line_at_y (out Gtk.TextIter target_iter, int y, out int line_top);\n\t\tpublic void get_line_yrange (Gtk.TextIter iter, out int y, out int height);\n\t\tpublic bool get_overwrite ();\n\t\tpublic int get_pixels_above_lines ();\n\t\tpublic int get_pixels_below_lines ();\n\t\tpublic int get_pixels_inside_wrap ();\n\t\tpublic int get_right_margin ();\n\t\tpublic unowned Pango.TabArray get_tabs ();\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic void get_visible_rect (out Gdk.Rectangle visible_rect);\n\t\tpublic unowned Gdk.Window get_window (Gtk.TextWindowType win);\n\t\tpublic Gtk.TextWindowType get_window_type (Gdk.Window window);\n\t\tpublic Gtk.WrapMode get_wrap_mode ();\n\t\tpublic bool im_context_filter_keypress (Gdk.EventKey event);\n\t\tpublic void move_child (Gtk.Widget child, int xpos, int ypos);\n\t\tpublic bool move_mark_onscreen (Gtk.TextMark mark);\n\t\tpublic bool move_visually (Gtk.TextIter iter, int count);\n\t\tpublic bool place_cursor_onscreen ();\n\t\tpublic void reset_im_context ();\n\t\tpublic void scroll_mark_onscreen (Gtk.TextMark mark);\n\t\tpublic bool scroll_to_iter (Gtk.TextIter iter, double within_margin, bool use_align, double xalign, double yalign);\n\t\tpublic void scroll_to_mark (Gtk.TextMark mark, double within_margin, bool use_align, double xalign, double yalign);\n\t\tpublic void set_accepts_tab (bool accepts_tab);\n\t\tpublic void set_border_window_size (Gtk.TextWindowType type, int size);\n\t\tpublic void set_buffer (Gtk.TextBuffer buffer);\n\t\tpublic void set_cursor_visible (bool setting);\n\t\tpublic void set_editable (bool setting);\n\t\tpublic void set_indent (int indent);\n\t\tpublic void set_input_hints (Gtk.InputHints hints);\n\t\tpublic void set_input_purpose (Gtk.InputPurpose purpose);\n\t\tpublic void set_justification (Gtk.Justification justification);\n\t\tpublic void set_left_margin (int left_margin);\n\t\tpublic void set_overwrite (bool overwrite);\n\t\tpublic void set_pixels_above_lines (int pixels_above_lines);\n\t\tpublic void set_pixels_below_lines (int pixels_below_lines);\n\t\tpublic void set_pixels_inside_wrap (int pixels_inside_wrap);\n\t\tpublic void set_right_margin (int right_margin);\n\t\tpublic void set_tabs (Pango.TabArray tabs);\n\t\tpublic void set_wrap_mode (Gtk.WrapMode wrap_mode);\n\t\tpublic bool starts_display_line (Gtk.TextIter iter);\n\t\tpublic void window_to_buffer_coords (Gtk.TextWindowType win, int window_x, int window_y, out int buffer_x, out int buffer_y);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic TextView.with_buffer (Gtk.TextBuffer buffer);\n\t\tpublic bool accepts_tab { get; set; }\n\t\tpublic Gtk.TextBuffer buffer { get; set; }\n\t\tpublic bool cursor_visible { get; set; }\n\t\tpublic bool editable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string im_module { owned get; set; }\n\t\tpublic int indent { get; set; }\n\t\tpublic Gtk.InputHints input_hints { get; set; }\n\t\tpublic Gtk.InputPurpose input_purpose { get; set; }\n\t\tpublic Gtk.Justification justification { get; set; }\n\t\tpublic int left_margin { get; set; }\n\t\tpublic bool overwrite { get; set; }\n\t\tpublic int pixels_above_lines { get; set; }\n\t\tpublic int pixels_below_lines { get; set; }\n\t\tpublic int pixels_inside_wrap { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool populate_all { get; set; }\n\t\tpublic int right_margin { get; set; }\n\t\tpublic Pango.TabArray tabs { get; set; }\n\t\tpublic Gtk.WrapMode wrap_mode { get; set; }\n\t\tpublic virtual signal void backspace ();\n\t\tpublic virtual signal void copy_clipboard ();\n\t\tpublic virtual signal void cut_clipboard ();\n\t\tpublic virtual signal void delete_from_cursor (Gtk.DeleteType type, int count);\n\t\tpublic virtual signal void insert_at_cursor (string str);\n\t\tpublic virtual signal void move_cursor (Gtk.MovementStep step, int count, bool extend_selection);\n\t\tpublic virtual signal void move_viewport (Gtk.ScrollStep p0, int p1);\n\t\tpublic virtual signal void paste_clipboard ();\n\t\tpublic virtual signal void populate_popup (Gtk.Menu popup);\n\t\tpublic virtual signal void preedit_changed (string p0);\n\t\tpublic virtual signal void select_all (bool p0);\n\t\tpublic virtual signal void set_anchor ();\n\t\tpublic virtual signal void toggle_cursor_visible ();\n\t\tpublic virtual signal void toggle_overwrite ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TextViewAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.EditableText, Atk.Text, Atk.StreamableContent {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected TextViewAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class ThemeEngine {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ThemingEngine : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ThemingEngine ();\n\t\tpublic void @get (Gtk.StateFlags state, ...);\n\t\tpublic Gdk.RGBA get_background_color (Gtk.StateFlags state);\n\t\tpublic Gtk.Border get_border (Gtk.StateFlags state);\n\t\tpublic Gdk.RGBA get_border_color (Gtk.StateFlags state);\n\t\tpublic Gdk.RGBA get_color (Gtk.StateFlags state);\n\t\tpublic Gtk.TextDirection get_direction ();\n\t\tpublic unowned Pango.FontDescription get_font (Gtk.StateFlags state);\n\t\tpublic Gtk.JunctionSides get_junction_sides ();\n\t\tpublic Gtk.Border get_margin (Gtk.StateFlags state);\n\t\tpublic Gtk.Border get_padding (Gtk.StateFlags state);\n\t\tpublic unowned Gtk.WidgetPath get_path ();\n\t\tpublic GLib.Value get_property (string property, Gtk.StateFlags state);\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic Gtk.StateFlags get_state ();\n\t\tpublic void get_style ();\n\t\tpublic GLib.Value get_style_property (string property_name);\n\t\tpublic void get_style_valist (void* args);\n\t\tpublic void get_valist (Gtk.StateFlags state, void* args);\n\t\tpublic bool has_class (string style_class);\n\t\tpublic bool has_region (string style_region, out Gtk.RegionFlags flags);\n\t\tpublic static unowned Gtk.ThemingEngine load (string name);\n\t\tpublic bool lookup_color (string color_name, out Gdk.RGBA color);\n\t\tpublic static void register_property (string name_space, Gtk.StylePropertyParser? parse_func, GLib.ParamSpec pspec);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_activity (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_arrow (Cairo.Context cr, double angle, double x, double y, double size);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_background (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_check (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_expander (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_extension (Cairo.Context cr, double x, double y, double width, double height, Gtk.PositionType gap_side);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_focus (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_frame (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_frame_gap (Cairo.Context cr, double x, double y, double width, double height, Gtk.PositionType gap_side, double xy0_gap, double xy1_gap);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_handle (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_icon (Cairo.Context cr, Gdk.Pixbuf pixbuf, double x, double y);\n\t\t[NoWrapper]\n\t\tpublic virtual unowned Gdk.Pixbuf render_icon_pixbuf (Gtk.IconSource source, Gtk.IconSize size);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_icon_surface (Cairo.Context cr, Cairo.Surface surface, double x, double y);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_layout (Cairo.Context cr, double x, double y, Pango.Layout layout);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_line (Cairo.Context cr, double x0, double y0, double x1, double y1);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_option (Cairo.Context cr, double x, double y, double width, double height);\n\t\t[NoWrapper]\n\t\tpublic virtual void render_slider (Cairo.Context cr, double x, double y, double width, double height, Gtk.Orientation orientation);\n\t\t[Deprecated (since = \"3.6\")]\n\t\tpublic bool state_is_running (Gtk.StateType state, out double progress);\n\t\t[NoAccessorMethod]\n\t\tpublic string name { owned get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToggleAction : Gtk.Action, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ToggleAction (string name, string? label, string? tooltip, string? stock_id);\n\t\tpublic bool get_active ();\n\t\tpublic bool get_draw_as_radio ();\n\t\tpublic void set_active (bool is_active);\n\t\tpublic void set_draw_as_radio (bool draw_as_radio);\n\t\tpublic bool active { get; set; }\n\t\tpublic bool draw_as_radio { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void toggled ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToggleButton : Gtk.Button, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ToggleButton ();\n\t\tpublic bool get_active ();\n\t\tpublic bool get_inconsistent ();\n\t\tpublic bool get_mode ();\n\t\tpublic void set_active (bool is_active);\n\t\tpublic void set_inconsistent (bool setting);\n\t\tpublic void set_mode (bool draw_indicator);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ToggleButton.with_label (string label);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ToggleButton.with_mnemonic (string label);\n\t\tpublic bool active { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool draw_indicator { get; set; }\n\t\tpublic bool inconsistent { get; set; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void toggled ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToggleButtonAccessible : Gtk.ButtonAccessible, Atk.Component, Atk.Action, Atk.Image {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ToggleButtonAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToggleToolButton : Gtk.ToolButton, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic ToggleToolButton ();\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic ToggleToolButton.from_stock (string stock_id);\n\t\tpublic bool get_active ();\n\t\tpublic void set_active (bool is_active);\n\t\tpublic bool active { get; set; }\n\t\tpublic virtual signal void toggled ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToolButton : Gtk.ToolItem, Atk.Implementor, Gtk.Buildable, Gtk.Activatable, Gtk.Actionable {\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic ToolButton (Gtk.Widget? icon_widget, string? label);\n\t\t[CCode (has_construct_function = false, type = \"GtkToolItem*\")]\n\t\tpublic ToolButton.from_stock (string stock_id);\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic unowned Gtk.Widget get_icon_widget ();\n\t\tpublic unowned string get_label ();\n\t\tpublic unowned Gtk.Widget get_label_widget ();\n\t\tpublic unowned string get_stock_id ();\n\t\tpublic bool get_use_underline ();\n\t\tpublic void set_icon_name (string icon_name);\n\t\tpublic void set_icon_widget (Gtk.Widget icon_widget);\n\t\tpublic void set_label (string label);\n\t\tpublic void set_label_widget (Gtk.Widget label_widget);\n\t\tpublic void set_stock_id (string stock_id);\n\t\tpublic void set_use_underline (bool use_underline);\n\t\tpublic string icon_name { get; set; }\n\t\tpublic Gtk.Widget icon_widget { get; set; }\n\t\tpublic string label { get; set; }\n\t\tpublic Gtk.Widget label_widget { get; set; }\n\t\tpublic string stock_id { get; set; }\n\t\tpublic bool use_underline { get; set; }\n\t\tpublic virtual signal void clicked ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToolItem : Gtk.Bin, Atk.Implementor, Gtk.Buildable, Gtk.Activatable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ToolItem ();\n\t\tpublic Pango.EllipsizeMode get_ellipsize_mode ();\n\t\tpublic bool get_expand ();\n\t\tpublic bool get_homogeneous ();\n\t\tpublic Gtk.IconSize get_icon_size ();\n\t\tpublic bool get_is_important ();\n\t\tpublic Gtk.Orientation get_orientation ();\n\t\tpublic unowned Gtk.Widget get_proxy_menu_item (string menu_item_id);\n\t\tpublic Gtk.ReliefStyle get_relief_style ();\n\t\tpublic float get_text_alignment ();\n\t\tpublic Gtk.Orientation get_text_orientation ();\n\t\tpublic unowned Gtk.SizeGroup get_text_size_group ();\n\t\tpublic Gtk.ToolbarStyle get_toolbar_style ();\n\t\tpublic bool get_use_drag_window ();\n\t\tpublic bool get_visible_horizontal ();\n\t\tpublic bool get_visible_vertical ();\n\t\tpublic void rebuild_menu ();\n\t\tpublic unowned Gtk.Widget retrieve_proxy_menu_item ();\n\t\tpublic void set_expand (bool expand);\n\t\tpublic void set_homogeneous (bool homogeneous);\n\t\tpublic void set_is_important (bool is_important);\n\t\tpublic void set_proxy_menu_item (string menu_item_id, Gtk.Widget menu_item);\n\t\tpublic void set_tooltip_markup (string markup);\n\t\tpublic void set_tooltip_text (string text);\n\t\tpublic void set_use_drag_window (bool use_drag_window);\n\t\tpublic void set_visible_horizontal (bool visible_horizontal);\n\t\tpublic void set_visible_vertical (bool visible_vertical);\n\t\tpublic bool is_important { get; set; }\n\t\tpublic bool visible_horizontal { get; set; }\n\t\tpublic bool visible_vertical { get; set; }\n\t\tpublic virtual signal bool create_menu_proxy ();\n\t\tpublic virtual signal void toolbar_reconfigured ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToolItemGroup : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.ToolShell {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ToolItemGroup (string label);\n\t\tpublic bool get_collapsed ();\n\t\tpublic unowned Gtk.ToolItem get_drop_item (int x, int y);\n\t\tpublic Pango.EllipsizeMode get_ellipsize ();\n\t\tpublic Gtk.ReliefStyle get_header_relief ();\n\t\tpublic int get_item_position (Gtk.ToolItem item);\n\t\tpublic unowned string get_label ();\n\t\tpublic unowned Gtk.Widget get_label_widget ();\n\t\tpublic uint get_n_items ();\n\t\tpublic unowned Gtk.ToolItem get_nth_item (uint index);\n\t\tpublic void insert (Gtk.ToolItem item, int position);\n\t\tpublic void set_collapsed (bool collapsed);\n\t\tpublic void set_ellipsize (Pango.EllipsizeMode ellipsize);\n\t\tpublic void set_header_relief (Gtk.ReliefStyle style);\n\t\tpublic void set_item_position (Gtk.ToolItem item, int position);\n\t\tpublic void set_label (string label);\n\t\tpublic void set_label_widget (Gtk.Widget label_widget);\n\t\tpublic bool collapsed { get; set; }\n\t\tpublic Pango.EllipsizeMode ellipsize { get; set; }\n\t\tpublic Gtk.ReliefStyle header_relief { get; set; }\n\t\tpublic string label { get; set; }\n\t\tpublic Gtk.Widget label_widget { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToolPalette : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic ToolPalette ();\n\t\tpublic void add_drag_dest (Gtk.Widget widget, Gtk.DestDefaults flags, Gtk.ToolPaletteDragTargets targets, Gdk.DragAction actions);\n\t\tpublic unowned Gtk.Widget get_drag_item (Gtk.SelectionData selection);\n\t\tpublic static Gtk.TargetEntry get_drag_target_group ();\n\t\tpublic static Gtk.TargetEntry get_drag_target_item ();\n\t\tpublic unowned Gtk.ToolItemGroup get_drop_group (int x, int y);\n\t\tpublic unowned Gtk.ToolItem get_drop_item (int x, int y);\n\t\tpublic bool get_exclusive (Gtk.ToolItemGroup group);\n\t\tpublic bool get_expand (Gtk.ToolItemGroup group);\n\t\tpublic int get_group_position (Gtk.ToolItemGroup group);\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic Gtk.IconSize get_icon_size ();\n\t\tpublic Gtk.ToolbarStyle get_style ();\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic void set_drag_source (Gtk.ToolPaletteDragTargets targets);\n\t\tpublic void set_exclusive (Gtk.ToolItemGroup group, bool exclusive);\n\t\tpublic void set_expand (Gtk.ToolItemGroup group, bool expand);\n\t\tpublic void set_group_position (Gtk.ToolItemGroup group, int position);\n\t\tpublic void set_icon_size (Gtk.IconSize icon_size);\n\t\tpublic void set_style (Gtk.ToolbarStyle style);\n\t\tpublic void unset_icon_size ();\n\t\tpublic void unset_style ();\n\t\tpublic Gtk.IconSize icon_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool icon_size_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ToolbarStyle toolbar_style { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Toolbar : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.ToolShell, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Toolbar ();\n\t\tpublic int get_drop_index (int x, int y);\n\t\tpublic int get_item_index (Gtk.ToolItem item);\n\t\tpublic int get_n_items ();\n\t\tpublic unowned Gtk.ToolItem get_nth_item (int n);\n\t\tpublic bool get_show_arrow ();\n\t\tpublic void insert (Gtk.ToolItem item, int pos);\n\t\tpublic void set_drop_highlight_item (Gtk.ToolItem tool_item, int index_);\n\t\tpublic void set_icon_size (Gtk.IconSize icon_size);\n\t\tpublic void set_show_arrow (bool show_arrow);\n\t\tpublic void set_style (Gtk.ToolbarStyle style);\n\t\tpublic void unset_icon_size ();\n\t\tpublic void unset_style ();\n\t\tpublic int icon_size { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool icon_size_set { get; set; }\n\t\tpublic bool show_arrow { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.ToolbarStyle toolbar_style { get; set; }\n\t\tpublic virtual signal bool focus_home_or_end (bool p0);\n\t\tpublic virtual signal void orientation_changed (Gtk.Orientation orientation);\n\t\tpublic virtual signal bool popup_context_menu (int x, int y, int button_number);\n\t\tpublic virtual signal void style_changed (Gtk.ToolbarStyle style);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Tooltip : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Tooltip ();\n\t\tpublic void set_custom (Gtk.Widget custom_widget);\n\t\tpublic void set_icon (Gdk.Pixbuf pixbuf);\n\t\tpublic void set_icon_from_gicon (GLib.Icon gicon, Gtk.IconSize size);\n\t\tpublic void set_icon_from_icon_name (string icon_name, Gtk.IconSize size);\n\t\tpublic void set_icon_from_stock (string stock_id, Gtk.IconSize size);\n\t\tpublic void set_markup (string markup);\n\t\tpublic void set_text (string text);\n\t\tpublic void set_tip_area (Gdk.Rectangle rect);\n\t\tpublic static void trigger_tooltip_query (Gdk.Display display);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class ToplevelAccessible : Atk.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ToplevelAccessible ();\n\t\tpublic unowned GLib.List get_children ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeModelFilter : GLib.Object, Gtk.TreeModel, Gtk.TreeDragSource {\n\t\t[CCode (has_construct_function = false, type = \"GtkTreeModel*\")]\n\t\tpublic TreeModelFilter (Gtk.TreeModel child_model, Gtk.TreePath? root);\n\t\tpublic void clear_cache ();\n\t\tpublic bool convert_child_iter_to_iter (out Gtk.TreeIter filter_iter, Gtk.TreeIter child_iter);\n\t\tpublic unowned Gtk.TreePath convert_child_path_to_path (Gtk.TreePath child_path);\n\t\tpublic void convert_iter_to_child_iter (out Gtk.TreeIter child_iter, Gtk.TreeIter filter_iter);\n\t\tpublic unowned Gtk.TreePath convert_path_to_child_path (Gtk.TreePath filter_path);\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\t[NoWrapper]\n\t\tpublic virtual void modify (Gtk.TreeModel child_model, Gtk.TreeIter iter, GLib.Value value, int column);\n\t\tpublic void refilter ();\n\t\tpublic void set_modify_func ([CCode (array_length_pos = 0.9)] GLib.Type[] types, owned Gtk.TreeModelFilterModifyFunc func);\n\t\tpublic void set_visible_column (int column);\n\t\tpublic void set_visible_func (owned Gtk.TreeModelFilterVisibleFunc func);\n\t\t[NoWrapper]\n\t\tpublic virtual bool visible (Gtk.TreeModel child_model, Gtk.TreeIter iter);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TreeModel child_model { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TreePath virtual_root { owned get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeModelSort : GLib.Object, Gtk.TreeModel, Gtk.TreeSortable, Gtk.TreeDragSource {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected TreeModelSort ();\n\t\tpublic void clear_cache ();\n\t\tpublic bool convert_child_iter_to_iter (out Gtk.TreeIter sort_iter, Gtk.TreeIter child_iter);\n\t\tpublic unowned Gtk.TreePath convert_child_path_to_path (Gtk.TreePath child_path);\n\t\tpublic void convert_iter_to_child_iter (out Gtk.TreeIter child_iter, Gtk.TreeIter sorted_iter);\n\t\tpublic unowned Gtk.TreePath convert_path_to_child_path (Gtk.TreePath sorted_path);\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic bool iter_is_valid (Gtk.TreeIter iter);\n\t\tpublic void reset_default_sort_func ();\n\t\t[CCode (has_construct_function = false, type = \"GtkTreeModel*\")]\n\t\tpublic TreeModelSort.with_model (Gtk.TreeModel child_model);\n\t\tpublic Gtk.TreeModel model { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", const_cname = \"GtkTreePath\", copy_function = \"gtk_tree_path_copy\", type_id = \"gtk_tree_path_get_type ()\")]\n\t[Compact]\n\t[Immutable]\n\tpublic class TreePath {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreePath ();\n\t\tpublic void append_index (int index_);\n\t\tpublic int compare (Gtk.TreePath b);\n\t\tpublic Gtk.TreePath copy ();\n\t\tpublic void down ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreePath.first ();\n\t\t[CCode (has_construct_function = false, sentinel = \"-1\")]\n\t\tpublic TreePath.from_indices (...);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreePath.from_string (string path);\n\t\tpublic int get_depth ();\n\t\t[CCode (cname = \"gtk_tree_path_get_indices_with_depth\")]\n\t\tpublic unowned int[] get_indices ();\n\t\tpublic bool is_ancestor (Gtk.TreePath descendant);\n\t\tpublic bool is_descendant (Gtk.TreePath ancestor);\n\t\tpublic void next ();\n\t\tpublic void prepend_index (int index_);\n\t\tpublic bool prev ();\n\t\tpublic string to_string ();\n\t\tpublic bool up ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", copy_function = \"gtk_tree_row_reference_copy\", type_id = \"gtk_tree_row_reference_get_type ()\")]\n\t[Compact]\n\t[Immutable]\n\tpublic class TreeRowReference {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreeRowReference (Gtk.TreeModel model, Gtk.TreePath path);\n\t\tpublic Gtk.TreeRowReference copy ();\n\t\tpublic static void deleted (GLib.Object proxy, Gtk.TreePath path);\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic Gtk.TreePath get_path ();\n\t\tpublic static void inserted (GLib.Object proxy, Gtk.TreePath path);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreeRowReference.proxy (GLib.Object proxy, Gtk.TreeModel model, Gtk.TreePath path);\n\t\tpublic static void reordered (GLib.Object proxy, Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order);\n\t\tpublic bool valid ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeSelection : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected TreeSelection ();\n\t\tpublic int count_selected_rows ();\n\t\tpublic Gtk.SelectionMode get_mode ();\n\t\tpublic unowned Gtk.TreeSelectionFunc get_select_function ();\n\t\tpublic bool get_selected (out unowned Gtk.TreeModel model, out Gtk.TreeIter iter);\n\t\tpublic GLib.List<Gtk.TreePath> get_selected_rows (out unowned Gtk.TreeModel model);\n\t\tpublic unowned Gtk.TreeView get_tree_view ();\n\t\tpublic void* get_user_data ();\n\t\tpublic bool iter_is_selected (Gtk.TreeIter iter);\n\t\tpublic bool path_is_selected (Gtk.TreePath path);\n\t\tpublic void select_all ();\n\t\tpublic void select_iter (Gtk.TreeIter iter);\n\t\tpublic void select_path (Gtk.TreePath path);\n\t\tpublic void select_range (Gtk.TreePath start_path, Gtk.TreePath end_path);\n\t\tpublic void selected_foreach (Gtk.TreeSelectionForeachFunc func);\n\t\tpublic void set_mode (Gtk.SelectionMode type);\n\t\tpublic void set_select_function (owned Gtk.TreeSelectionFunc func);\n\t\tpublic void unselect_all ();\n\t\tpublic void unselect_iter (Gtk.TreeIter iter);\n\t\tpublic void unselect_path (Gtk.TreePath path);\n\t\tpublic void unselect_range (Gtk.TreePath start_path, Gtk.TreePath end_path);\n\t\tpublic Gtk.SelectionMode mode { get; set; }\n\t\tpublic virtual signal void changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeStore : GLib.Object, Gtk.TreeModel, Gtk.TreeDragSource, Gtk.TreeDragDest, Gtk.TreeSortable, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, sentinel = \"\")]\n\t\tpublic TreeStore (int n_columns, ...);\n\t\tpublic void append (out Gtk.TreeIter iter, Gtk.TreeIter? parent);\n\t\tpublic void clear ();\n\t\tpublic void insert (out Gtk.TreeIter iter, Gtk.TreeIter? parent, int position);\n\t\tpublic void insert_after (out Gtk.TreeIter iter, Gtk.TreeIter? parent, Gtk.TreeIter? sibling);\n\t\tpublic void insert_before (out Gtk.TreeIter iter, Gtk.TreeIter? parent, Gtk.TreeIter? sibling);\n\t\t[CCode (sentinel = \"-1\")]\n\t\tpublic void insert_with_values (out Gtk.TreeIter iter, Gtk.TreeIter? parent, int position, ...);\n\t\tpublic void insert_with_valuesv (out Gtk.TreeIter iter, Gtk.TreeIter? parent, int position, int columns, GLib.Value[] values);\n\t\tpublic bool is_ancestor (Gtk.TreeIter iter, Gtk.TreeIter descendant);\n\t\tpublic int iter_depth (Gtk.TreeIter iter);\n\t\tpublic bool iter_is_valid (Gtk.TreeIter iter);\n\t\tpublic void move_after (ref Gtk.TreeIter iter, Gtk.TreeIter? position);\n\t\tpublic void move_before (ref Gtk.TreeIter iter, Gtk.TreeIter? position);\n\t\t[CCode (cname = \"gtk_tree_store_newv\", has_construct_function = false)]\n\t\tpublic TreeStore.newv ([CCode (array_length_pos = 0.9)] GLib.Type[] types);\n\t\tpublic void prepend (out Gtk.TreeIter iter, Gtk.TreeIter? parent);\n\t\tpublic bool remove (ref Gtk.TreeIter iter);\n\t\tpublic void reorder (Gtk.TreeIter? parent, int new_order);\n\t\t[CCode (sentinel = \"-1\")]\n\t\tpublic void @set (Gtk.TreeIter iter, ...);\n\t\tpublic void set_column_types ([CCode (array_length_pos = 0.9)] GLib.Type[] types);\n\t\tpublic void set_valist (Gtk.TreeIter iter, void* var_args);\n\t\tpublic void set_value (Gtk.TreeIter iter, int column, GLib.Value value);\n\t\tpublic void set_valuesv (Gtk.TreeIter iter, int columns, GLib.Value[] values);\n\t\tpublic void swap (Gtk.TreeIter a, Gtk.TreeIter b);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeView : Gtk.Container, Atk.Implementor, Gtk.Buildable, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic TreeView ();\n\t\tpublic int append_column (Gtk.TreeViewColumn column);\n\t\tpublic void collapse_all ();\n\t\tpublic bool collapse_row (Gtk.TreePath path);\n\t\tpublic void columns_autosize ();\n\t\tpublic void convert_bin_window_to_tree_coords (int bx, int by, out int tx, out int ty);\n\t\tpublic void convert_bin_window_to_widget_coords (int bx, int by, out int wx, out int wy);\n\t\tpublic void convert_tree_to_bin_window_coords (int tx, int ty, out int bx, out int by);\n\t\tpublic void convert_tree_to_widget_coords (int tx, int ty, out int wx, out int wy);\n\t\tpublic void convert_widget_to_bin_window_coords (int wx, int wy, out int bx, out int by);\n\t\tpublic void convert_widget_to_tree_coords (int wx, int wy, out int tx, out int ty);\n\t\tpublic unowned Cairo.Surface create_row_drag_icon (Gtk.TreePath path);\n\t\tpublic void enable_model_drag_dest (Gtk.TargetEntry[] targets, Gdk.DragAction actions);\n\t\tpublic void enable_model_drag_source (Gdk.ModifierType start_button_mask, Gtk.TargetEntry[] targets, Gdk.DragAction actions);\n\t\tpublic void expand_all ();\n\t\tpublic bool expand_row (Gtk.TreePath path, bool open_all);\n\t\tpublic void expand_to_path (Gtk.TreePath path);\n\t\tpublic bool get_activate_on_single_click ();\n\t\tpublic void get_background_area (Gtk.TreePath? path, Gtk.TreeViewColumn? column, out Gdk.Rectangle rect);\n\t\tpublic unowned Gdk.Window get_bin_window ();\n\t\tpublic void get_cell_area (Gtk.TreePath? path, Gtk.TreeViewColumn? column, out Gdk.Rectangle rect);\n\t\tpublic unowned Gtk.TreeViewColumn get_column (int n);\n\t\tpublic GLib.List<weak Gtk.TreeViewColumn> get_columns ();\n\t\tpublic void get_cursor (out Gtk.TreePath? path, out unowned Gtk.TreeViewColumn? focus_column);\n\t\tpublic bool get_dest_row_at_pos (int drag_x, int drag_y, out Gtk.TreePath? path, out Gtk.TreeViewDropPosition pos);\n\t\tpublic void get_drag_dest_row (out Gtk.TreePath? path, out Gtk.TreeViewDropPosition pos);\n\t\tpublic bool get_enable_search ();\n\t\tpublic bool get_enable_tree_lines ();\n\t\tpublic unowned Gtk.TreeViewColumn get_expander_column ();\n\t\tpublic bool get_fixed_height_mode ();\n\t\tpublic Gtk.TreeViewGridLines get_grid_lines ();\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic bool get_headers_clickable ();\n\t\tpublic bool get_headers_visible ();\n\t\tpublic bool get_hover_expand ();\n\t\tpublic bool get_hover_selection ();\n\t\tpublic int get_level_indentation ();\n\t\tpublic unowned Gtk.TreeModel get_model ();\n\t\tpublic uint get_n_columns ();\n\t\tpublic bool get_path_at_pos (int x, int y, out Gtk.TreePath? path, out unowned Gtk.TreeViewColumn? column, out int cell_x, out int cell_y);\n\t\tpublic bool get_reorderable ();\n\t\tpublic unowned Gtk.TreeViewRowSeparatorFunc get_row_separator_func ();\n\t\tpublic bool get_rubber_banding ();\n\t\tpublic bool get_rules_hint ();\n\t\tpublic int get_search_column ();\n\t\tpublic unowned Gtk.Entry get_search_entry ();\n\t\tpublic unowned Gtk.TreeViewSearchEqualFunc get_search_equal_func ();\n\t\tpublic unowned Gtk.TreeViewSearchPositionFunc get_search_position_func ();\n\t\tpublic unowned Gtk.TreeSelection get_selection ();\n\t\tpublic bool get_show_expanders ();\n\t\tpublic int get_tooltip_column ();\n\t\tpublic bool get_tooltip_context (ref int x, ref int y, bool keyboard_tip, out unowned Gtk.TreeModel model, out unowned Gtk.TreePath path, out Gtk.TreeIter iter);\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic bool get_visible_range (out Gtk.TreePath start_path, out Gtk.TreePath end_path);\n\t\tpublic void get_visible_rect (out Gdk.Rectangle visible_rect);\n\t\tpublic int insert_column (Gtk.TreeViewColumn column, int position);\n\t\tpublic int insert_column_with_attributes (int position, string? title, Gtk.CellRenderer cell, ...);\n\t\tpublic int insert_column_with_data_func (int position, string title, Gtk.CellRenderer cell, owned Gtk.TreeCellDataFunc func);\n\t\tpublic bool is_blank_at_pos (int x, int y, out unowned Gtk.TreePath path, out unowned Gtk.TreeViewColumn column, int cell_x, int cell_y);\n\t\t[CCode (cname = \"gtk_tree_view_row_expanded\")]\n\t\tpublic bool is_row_expanded (Gtk.TreePath path);\n\t\tpublic bool is_rubber_banding_active ();\n\t\tpublic void map_expanded_rows (Gtk.TreeViewMappingFunc func, void* data);\n\t\tpublic void move_column_after (Gtk.TreeViewColumn column, Gtk.TreeViewColumn base_column);\n\t\tpublic int remove_column (Gtk.TreeViewColumn column);\n\t\tpublic void scroll_to_cell (Gtk.TreePath? path, Gtk.TreeViewColumn? column, bool use_align, float row_align, float col_align);\n\t\tpublic void scroll_to_point (int tree_x, int tree_y);\n\t\tpublic void set_activate_on_single_click (bool single);\n\t\tpublic void set_column_drag_function (owned Gtk.TreeViewColumnDropFunc func);\n\t\tpublic void set_cursor (Gtk.TreePath path, Gtk.TreeViewColumn? focus_column, bool start_editing);\n\t\tpublic void set_cursor_on_cell (Gtk.TreePath path, Gtk.TreeViewColumn focus_column, Gtk.CellRenderer focus_cell, bool start_editing);\n\t\tpublic void set_destroy_count_func (owned Gtk.TreeDestroyCountFunc func);\n\t\tpublic void set_drag_dest_row (Gtk.TreePath? path, Gtk.TreeViewDropPosition pos);\n\t\tpublic void set_enable_search (bool enable_search);\n\t\tpublic void set_enable_tree_lines (bool enabled);\n\t\tpublic void set_expander_column (Gtk.TreeViewColumn column);\n\t\tpublic void set_fixed_height_mode (bool enable);\n\t\tpublic void set_grid_lines (Gtk.TreeViewGridLines grid_lines);\n\t\tpublic void set_hadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_headers_clickable (bool setting);\n\t\tpublic void set_headers_visible (bool headers_visible);\n\t\tpublic void set_hover_expand (bool expand);\n\t\tpublic void set_hover_selection (bool hover);\n\t\tpublic void set_level_indentation (int indentation);\n\t\tpublic void set_model (Gtk.TreeModel? model);\n\t\tpublic void set_reorderable (bool reorderable);\n\t\tpublic void set_row_separator_func (owned Gtk.TreeViewRowSeparatorFunc func);\n\t\tpublic void set_rubber_banding (bool enable);\n\t\tpublic void set_rules_hint (bool setting);\n\t\tpublic void set_search_column (int column);\n\t\tpublic void set_search_entry (Gtk.Entry? entry);\n\t\tpublic void set_search_equal_func (owned Gtk.TreeViewSearchEqualFunc search_equal_func);\n\t\tpublic void set_search_position_func (owned Gtk.TreeViewSearchPositionFunc func);\n\t\tpublic void set_show_expanders (bool enabled);\n\t\tpublic void set_tooltip_cell (Gtk.Tooltip tooltip, Gtk.TreePath path, Gtk.TreeViewColumn column, Gtk.CellRenderer cell);\n\t\tpublic void set_tooltip_column (int column);\n\t\tpublic void set_tooltip_row (Gtk.Tooltip tooltip, Gtk.TreePath path);\n\t\tpublic void set_vadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void unset_rows_drag_dest ();\n\t\tpublic void unset_rows_drag_source ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic TreeView.with_model (Gtk.TreeModel model);\n\t\tpublic bool activate_on_single_click { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TreeViewGridLines enable_grid_lines { get; set; }\n\t\tpublic bool enable_search { get; set; }\n\t\tpublic bool enable_tree_lines { get; set; }\n\t\tpublic Gtk.TreeViewColumn expander_column { get; set; }\n\t\tpublic bool fixed_height_mode { get; set; }\n\t\tpublic bool headers_clickable { get; set; }\n\t\tpublic bool headers_visible { get; set; }\n\t\tpublic bool hover_expand { get; set; }\n\t\tpublic bool hover_selection { get; set; }\n\t\tpublic int level_indentation { get; set; }\n\t\tpublic Gtk.TreeModel model { get; set; }\n\t\tpublic bool reorderable { get; set; }\n\t\tpublic bool rubber_banding { get; set; }\n\t\tpublic bool rules_hint { get; set; }\n\t\tpublic int search_column { get; set; }\n\t\tpublic bool show_expanders { get; set; }\n\t\tpublic int tooltip_column { get; set; }\n\t\tpublic virtual signal void columns_changed ();\n\t\tpublic virtual signal void cursor_changed ();\n\t\tpublic virtual signal bool expand_collapse_cursor_row (bool logical, bool expand, bool open_all);\n\t\tpublic virtual signal bool move_cursor (Gtk.MovementStep step, int count);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void row_activated (Gtk.TreePath path, Gtk.TreeViewColumn column);\n\t\tpublic virtual signal void row_collapsed (Gtk.TreeIter iter, Gtk.TreePath path);\n\t\tpublic virtual signal void row_expanded (Gtk.TreeIter iter, Gtk.TreePath path);\n\t\tpublic virtual signal bool select_all ();\n\t\tpublic virtual signal bool select_cursor_parent ();\n\t\tpublic virtual signal bool select_cursor_row (bool start_editing);\n\t\tpublic virtual signal bool start_interactive_search ();\n\t\tpublic virtual signal bool test_collapse_row (Gtk.TreeIter iter, Gtk.TreePath path);\n\t\tpublic virtual signal bool test_expand_row (Gtk.TreeIter iter, Gtk.TreePath path);\n\t\tpublic virtual signal bool toggle_cursor_row ();\n\t\tpublic virtual signal bool unselect_all ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeViewAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Table, Atk.Selection, Gtk.CellAccessibleParent {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected TreeViewAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class TreeViewColumn : GLib.InitiallyUnowned, Gtk.CellLayout, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreeViewColumn ();\n\t\tpublic bool cell_get_position (Gtk.CellRenderer cell_renderer, out int x_offset, out int width);\n\t\tpublic void cell_get_size (out Gdk.Rectangle cell_area, out int x_offset, out int y_offset, out int width, out int height);\n\t\tpublic bool cell_is_visible ();\n\t\tpublic void cell_set_cell_data (Gtk.TreeModel tree_model, Gtk.TreeIter iter, bool is_expander, bool is_expanded);\n\t\tpublic void focus_cell (Gtk.CellRenderer cell);\n\t\tpublic float get_alignment ();\n\t\tpublic unowned Gtk.Widget get_button ();\n\t\tpublic bool get_clickable ();\n\t\tpublic bool get_expand ();\n\t\tpublic int get_fixed_width ();\n\t\tpublic int get_max_width ();\n\t\tpublic int get_min_width ();\n\t\tpublic bool get_reorderable ();\n\t\tpublic bool get_resizable ();\n\t\tpublic Gtk.TreeViewColumnSizing get_sizing ();\n\t\tpublic int get_sort_column_id ();\n\t\tpublic bool get_sort_indicator ();\n\t\tpublic Gtk.SortType get_sort_order ();\n\t\tpublic int get_spacing ();\n\t\tpublic unowned string get_title ();\n\t\tpublic unowned Gtk.Widget get_tree_view ();\n\t\tpublic bool get_visible ();\n\t\tpublic unowned Gtk.Widget get_widget ();\n\t\tpublic int get_width ();\n\t\tpublic int get_x_offset ();\n\t\tpublic void queue_resize ();\n\t\tpublic void set_alignment (float xalign);\n\t\tpublic void set_attributes (Gtk.CellRenderer cell_renderer, ...);\n\t\tpublic void set_clickable (bool clickable);\n\t\tpublic void set_expand (bool expand);\n\t\tpublic void set_fixed_width (int fixed_width);\n\t\tpublic void set_max_width (int max_width);\n\t\tpublic void set_min_width (int min_width);\n\t\tpublic void set_reorderable (bool reorderable);\n\t\tpublic void set_resizable (bool resizable);\n\t\tpublic void set_sizing (Gtk.TreeViewColumnSizing type);\n\t\tpublic void set_sort_column_id (int sort_column_id);\n\t\tpublic void set_sort_indicator (bool setting);\n\t\tpublic void set_sort_order (Gtk.SortType order);\n\t\tpublic void set_spacing (int spacing);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_visible (bool visible);\n\t\tpublic void set_widget (Gtk.Widget widget);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreeViewColumn.with_area (Gtk.CellArea area);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TreeViewColumn.with_attributes (string? title, Gtk.CellRenderer cell, ...);\n\t\tpublic float alignment { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.CellArea cell_area { owned get; construct; }\n\t\tpublic bool clickable { get; set; }\n\t\tpublic bool expand { get; set; }\n\t\tpublic int fixed_width { get; set; }\n\t\tpublic int max_width { get; set; }\n\t\tpublic int min_width { get; set; }\n\t\tpublic bool reorderable { get; set; }\n\t\tpublic bool resizable { get; set; }\n\t\tpublic Gtk.TreeViewColumnSizing sizing { get; set; }\n\t\tpublic int sort_column_id { get; set; }\n\t\tpublic bool sort_indicator { get; set; }\n\t\tpublic Gtk.SortType sort_order { get; set; }\n\t\tpublic int spacing { get; set; }\n\t\tpublic string title { get; set; }\n\t\tpublic bool visible { get; set; }\n\t\tpublic Gtk.Widget widget { get; set; }\n\t\tpublic int width { get; }\n\t\tpublic int x_offset { get; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void clicked ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class UIManager : GLib.Object, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic UIManager ();\n\t\tpublic void add_ui (uint merge_id, string path, string name, string? action, Gtk.UIManagerItemType type, bool top);\n\t\tpublic uint add_ui_from_file (string filename) throws GLib.Error;\n\t\tpublic uint add_ui_from_resource (string resource_path) throws GLib.Error;\n\t\tpublic uint add_ui_from_string (string buffer, ssize_t length) throws GLib.Error;\n\t\tpublic void ensure_update ();\n\t\tpublic unowned Gtk.AccelGroup get_accel_group ();\n\t\tpublic virtual unowned Gtk.Action get_action (string path);\n\t\tpublic unowned GLib.List<Gtk.ActionGroup> get_action_groups ();\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic bool get_add_tearoffs ();\n\t\tpublic GLib.SList<weak Gtk.Widget> get_toplevels (Gtk.UIManagerItemType types);\n\t\tpublic unowned string get_ui ();\n\t\tpublic virtual unowned Gtk.Widget get_widget (string path);\n\t\tpublic void insert_action_group (Gtk.ActionGroup action_group, int pos);\n\t\tpublic uint new_merge_id ();\n\t\tpublic void remove_action_group (Gtk.ActionGroup action_group);\n\t\tpublic void remove_ui (uint merge_id);\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic void set_add_tearoffs (bool add_tearoffs);\n\t\t[Deprecated (since = \"3.4\")]\n\t\tpublic bool add_tearoffs { get; set; }\n\t\tpublic string ui { get; }\n\t\tpublic virtual signal void actions_changed ();\n\t\tpublic virtual signal void add_widget (Gtk.Widget widget);\n\t\tpublic virtual signal void connect_proxy (Gtk.Action action, Gtk.Widget proxy);\n\t\tpublic virtual signal void disconnect_proxy (Gtk.Action action, Gtk.Widget proxy);\n\t\tpublic virtual signal void post_activate (Gtk.Action action);\n\t\tpublic virtual signal void pre_activate (Gtk.Action action);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Box\", since = \"3.2\")]\n\tpublic class VBox : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VBox (bool homogeneous, int spacing);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class VButtonBox : Gtk.ButtonBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VButtonBox ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Paned\", since = \"3.2\")]\n\tpublic class VPaned : Gtk.Paned, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VPaned ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Scale\", since = \"3.2\")]\n\tpublic class VScale : Gtk.Scale, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VScale (Gtk.Adjustment? adjustment);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VScale.with_range (double min, double max, double step);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Scrollbar\", since = \"3.2\")]\n\tpublic class VScrollbar : Gtk.Scrollbar, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VScrollbar (Gtk.Adjustment? adjustment);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class VSeparator : Gtk.Separator, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VSeparator ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Viewport : Gtk.Bin, Atk.Implementor, Gtk.Buildable, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Viewport (Gtk.Adjustment? hadjustment, Gtk.Adjustment? vadjustment);\n\t\tpublic unowned Gdk.Window get_bin_window ();\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic Gtk.ShadowType get_shadow_type ();\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic unowned Gdk.Window get_view_window ();\n\t\tpublic void set_hadjustment (Gtk.Adjustment adjustment);\n\t\tpublic void set_shadow_type (Gtk.ShadowType type);\n\t\tpublic void set_vadjustment (Gtk.Adjustment adjustment);\n\t\tpublic Gtk.ShadowType shadow_type { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class VolumeButton : Gtk.ScaleButton, Atk.Implementor, Gtk.Buildable, Gtk.Actionable, Gtk.Activatable, Gtk.Orientable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic VolumeButton ();\n\t\t[NoAccessorMethod]\n\t\tpublic bool use_symbolic { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Widget : GLib.InitiallyUnowned, Atk.Implementor, Gtk.Buildable {\n\t\tpublic class uint activate_signal;\n\t\t[CCode (construct_function = \"gtk_widget_new\", has_new_function = false)]\n\t\tpublic Widget (...);\n\t\tpublic bool activate ();\n\t\tpublic void add_accelerator (string accel_signal, Gtk.AccelGroup accel_group, uint accel_key, Gdk.ModifierType accel_mods, Gtk.AccelFlags accel_flags);\n\t\tpublic void add_device_events (Gdk.Device device, Gdk.EventMask events);\n\t\tpublic void add_events (int events);\n\t\tpublic void add_mnemonic_label (Gtk.Widget label);\n\t\tpublic uint add_tick_callback (owned Gtk.TickCallback callback);\n\t\t[NoWrapper]\n\t\tpublic virtual void adjust_baseline_allocation (int baseline);\n\t\t[NoWrapper]\n\t\tpublic virtual void adjust_baseline_request (int minimum_baseline, int natural_baseline);\n\t\t[NoWrapper]\n\t\tpublic virtual void adjust_size_allocation (Gtk.Orientation orientation, ref int minimum_size, ref int natural_size, ref int allocated_pos, ref int allocated_size);\n\t\t[NoWrapper]\n\t\tpublic virtual void adjust_size_request (Gtk.Orientation orientation, ref int minimum_size, ref int natural_size);\n\t\t[CCode (cname = \"gtk_widget_class_bind_template_callback_full\")]\n\t\tpublic class void bind_template_callback_full (string callback_name, GLib.Callback callback_symbol);\n\t\t[CCode (cname = \"gtk_widget_class_bind_template_child_full\")]\n\t\tpublic class void bind_template_child_full (string name, bool internal_child, ssize_t struct_offset);\n\t\tpublic bool child_focus (Gtk.DirectionType direction);\n\t\t[Deprecated (replacement = \"get_path\", since = \"3.0\")]\n\t\tpublic void class_path (out uint path_length, out unowned string path, out unowned string path_reversed);\n\t\tpublic virtual bool compute_expand (Gtk.Orientation orientation);\n\t\t[CCode (vfunc_name = \"compute_expand\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void compute_expand_internal (out bool hexpand, out bool vexpand);\n\t\tpublic Pango.Context create_pango_context ();\n\t\tpublic Pango.Layout create_pango_layout (string? text);\n\t\tpublic void destroyed (out unowned Gtk.Widget widget_pointer);\n\t\tpublic bool device_is_shadowed (Gdk.Device device);\n\t\t[NoWrapper]\n\t\tpublic virtual void dispatch_child_properties_changed (uint n_pspecs, out unowned GLib.ParamSpec pspecs);\n\t\tpublic void ensure_style ();\n\t\tpublic void error_bell ();\n\t\t[CCode (cname = \"gtk_widget_class_find_style_property\")]\n\t\tpublic class unowned GLib.ParamSpec find_style_property (string property_name);\n\t\tpublic void freeze_child_notify ();\n\t\tpublic virtual unowned Atk.Object get_accessible ();\n\t\tpublic int get_allocated_baseline ();\n\t\tpublic int get_allocated_height ();\n\t\tpublic int get_allocated_width ();\n\t\tpublic void get_allocation (out Gtk.Allocation allocation);\n\t\tpublic unowned Gtk.Widget get_ancestor (GLib.Type widget_type);\n\t\tpublic bool get_app_paintable ();\n\t\tpublic bool get_can_default ();\n\t\tpublic bool get_can_focus ();\n\t\t[Deprecated (replacement = \"get_preferred_size\", since = \"3.0\")]\n\t\tpublic void get_child_requisition (out Gtk.Requisition requisition);\n\t\tpublic bool get_child_visible ();\n\t\tpublic unowned Gtk.Clipboard get_clipboard (Gdk.Atom selection);\n\t\tpublic unowned string get_composite_name ();\n\t\tpublic static Gtk.TextDirection get_default_direction ();\n\t\t[Deprecated (replacement = \"StyleContext, and CssProvider.get_default() to obtain a Gtk.StyleProvider with the default widget style information\", since = \"3.0\")]\n\t\tpublic static unowned Gtk.Style get_default_style ();\n\t\tpublic bool get_device_enabled (Gdk.Device device);\n\t\tpublic Gdk.EventMask get_device_events (Gdk.Device device);\n\t\tpublic Gtk.TextDirection get_direction ();\n\t\tpublic unowned Gdk.Display get_display ();\n\t\tpublic bool get_double_buffered ();\n\t\tpublic int get_events ();\n\t\tpublic unowned Gdk.FrameClock get_frame_clock ();\n\t\tpublic Gtk.Align get_halign ();\n\t\tpublic bool get_has_tooltip ();\n\t\tpublic bool get_has_window ();\n\t\tpublic bool get_hexpand ();\n\t\tpublic bool get_hexpand_set ();\n\t\tpublic bool get_mapped ();\n\t\tpublic int get_margin_bottom ();\n\t\tpublic int get_margin_left ();\n\t\tpublic int get_margin_right ();\n\t\tpublic int get_margin_top ();\n\t\tpublic Gdk.ModifierType get_modifier_mask (Gdk.ModifierIntent intent);\n\t\t[Deprecated (replacement = \"StyleContext with a custom StyleProvider\", since = \"3.0\")]\n\t\tpublic unowned Gtk.RcStyle get_modifier_style ();\n\t\tpublic bool get_no_show_all ();\n\t\tpublic double get_opacity ();\n\t\tpublic unowned Pango.Context get_pango_context ();\n\t\tpublic unowned Gtk.Widget get_parent ();\n\t\tpublic unowned Gdk.Window get_parent_window ();\n\t\tpublic unowned Gtk.WidgetPath get_path ();\n\t\t[Deprecated (replacement = \"Gdk.Window.get_device_position\", since = \"3.4\")]\n\t\tpublic void get_pointer (out int x, out int y);\n\t\tpublic virtual void get_preferred_height (out int minimum_height, out int natural_height);\n\t\tpublic virtual void get_preferred_height_and_baseline_for_width (int width, int minimum_height, int natural_height, int minimum_baseline, int natural_baseline);\n\t\tpublic virtual void get_preferred_height_for_width (int width, out int minimum_height, out int natural_height);\n\t\t[CCode (vfunc_name = \"get_preferred_height_for_width\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void get_preferred_height_for_width_internal (int width, out int minimum_height, out int natural_height);\n\t\t[CCode (vfunc_name = \"get_preferred_height\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void get_preferred_height_internal (out int minimum_height, out int natural_height);\n\t\tpublic void get_preferred_size (out Gtk.Requisition minimum_size, out Gtk.Requisition natural_size);\n\t\tpublic virtual void get_preferred_width (out int minimum_width, out int natural_width);\n\t\tpublic virtual void get_preferred_width_for_height (int height, out int minimum_width, out int natural_width);\n\t\t[CCode (vfunc_name = \"get_preferred_width_for_height\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void get_preferred_width_for_height_internal (int height, out int minimum_width, out int natural_width);\n\t\t[CCode (vfunc_name = \"get_preferred_width\")]\n\t\t[NoWrapper]\n\t\tpublic virtual void get_preferred_width_internal (out int minimum_width, out int natural_width);\n\t\tpublic bool get_realized ();\n\t\tpublic bool get_receives_default ();\n\t\tpublic virtual Gtk.SizeRequestMode get_request_mode ();\n\t\tpublic Gtk.Requisition get_requisition ();\n\t\tpublic unowned Gdk.Window get_root_window ();\n\t\tpublic int get_scale_factor ();\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic bool get_sensitive ();\n\t\tpublic unowned Gtk.Settings get_settings ();\n\t\tpublic void get_size_request (out int width, out int height);\n\t\t[Deprecated (replacement = \"get_state_flags\", since = \"3.0\")]\n\t\tpublic Gtk.StateType get_state ();\n\t\tpublic Gtk.StateFlags get_state_flags ();\n\t\t[Deprecated (replacement = \"StyleContext\", since = \"3.0\")]\n\t\tpublic unowned Gtk.Style get_style ();\n\t\tpublic unowned Gtk.StyleContext get_style_context ();\n\t\tpublic bool get_support_multidevice ();\n\t\tpublic unowned GLib.Object get_template_child (GLib.Type widget_type, string name);\n\t\tpublic unowned string get_tooltip_markup ();\n\t\tpublic unowned string get_tooltip_text ();\n\t\tpublic unowned Gtk.Window get_tooltip_window ();\n\t\tpublic unowned Gtk.Widget get_toplevel ();\n\t\tpublic Gtk.Align get_valign ();\n\t\tpublic Gtk.Align get_valign_with_baseline ();\n\t\tpublic bool get_vexpand ();\n\t\tpublic bool get_vexpand_set ();\n\t\tpublic bool get_visible ();\n\t\tpublic unowned Gdk.Visual get_visual ();\n\t\tpublic unowned Gdk.Window get_window ();\n\t\tpublic void grab_default ();\n\t\tpublic bool has_grab ();\n\t\t[Deprecated (replacement = \"StyleContext\", since = \"3.0\")]\n\t\tpublic bool has_rc_style ();\n\t\tpublic bool has_screen ();\n\t\tpublic bool has_visible_focus ();\n\t\tpublic bool hide_on_delete ();\n\t\tpublic bool in_destruction ();\n\t\tpublic void init_template ();\n\t\tpublic void input_shape_combine_region (Cairo.Region? region);\n\t\tpublic void insert_action_group (string name, GLib.ActionGroup group);\n\t\t[CCode (cname = \"gtk_widget_class_install_style_property\")]\n\t\tpublic class void install_style_property (GLib.ParamSpec pspec);\n\t\t[CCode (cname = \"gtk_widget_class_install_style_property_parser\")]\n\t\tpublic class void install_style_property_parser (GLib.ParamSpec pspec, Gtk.RcPropertyParser parser);\n\t\tpublic bool intersect (Gdk.Rectangle area, Gdk.Rectangle? intersection);\n\t\tpublic bool is_ancestor (Gtk.Widget ancestor);\n\t\tpublic bool is_composited ();\n\t\tpublic bool is_sensitive ();\n\t\tpublic bool is_toplevel ();\n\t\tpublic bool is_visible ();\n\t\tpublic GLib.List<GLib.Closure> list_accel_closures ();\n\t\tpublic GLib.List<weak Gtk.Widget> list_mnemonic_labels ();\n\t\t[CCode (cname = \"gtk_widget_class_list_style_properties\")]\n\t\tpublic class unowned GLib.ParamSpec list_style_properties (uint n_properties);\n\t\t[Deprecated (replacement = \"override_background_color\", since = \"3.0\")]\n\t\tpublic void modify_base (Gtk.StateType state, Gdk.Color? color);\n\t\t[Deprecated (replacement = \"override_background_color\", since = \"3.0\")]\n\t\tpublic void modify_bg (Gtk.StateType state, Gdk.Color? color);\n\t\t[Deprecated (replacement = \"override_cursor\", since = \"3.0\")]\n\t\tpublic void modify_cursor (Gdk.Color? primary, Gdk.Color? secondary);\n\t\t[Deprecated (replacement = \"override_color\", since = \"3.0\")]\n\t\tpublic void modify_fg (Gtk.StateType state, Gdk.Color? color);\n\t\t[Deprecated (replacement = \"override_font\", since = \"3.0\")]\n\t\tpublic void modify_font (Pango.FontDescription? font_desc);\n\t\t[Deprecated (replacement = \"StyleContext with a custom StyleProvider\", since = \"3.0\")]\n\t\tpublic void modify_style (Gtk.RcStyle style);\n\t\t[Deprecated (replacement = \"override_color\", since = \"3.0\")]\n\t\tpublic void modify_text (Gtk.StateType state, Gdk.Color? color);\n\t\tpublic void override_background_color (Gtk.StateFlags state, Gdk.RGBA? color);\n\t\tpublic void override_color (Gtk.StateFlags state, Gdk.RGBA? color);\n\t\tpublic void override_cursor (Gdk.RGBA? cursor, Gdk.RGBA? secondary_cursor);\n\t\tpublic void override_font (Pango.FontDescription? font_desc);\n\t\tpublic void override_symbolic_color (string name, Gdk.RGBA? color);\n\t\t[Deprecated (replacement = \"get_path\", since = \"3.0\")]\n\t\tpublic void path (out uint path_length, out unowned string path, out unowned string path_reversed);\n\t\tpublic static void pop_composite_child ();\n\t\tpublic static void push_composite_child ();\n\t\tpublic void queue_compute_expand ();\n\t\tpublic void queue_draw ();\n\t\tpublic void queue_draw_area (int x, int y, int width, int height);\n\t\tpublic virtual void queue_draw_region (Cairo.Region region);\n\t\tpublic void queue_resize ();\n\t\tpublic void queue_resize_no_redraw ();\n\t\tpublic unowned Cairo.Region region_intersect (Cairo.Region region);\n\t\tpublic void register_window (Gdk.Window window);\n\t\tpublic bool remove_accelerator (Gtk.AccelGroup accel_group, uint accel_key, Gdk.ModifierType accel_mods);\n\t\tpublic void remove_mnemonic_label (Gtk.Widget label);\n\t\tpublic void remove_tick_callback (uint id);\n\t\tpublic Gdk.Pixbuf render_icon (string stock_id, Gtk.IconSize size, string? detail);\n\t\tpublic unowned Gdk.Pixbuf render_icon_pixbuf (string stock_id, Gtk.IconSize size);\n\t\tpublic void reparent (Gtk.Widget new_parent);\n\t\t[Deprecated (replacement = \"reset_style\", since = \"3.0\")]\n\t\tpublic void reset_rc_styles ();\n\t\tpublic void reset_style ();\n\t\tpublic int send_expose (Gdk.Event event);\n\t\tpublic bool send_focus_change (Gdk.Event event);\n\t\tpublic void set_accel_path (string accel_path, Gtk.AccelGroup accel_group);\n\t\t[CCode (cname = \"gtk_widget_class_set_accessible_role\")]\n\t\tpublic class void set_accessible_role (Atk.Role role);\n\t\t[CCode (cname = \"gtk_widget_class_set_accessible_type\")]\n\t\tpublic class void set_accessible_type (GLib.Type type);\n\t\tpublic void set_allocation (Gtk.Allocation allocation);\n\t\tpublic void set_app_paintable (bool app_paintable);\n\t\tpublic void set_can_default (bool can_default);\n\t\tpublic void set_can_focus (bool can_focus);\n\t\tpublic void set_child_visible (bool is_visible);\n\t\tpublic void set_composite_name (string name);\n\t\t[CCode (cname = \"gtk_widget_class_set_connect_func\")]\n\t\tpublic class void set_connect_func (Gtk.BuilderConnectFunc connect_func, void* connect_data, GLib.DestroyNotify connect_data_destroy);\n\t\tpublic static void set_default_direction (Gtk.TextDirection dir);\n\t\tpublic void set_device_enabled (Gdk.Device device, bool enabled);\n\t\tpublic void set_device_events (Gdk.Device device, Gdk.EventMask events);\n\t\tpublic void set_direction (Gtk.TextDirection dir);\n\t\tpublic void set_double_buffered (bool double_buffered);\n\t\tpublic void set_events (int events);\n\t\tpublic void set_halign (Gtk.Align align);\n\t\tpublic void set_has_tooltip (bool has_tooltip);\n\t\tpublic void set_has_window (bool has_window);\n\t\tpublic void set_hexpand (bool expand);\n\t\tpublic void set_hexpand_set (bool @set);\n\t\tpublic void set_mapped (bool mapped);\n\t\tpublic void set_margin_bottom (int margin);\n\t\tpublic void set_margin_left (int margin);\n\t\tpublic void set_margin_right (int margin);\n\t\tpublic void set_margin_top (int margin);\n\t\tpublic void set_no_show_all (bool no_show_all);\n\t\tpublic void set_opacity (double opacity);\n\t\tpublic void set_parent (Gtk.Widget parent);\n\t\tpublic void set_parent_window (Gdk.Window parent_window);\n\t\tpublic void set_realized (bool realized);\n\t\tpublic void set_receives_default (bool receives_default);\n\t\tpublic void set_redraw_on_allocate (bool redraw_on_allocate);\n\t\tpublic void set_sensitive (bool sensitive);\n\t\tpublic void set_size_request (int width, int height);\n\t\t[Deprecated (replacement = \"set_state_flags\", since = \"3.0\")]\n\t\tpublic void set_state (Gtk.StateType state);\n\t\tpublic void set_state_flags (Gtk.StateFlags flags, bool clear);\n\t\t[Deprecated (replacement = \"StyleContext\", since = \"3.0\")]\n\t\tpublic void set_style (Gtk.Style? style);\n\t\tpublic void set_support_multidevice (bool support_multidevice);\n\t\t[CCode (cname = \"gtk_widget_class_set_template\")]\n\t\tpublic class void set_template (GLib.Bytes template_bytes);\n\t\t[CCode (cname = \"gtk_widget_class_set_template_from_resource\")]\n\t\tpublic class void set_template_from_resource (string resource_name);\n\t\tpublic void set_tooltip_markup (string markup);\n\t\tpublic void set_tooltip_text (string text);\n\t\tpublic void set_tooltip_window (Gtk.Window custom_window);\n\t\tpublic void set_valign (Gtk.Align align);\n\t\tpublic void set_vexpand (bool expand);\n\t\tpublic void set_vexpand_set (bool @set);\n\t\tpublic void set_visible (bool visible);\n\t\tpublic void set_visual (Gdk.Visual visual);\n\t\tpublic void set_window (owned Gdk.Window window);\n\t\tpublic void shape_combine_region (Cairo.Region? region);\n\t\tpublic virtual void show_all ();\n\t\tpublic void show_now ();\n\t\tpublic void size_allocate_with_baseline (Gtk.Allocation allocation, int baseline);\n\t\t[Deprecated (replacement = \"StyleContext\", since = \"3.0\")]\n\t\tpublic void style_attach ();\n\t\tpublic void style_get (...);\n\t\tpublic void style_get_property (string property_name, ref GLib.Value value);\n\t\tpublic void style_get_valist (string first_property_name, void* var_args);\n\t\tpublic void thaw_child_notify ();\n\t\tpublic bool translate_coordinates (Gtk.Widget dest_widget, int src_x, int src_y, out int dest_x, out int dest_y);\n\t\tpublic void trigger_tooltip_query ();\n\t\tpublic void unparent ();\n\t\tpublic void unregister_window (Gdk.Window window);\n\t\tpublic void unset_state_flags (Gtk.StateFlags flags);\n\t\tpublic bool app_paintable { get; set; }\n\t\tpublic bool can_default { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool can_focus { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool composite_child { get; }\n\t\tpublic bool double_buffered { get; set; }\n\t\tpublic Gdk.EventMask events { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool expand { get; set; }\n\t\tpublic Gtk.Align halign { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool has_default { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool has_focus { get; set; }\n\t\tpublic bool has_tooltip { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int height_request { get; set; }\n\t\tpublic bool hexpand { get; set; }\n\t\tpublic bool hexpand_set { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool is_focus { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int margin { get; set; }\n\t\tpublic int margin_bottom { get; set; }\n\t\tpublic int margin_left { get; set; }\n\t\tpublic int margin_right { get; set; }\n\t\tpublic int margin_top { get; set; }\n\t\tpublic string name { get; set; }\n\t\tpublic bool no_show_all { get; set; }\n\t\tpublic double opacity { get; set; }\n\t\tpublic Gtk.Container parent { get; set; }\n\t\tpublic bool receives_default { get; set; }\n\t\tpublic int scale_factor { get; }\n\t\tpublic bool sensitive { get; set; }\n\t\tpublic Gtk.Style style { get; set; }\n\t\tpublic string tooltip_markup { get; set; }\n\t\tpublic string tooltip_text { get; set; }\n\t\tpublic Gtk.Align valign { get; set; }\n\t\tpublic bool vexpand { get; set; }\n\t\tpublic bool vexpand_set { get; set; }\n\t\tpublic bool visible { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int width_request { get; set; }\n\t\tpublic virtual signal void accel_closures_changed ();\n\t\tpublic virtual signal bool button_press_event (Gdk.EventButton event);\n\t\tpublic virtual signal bool button_release_event (Gdk.EventButton event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool can_activate_accel (uint signal_id);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void child_notify (GLib.ParamSpec child_property);\n\t\tpublic virtual signal void composited_changed ();\n\t\tpublic virtual signal bool configure_event (Gdk.EventConfigure event);\n\t\tpublic virtual signal bool damage_event (Gdk.EventExpose event);\n\t\tpublic virtual signal bool delete_event (Gdk.EventAny event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void destroy ();\n\t\tpublic virtual signal bool destroy_event (Gdk.EventAny event);\n\t\tpublic virtual signal void direction_changed (Gtk.TextDirection previous_direction);\n\t\tpublic virtual signal void drag_begin (Gdk.DragContext context);\n\t\tpublic virtual signal void drag_data_delete (Gdk.DragContext context);\n\t\tpublic virtual signal void drag_data_get (Gdk.DragContext context, Gtk.SelectionData selection_data, uint info, uint time_);\n\t\tpublic virtual signal void drag_data_received (Gdk.DragContext context, int x, int y, Gtk.SelectionData selection_data, uint info, uint time_);\n\t\tpublic virtual signal bool drag_drop (Gdk.DragContext context, int x, int y, uint time_);\n\t\tpublic virtual signal void drag_end (Gdk.DragContext context);\n\t\tpublic virtual signal bool drag_failed (Gdk.DragContext context, Gtk.DragResult result);\n\t\tpublic virtual signal void drag_leave (Gdk.DragContext context, uint time_);\n\t\tpublic virtual signal bool drag_motion (Gdk.DragContext context, int x, int y, uint time_);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool draw (Cairo.Context cr);\n\t\tpublic virtual signal bool enter_notify_event (Gdk.EventCrossing event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool event (Gdk.Event event);\n\t\tpublic virtual signal void event_after (Gdk.Event p0);\n\t\tpublic virtual signal bool focus (Gtk.DirectionType direction);\n\t\tpublic virtual signal bool focus_in_event (Gdk.EventFocus event);\n\t\tpublic virtual signal bool focus_out_event (Gdk.EventFocus event);\n\t\tpublic virtual signal bool grab_broken_event (Gdk.EventGrabBroken event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void grab_focus ();\n\t\tpublic virtual signal void grab_notify (bool was_grabbed);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void hide ();\n\t\tpublic virtual signal void hierarchy_changed (Gtk.Widget? previous_toplevel);\n\t\tpublic virtual signal bool key_press_event (Gdk.EventKey event);\n\t\tpublic virtual signal bool key_release_event (Gdk.EventKey event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool keynav_failed (Gtk.DirectionType direction);\n\t\tpublic virtual signal bool leave_notify_event (Gdk.EventCrossing event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void map ();\n\t\tpublic virtual signal bool map_event (Gdk.EventAny event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool mnemonic_activate (bool group_cycling);\n\t\tpublic virtual signal bool motion_notify_event (Gdk.EventMotion event);\n\t\tpublic virtual signal void move_focus (Gtk.DirectionType direction);\n\t\tpublic virtual signal void parent_set (Gtk.Widget? previous_parent);\n\t\tpublic virtual signal bool popup_menu ();\n\t\tpublic virtual signal bool property_notify_event (Gdk.EventProperty event);\n\t\tpublic virtual signal bool proximity_in_event (Gdk.EventProximity event);\n\t\tpublic virtual signal bool proximity_out_event (Gdk.EventProximity event);\n\t\tpublic virtual signal bool query_tooltip (int x, int y, bool keyboard_tooltip, Gtk.Tooltip tooltip);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void realize ();\n\t\tpublic virtual signal void screen_changed (Gdk.Screen previous_screen);\n\t\tpublic virtual signal bool scroll_event (Gdk.EventScroll event);\n\t\tpublic virtual signal bool selection_clear_event (Gdk.EventSelection event);\n\t\tpublic virtual signal void selection_get (Gtk.SelectionData selection_data, uint info, uint time_);\n\t\tpublic virtual signal bool selection_notify_event (Gdk.EventSelection event);\n\t\tpublic virtual signal void selection_received (Gtk.SelectionData selection_data, uint time_);\n\t\tpublic virtual signal bool selection_request_event (Gdk.EventSelection event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void show ();\n\t\tpublic virtual signal bool show_help (Gtk.WidgetHelpType help_type);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void size_allocate (Gtk.Allocation allocation);\n\t\tpublic virtual signal void state_changed (Gtk.StateType previous_state);\n\t\tpublic virtual signal void state_flags_changed (Gtk.StateFlags previous_state_flags);\n\t\tpublic virtual signal void style_set (Gtk.Style? previous_style);\n\t\tpublic virtual signal void style_updated ();\n\t\tpublic virtual signal bool touch_event (Gdk.Event event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void unmap ();\n\t\tpublic virtual signal bool unmap_event (Gdk.EventAny event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void unrealize ();\n\t\tpublic virtual signal bool visibility_notify_event (Gdk.EventVisibility event);\n\t\tpublic virtual signal bool window_state_event (Gdk.EventWindowState event);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class WidgetAccessible : Gtk.Accessible, Atk.Component {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WidgetAccessible ();\n\t\t[NoWrapper]\n\t\tpublic virtual void notify_gtk (GLib.Object object, GLib.ParamSpec pspec);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class WidgetAuxInfo {\n\t\tpublic uint halign;\n\t\tpublic int height;\n\t\tpublic Gtk.Border margin;\n\t\tpublic uint valign;\n\t\tpublic int width;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", ref_function = \"gtk_widget_path_ref\", type_id = \"gtk_widget_path_get_type ()\", unref_function = \"gtk_widget_path_unref\")]\n\t[Compact]\n\tpublic class WidgetPath {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic WidgetPath ();\n\t\tpublic int append_for_widget (Gtk.Widget widget);\n\t\tpublic int append_type (GLib.Type type);\n\t\tpublic int append_with_siblings (Gtk.WidgetPath siblings, uint sibling_index);\n\t\tpublic unowned Gtk.WidgetPath copy ();\n\t\tpublic GLib.Type get_object_type ();\n\t\tpublic bool has_parent (GLib.Type type);\n\t\tpublic bool is_type (GLib.Type type);\n\t\tpublic void iter_add_class (int pos, string name);\n\t\tpublic void iter_add_region (int pos, string name, Gtk.RegionFlags flags);\n\t\tpublic void iter_clear_classes (int pos);\n\t\tpublic void iter_clear_regions (int pos);\n\t\tpublic unowned string iter_get_name (int pos);\n\t\tpublic GLib.Type iter_get_object_type (int pos);\n\t\tpublic uint iter_get_sibling_index (int pos);\n\t\tpublic unowned Gtk.WidgetPath iter_get_siblings (int pos);\n\t\tpublic bool iter_has_class (int pos, string name);\n\t\tpublic bool iter_has_name (int pos, string name);\n\t\tpublic bool iter_has_qclass (int pos, GLib.Quark qname);\n\t\tpublic bool iter_has_qname (int pos, GLib.Quark qname);\n\t\tpublic bool iter_has_qregion (int pos, GLib.Quark qname, Gtk.RegionFlags flags);\n\t\tpublic bool iter_has_region (int pos, string name, out Gtk.RegionFlags flags);\n\t\tpublic unowned GLib.SList iter_list_classes (int pos);\n\t\tpublic unowned GLib.SList iter_list_regions (int pos);\n\t\tpublic void iter_remove_class (int pos, string name);\n\t\tpublic void iter_remove_region (int pos, string name);\n\t\tpublic void iter_set_name (int pos, string name);\n\t\tpublic void iter_set_object_type (int pos, GLib.Type type);\n\t\tpublic int length ();\n\t\tpublic void prepend_type (GLib.Type type);\n\t\tpublic unowned string to_string ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class Window : Gtk.Bin, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic Window (Gtk.WindowType type = Gtk.WindowType.TOPLEVEL);\n\t\tpublic bool activate_default ();\n\t\tpublic bool activate_focus ();\n\t\tpublic bool activate_key (Gdk.EventKey event);\n\t\tpublic void add_accel_group (Gtk.AccelGroup accel_group);\n\t\tpublic void add_mnemonic (uint keyval, Gtk.Widget target);\n\t\tpublic void begin_move_drag (int button, int root_x, int root_y, uint32 timestamp);\n\t\tpublic void begin_resize_drag (Gdk.WindowEdge edge, int button, int root_x, int root_y, uint32 timestamp);\n\t\tpublic void close ();\n\t\tpublic void deiconify ();\n\t\tpublic void fullscreen ();\n\t\tpublic bool get_accept_focus ();\n\t\tpublic unowned Gtk.Application get_application ();\n\t\tpublic unowned Gtk.Widget get_attached_to ();\n\t\tpublic bool get_decorated ();\n\t\tpublic static GLib.List<weak Gdk.Pixbuf> get_default_icon_list ();\n\t\tpublic static unowned string get_default_icon_name ();\n\t\tpublic void get_default_size (out int width, out int height);\n\t\tpublic unowned Gtk.Widget get_default_widget ();\n\t\tpublic bool get_deletable ();\n\t\tpublic bool get_destroy_with_parent ();\n\t\tpublic unowned Gtk.Widget get_focus ();\n\t\tpublic bool get_focus_on_map ();\n\t\tpublic bool get_focus_visible ();\n\t\tpublic Gdk.Gravity get_gravity ();\n\t\tpublic unowned Gtk.WindowGroup get_group ();\n\t\tpublic bool get_has_resize_grip ();\n\t\tpublic bool get_hide_titlebar_when_maximized ();\n\t\tpublic unowned Gdk.Pixbuf get_icon ();\n\t\tpublic GLib.List<weak Gdk.Pixbuf> get_icon_list ();\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic Gdk.ModifierType get_mnemonic_modifier ();\n\t\tpublic bool get_mnemonics_visible ();\n\t\tpublic bool get_modal ();\n\t\tpublic double get_opacity ();\n\t\tpublic void get_position (out int root_x, out int root_y);\n\t\tpublic bool get_resizable ();\n\t\tpublic bool get_resize_grip_area (Gdk.Rectangle rect);\n\t\tpublic unowned string get_role ();\n\t\tpublic unowned Gdk.Screen get_screen ();\n\t\tpublic void get_size (out int width, out int height);\n\t\tpublic bool get_skip_pager_hint ();\n\t\tpublic bool get_skip_taskbar_hint ();\n\t\tpublic unowned string get_title ();\n\t\tpublic unowned Gtk.Window get_transient_for ();\n\t\tpublic Gdk.WindowTypeHint get_type_hint ();\n\t\tpublic bool get_urgency_hint ();\n\t\tpublic Gtk.WindowType get_window_type ();\n\t\tpublic bool has_group ();\n\t\tpublic void iconify ();\n\t\tpublic static GLib.List<weak Gtk.Window> list_toplevels ();\n\t\tpublic void maximize ();\n\t\tpublic bool mnemonic_activate (uint keyval, Gdk.ModifierType modifier);\n\t\tpublic void move (int x, int y);\n\t\tpublic bool parse_geometry (string geometry);\n\t\tpublic void present ();\n\t\tpublic void present_with_time (uint32 timestamp);\n\t\tpublic bool propagate_key_event (Gdk.EventKey event);\n\t\tpublic void remove_accel_group (Gtk.AccelGroup accel_group);\n\t\tpublic void remove_mnemonic (uint keyval, Gtk.Widget target);\n\t\tpublic void reshow_with_initial_size ();\n\t\tpublic void resize (int width, int height);\n\t\tpublic bool resize_grip_is_visible ();\n\t\tpublic void resize_to_geometry (int width, int height);\n\t\tpublic void set_accept_focus (bool setting);\n\t\tpublic void set_application (Gtk.Application application);\n\t\tpublic void set_attached_to (Gtk.Widget attach_widget);\n\t\tpublic static void set_auto_startup_notification (bool setting);\n\t\tpublic void set_decorated (bool setting);\n\t\tpublic void set_default (Gtk.Widget default_widget);\n\t\tpublic void set_default_geometry (int width, int height);\n\t\tpublic static void set_default_icon (Gdk.Pixbuf icon);\n\t\tpublic static bool set_default_icon_from_file (string filename) throws GLib.Error;\n\t\tpublic static void set_default_icon_list (GLib.List<Gdk.Pixbuf> list);\n\t\tpublic static void set_default_icon_name (string name);\n\t\tpublic void set_default_size (int width, int height);\n\t\tpublic void set_deletable (bool setting);\n\t\tpublic void set_destroy_with_parent (bool setting);\n\t\tpublic void set_focus_on_map (bool setting);\n\t\tpublic void set_focus_visible (bool setting);\n\t\tpublic void set_geometry_hints (Gtk.Widget geometry_widget, Gdk.Geometry geometry, Gdk.WindowHints geom_mask);\n\t\tpublic void set_gravity (Gdk.Gravity gravity);\n\t\tpublic void set_has_resize_grip (bool value);\n\t\tpublic void set_has_user_ref_count (bool setting);\n\t\tpublic void set_hide_titlebar_when_maximized (bool setting);\n\t\tpublic void set_icon (Gdk.Pixbuf icon);\n\t\tpublic bool set_icon_from_file (string filename) throws GLib.Error;\n\t\tpublic void set_icon_list (GLib.List<Gdk.Pixbuf> list);\n\t\tpublic void set_icon_name (string name);\n\t\tpublic void set_keep_above (bool setting);\n\t\tpublic void set_keep_below (bool setting);\n\t\tpublic void set_mnemonic_modifier (Gdk.ModifierType modifier);\n\t\tpublic void set_mnemonics_visible (bool setting);\n\t\tpublic void set_modal (bool modal);\n\t\tpublic void set_opacity (double opacity);\n\t\tpublic void set_position (Gtk.WindowPosition position);\n\t\tpublic void set_resizable (bool resizable);\n\t\tpublic void set_role (string role);\n\t\tpublic void set_screen (Gdk.Screen screen);\n\t\tpublic void set_skip_pager_hint (bool setting);\n\t\tpublic void set_skip_taskbar_hint (bool setting);\n\t\tpublic void set_startup_id (string startup_id);\n\t\tpublic void set_title (string title);\n\t\tpublic void set_titlebar (Gtk.Widget titlebar);\n\t\tpublic void set_transient_for (Gtk.Window parent);\n\t\tpublic void set_type_hint (Gdk.WindowTypeHint hint);\n\t\tpublic void set_urgency_hint (bool setting);\n\t\tpublic void set_wmclass (string wmclass_name, string wmclass_class);\n\t\tpublic void stick ();\n\t\tpublic void unfullscreen ();\n\t\tpublic void unmaximize ();\n\t\tpublic void unstick ();\n\t\tpublic bool accept_focus { get; set; }\n\t\tpublic Gtk.Application application { get; set; }\n\t\tpublic Gtk.Widget attached_to { get; set construct; }\n\t\tpublic bool decorated { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int default_height { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic int default_width { get; set; }\n\t\tpublic bool deletable { get; set; }\n\t\tpublic bool destroy_with_parent { get; set; }\n\t\tpublic bool focus_on_map { get; set; }\n\t\tpublic bool focus_visible { get; set; }\n\t\tpublic Gdk.Gravity gravity { get; set; }\n\t\tpublic bool has_resize_grip { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool has_toplevel_focus { get; }\n\t\tpublic bool hide_titlebar_when_maximized { get; set; }\n\t\tpublic Gdk.Pixbuf icon { get; set; }\n\t\tpublic string icon_name { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool is_active { get; }\n\t\tpublic bool mnemonics_visible { get; set; }\n\t\tpublic bool modal { get; set; }\n\t\tpublic bool resizable { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool resize_grip_visible { get; }\n\t\tpublic string role { get; set; }\n\t\tpublic Gdk.Screen screen { get; set; }\n\t\tpublic bool skip_pager_hint { get; set; }\n\t\tpublic bool skip_taskbar_hint { get; set; }\n\t\tpublic string startup_id { set; }\n\t\tpublic string title { get; set; }\n\t\tpublic Gtk.Window transient_for { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.WindowType type { get; construct; }\n\t\tpublic Gdk.WindowTypeHint type_hint { get; set; }\n\t\tpublic bool urgency_hint { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.WindowPosition window_position { get; set; }\n\t\t[CCode (cname = \"activate_default\")]\n\t\t[Experimental]\n\t\tpublic virtual signal void default_activated ();\n\t\t[CCode (cname = \"activate_focus\")]\n\t\t[Experimental]\n\t\tpublic virtual signal void focus_activated ();\n\t\tpublic virtual signal void keys_changed ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void set_focus (Gtk.Widget? focus);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class WindowAccessible : Gtk.ContainerAccessible, Atk.Component, Atk.Window {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WindowAccessible ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Compact]\n\tpublic class WindowGeometryInfo {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic class WindowGroup : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic WindowGroup ();\n\t\tpublic void add_window (Gtk.Window window);\n\t\tpublic unowned Gtk.Widget get_current_device_grab (Gdk.Device device);\n\t\tpublic unowned Gtk.Widget get_current_grab ();\n\t\tpublic GLib.List<weak Gtk.Window> list_windows ();\n\t\tpublic void remove_window (Gtk.Window window);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface Actionable : Gtk.Widget {\n\t\tpublic abstract unowned string get_action_name ();\n\t\tpublic abstract unowned GLib.Variant get_action_target_value ();\n\t\tpublic abstract void set_action_name (string action_name);\n\t\tpublic void set_action_target (string format_string);\n\t\tpublic abstract void set_action_target_value (GLib.Variant target_value);\n\t\tpublic void set_detailed_action_name (string detailed_action_name);\n\t\tpublic string action_name { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic GLib.Variant action_target { owned get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface Activatable : GLib.Object {\n\t\tpublic void do_set_related_action (Gtk.Action action);\n\t\tpublic unowned Gtk.Action get_related_action ();\n\t\tpublic bool get_use_action_appearance ();\n\t\tpublic void set_related_action (Gtk.Action action);\n\t\tpublic void set_use_action_appearance (bool use_appearance);\n\t\tpublic abstract void sync_action_properties (Gtk.Action action);\n\t\t[NoWrapper]\n\t\tpublic abstract void update (Gtk.Action action, string property_name);\n\t\tpublic Gtk.Action related_action { get; set; }\n\t\tpublic bool use_action_appearance { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface AppChooser : Gtk.Widget {\n\t\tpublic unowned GLib.AppInfo get_app_info ();\n\t\tpublic unowned string get_content_type ();\n\t\tpublic void refresh ();\n\t\tpublic string content_type { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface Buildable : GLib.Object {\n\t\tpublic abstract void add_child (Gtk.Builder builder, GLib.Object child, string? type);\n\t\tpublic abstract unowned GLib.Object construct_child (Gtk.Builder builder, string name);\n\t\tpublic abstract void custom_finished (Gtk.Builder builder, GLib.Object? child, string tagname, void* data);\n\t\tpublic abstract void custom_tag_end (Gtk.Builder builder, GLib.Object? child, string tagname, out void* data);\n\t\tpublic abstract bool custom_tag_start (Gtk.Builder builder, GLib.Object? child, string tagname, out GLib.MarkupParser parser, out void* data);\n\t\tpublic abstract unowned GLib.Object get_internal_child (Gtk.Builder builder, string childname);\n\t\tpublic abstract unowned string get_name ();\n\t\tpublic abstract void parser_finished (Gtk.Builder builder);\n\t\tpublic abstract void set_buildable_property (Gtk.Builder builder, string name, GLib.Value value);\n\t\tpublic abstract void set_name (string name);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface CellAccessibleParent {\n\t\tpublic abstract void activate (Gtk.CellAccessible cell);\n\t\tpublic abstract void edit (Gtk.CellAccessible cell);\n\t\tpublic abstract void expand_collapse (Gtk.CellAccessible cell);\n\t\tpublic abstract void get_cell_area (Gtk.CellAccessible cell, Gdk.Rectangle cell_rect);\n\t\tpublic abstract void get_cell_extents (Gtk.CellAccessible cell, int x, int y, int width, int height, Atk.CoordType coord_type);\n\t\tpublic abstract int get_child_index (Gtk.CellAccessible cell);\n\t\tpublic abstract Gtk.CellRendererState get_renderer_state (Gtk.CellAccessible cell);\n\t\tpublic abstract bool grab_focus (Gtk.CellAccessible cell);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface CellEditable : Gtk.Widget {\n\t\tpublic abstract void start_editing (Gdk.Event event);\n\t\t[NoAccessorMethod]\n\t\tpublic bool editing_canceled { get; set; }\n\t\t[HasEmitter]\n\t\tpublic signal void editing_done ();\n\t\t[HasEmitter]\n\t\tpublic signal void remove_widget ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface CellLayout : GLib.Object {\n\t\tpublic abstract void add_attribute (Gtk.CellRenderer cell, string attribute, int column);\n\t\tpublic abstract void clear ();\n\t\tpublic abstract void clear_attributes (Gtk.CellRenderer cell);\n\t\tpublic abstract unowned Gtk.CellArea get_area ();\n\t\tpublic abstract GLib.List<weak Gtk.CellRenderer> get_cells ();\n\t\tpublic abstract void pack_end (Gtk.CellRenderer cell, bool expand);\n\t\tpublic abstract void pack_start (Gtk.CellRenderer cell, bool expand);\n\t\tpublic abstract void reorder (Gtk.CellRenderer cell, int position);\n\t\tpublic void set_attributes (Gtk.CellRenderer cell, ...);\n\t\tpublic abstract void set_cell_data_func (Gtk.CellRenderer cell, owned Gtk.CellLayoutDataFunc func);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface ColorChooser : GLib.Object {\n\t\tpublic abstract void add_palette (Gtk.Orientation orientation, int colors_per_line, [CCode (array_length_pos = 2.9)] Gdk.RGBA[]? colors);\n\t\tpublic abstract Gdk.RGBA get_rgba ();\n\t\tpublic bool get_use_alpha ();\n\t\tpublic abstract void set_rgba (Gdk.RGBA color);\n\t\tpublic void set_use_alpha (bool use_alpha);\n\t\tpublic Gdk.RGBA rgba { get; set; }\n\t\tpublic bool use_alpha { get; set; }\n\t\tpublic signal void color_activated (Gdk.RGBA color);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface Editable {\n\t\tpublic void copy_clipboard ();\n\t\tpublic void cut_clipboard ();\n\t\tpublic void delete_selection ();\n\t\t[NoWrapper]\n\t\tpublic abstract void do_delete_text (int start_pos, int end_pos);\n\t\t[NoWrapper]\n\t\tpublic abstract void do_insert_text (string new_text, int new_text_length, int position);\n\t\tpublic abstract unowned string get_chars (int start_pos, int end_pos);\n\t\tpublic bool get_editable ();\n\t\tpublic abstract int get_position ();\n\t\tpublic abstract bool get_selection_bounds (out int start_pos, out int end_pos);\n\t\tpublic void paste_clipboard ();\n\t\t[CCode (vfunc_name = \"set_selection_bounds\")]\n\t\tpublic abstract void select_region (int start_pos, int end_pos);\n\t\tpublic void set_editable (bool is_editable);\n\t\tpublic abstract void set_position (int position);\n\t\tpublic signal void changed ();\n\t\t[HasEmitter]\n\t\tpublic signal void delete_text (int start_pos, int end_pos);\n\t\t[HasEmitter]\n\t\tpublic signal void insert_text (string new_text, int new_text_length, ref int position);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface FileChooser : Gtk.Widget {\n\t\tpublic void add_filter (owned Gtk.FileFilter filter);\n\t\tpublic bool add_shortcut_folder (string folder) throws GLib.Error;\n\t\tpublic bool add_shortcut_folder_uri (string uri) throws GLib.Error;\n\t\tpublic static GLib.Quark error_quark ();\n\t\tpublic Gtk.FileChooserAction get_action ();\n\t\tpublic bool get_create_folders ();\n\t\tpublic string get_current_folder ();\n\t\tpublic unowned GLib.File get_current_folder_file ();\n\t\tpublic string get_current_folder_uri ();\n\t\tpublic unowned string get_current_name ();\n\t\tpublic bool get_do_overwrite_confirmation ();\n\t\tpublic unowned Gtk.Widget get_extra_widget ();\n\t\tpublic unowned GLib.File get_file ();\n\t\tpublic string get_filename ();\n\t\tpublic GLib.SList<string> get_filenames ();\n\t\tpublic GLib.SList<GLib.File> get_files ();\n\t\tpublic unowned Gtk.FileFilter get_filter ();\n\t\tpublic bool get_local_only ();\n\t\tpublic unowned GLib.File get_preview_file ();\n\t\tpublic string get_preview_filename ();\n\t\tpublic string get_preview_uri ();\n\t\tpublic unowned Gtk.Widget get_preview_widget ();\n\t\tpublic bool get_preview_widget_active ();\n\t\tpublic bool get_select_multiple ();\n\t\tpublic bool get_show_hidden ();\n\t\tpublic string get_uri ();\n\t\tpublic GLib.SList<string> get_uris ();\n\t\tpublic bool get_use_preview_label ();\n\t\tpublic GLib.SList<weak Gtk.FileFilter> list_filters ();\n\t\tpublic GLib.SList<string>? list_shortcut_folder_uris ();\n\t\tpublic GLib.SList<string>? list_shortcut_folders ();\n\t\tpublic void remove_filter (Gtk.FileFilter filter);\n\t\tpublic bool remove_shortcut_folder (string folder) throws GLib.Error;\n\t\tpublic bool remove_shortcut_folder_uri (string uri) throws GLib.Error;\n\t\tpublic void select_all ();\n\t\tpublic bool select_file (GLib.File file) throws GLib.Error;\n\t\tpublic bool select_filename (string filename);\n\t\tpublic bool select_uri (string uri);\n\t\tpublic void set_action (Gtk.FileChooserAction action);\n\t\tpublic void set_create_folders (bool create_folders);\n\t\tpublic bool set_current_folder (string filename);\n\t\tpublic bool set_current_folder_file (GLib.File file) throws GLib.Error;\n\t\tpublic bool set_current_folder_uri (string uri);\n\t\tpublic void set_current_name (string name);\n\t\tpublic void set_do_overwrite_confirmation (bool do_overwrite_confirmation);\n\t\tpublic void set_extra_widget (Gtk.Widget extra_widget);\n\t\tpublic bool set_file (GLib.File file) throws GLib.Error;\n\t\tpublic bool set_filename (string filename);\n\t\tpublic void set_filter (Gtk.FileFilter filter);\n\t\tpublic void set_local_only (bool local_only);\n\t\tpublic void set_preview_widget (Gtk.Widget preview_widget);\n\t\tpublic void set_preview_widget_active (bool active);\n\t\tpublic void set_select_multiple (bool select_multiple);\n\t\tpublic void set_show_hidden (bool show_hidden);\n\t\tpublic bool set_uri (string uri);\n\t\tpublic void set_use_preview_label (bool use_label);\n\t\tpublic void unselect_all ();\n\t\tpublic void unselect_file (GLib.File file);\n\t\tpublic void unselect_filename (string filename);\n\t\tpublic void unselect_uri (string uri);\n\t\tpublic Gtk.FileChooserAction action { get; set; }\n\t\tpublic bool create_folders { get; set; }\n\t\tpublic bool do_overwrite_confirmation { get; set; }\n\t\tpublic Gtk.Widget extra_widget { get; set; }\n\t\tpublic Gtk.FileFilter filter { get; set; }\n\t\tpublic bool local_only { get; set; }\n\t\tpublic Gtk.Widget preview_widget { get; set; }\n\t\tpublic bool preview_widget_active { get; set; }\n\t\tpublic bool select_multiple { get; set; }\n\t\tpublic bool show_hidden { get; set; }\n\t\tpublic bool use_preview_label { get; set; }\n\t\tpublic signal Gtk.FileChooserConfirmation confirm_overwrite ();\n\t\tpublic signal void current_folder_changed ();\n\t\tpublic signal void file_activated ();\n\t\tpublic signal void selection_changed ();\n\t\tpublic signal void update_preview ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface FileChooserEmbed {\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface FontChooser : GLib.Object {\n\t\tpublic unowned string get_font ();\n\t\tpublic unowned Pango.FontDescription get_font_desc ();\n\t\tpublic abstract unowned Pango.FontFace get_font_face ();\n\t\tpublic abstract unowned Pango.FontFamily get_font_family ();\n\t\tpublic abstract int get_font_size ();\n\t\tpublic unowned string get_preview_text ();\n\t\tpublic bool get_show_preview_entry ();\n\t\tpublic abstract void set_filter_func (owned Gtk.FontFilterFunc filter);\n\t\tpublic void set_font (string fontname);\n\t\tpublic void set_font_desc (Pango.FontDescription font_desc);\n\t\tpublic void set_preview_text (string text);\n\t\tpublic void set_show_preview_entry (bool show_preview_entry);\n\t\tpublic string font { get; set; }\n\t\tpublic Pango.FontDescription font_desc { get; set; }\n\t\tpublic string preview_text { get; set; }\n\t\tpublic bool show_preview_entry { get; set; }\n\t\tpublic signal void font_activated (string fontname);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface Orientable : GLib.Object {\n\t\tpublic Gtk.Orientation get_orientation ();\n\t\tpublic void set_orientation (Gtk.Orientation orientation);\n\t\tpublic Gtk.Orientation orientation { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface PrintOperationPreview : GLib.Object {\n\t\tpublic abstract void end_preview ();\n\t\tpublic abstract bool is_selected (int page_nr);\n\t\tpublic abstract void render_page (int page_nr);\n\t\tpublic signal void got_page_size (Gtk.PrintContext context, Gtk.PageSetup page_setup);\n\t\tpublic signal void ready (Gtk.PrintContext context);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface RecentChooser : GLib.Object {\n\t\tpublic abstract void add_filter (Gtk.RecentFilter filter);\n\t\tpublic static GLib.Quark error_quark ();\n\t\tpublic unowned Gtk.RecentInfo get_current_item ();\n\t\tpublic abstract unowned string get_current_uri ();\n\t\tpublic unowned Gtk.RecentFilter get_filter ();\n\t\tpublic abstract GLib.List<Gtk.RecentInfo> get_items ();\n\t\tpublic int get_limit ();\n\t\tpublic bool get_local_only ();\n\t\t[NoWrapper]\n\t\tpublic abstract unowned Gtk.RecentManager get_recent_manager ();\n\t\tpublic bool get_select_multiple ();\n\t\tpublic bool get_show_icons ();\n\t\tpublic bool get_show_not_found ();\n\t\tpublic bool get_show_private ();\n\t\tpublic bool get_show_tips ();\n\t\tpublic Gtk.RecentSortType get_sort_type ();\n\t\tpublic unowned string get_uris (size_t length);\n\t\tpublic abstract GLib.SList<weak Gtk.RecentFilter> list_filters ();\n\t\tpublic abstract void remove_filter (Gtk.RecentFilter filter);\n\t\tpublic abstract void select_all ();\n\t\tpublic abstract bool select_uri (string uri) throws GLib.Error;\n\t\tpublic abstract bool set_current_uri (string uri) throws GLib.Error;\n\t\tpublic void set_filter (Gtk.RecentFilter filter);\n\t\tpublic void set_limit (int limit);\n\t\tpublic void set_local_only (bool local_only);\n\t\tpublic void set_select_multiple (bool select_multiple);\n\t\tpublic void set_show_icons (bool show_icons);\n\t\tpublic void set_show_not_found (bool show_not_found);\n\t\tpublic void set_show_private (bool show_private);\n\t\tpublic void set_show_tips (bool show_tips);\n\t\tpublic abstract void set_sort_func (owned Gtk.RecentSortFunc sort_func);\n\t\tpublic void set_sort_type (Gtk.RecentSortType sort_type);\n\t\tpublic abstract void unselect_all ();\n\t\tpublic abstract void unselect_uri (string uri);\n\t\tpublic Gtk.RecentFilter filter { get; set; }\n\t\tpublic int limit { get; set; }\n\t\tpublic bool local_only { get; set; }\n\t\tpublic Gtk.RecentManager recent_manager { construct; }\n\t\tpublic bool select_multiple { get; set; }\n\t\tpublic bool show_icons { get; set; }\n\t\tpublic bool show_not_found { get; set; }\n\t\tpublic bool show_private { get; set; }\n\t\tpublic bool show_tips { get; set; }\n\t\tpublic Gtk.RecentSortType sort_type { get; set; }\n\t\tpublic signal void item_activated ();\n\t\tpublic signal void selection_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", type_cname = \"GtkScrollableInterface\")]\n\tpublic interface Scrollable : GLib.Object {\n\t\tpublic unowned Gtk.Adjustment get_hadjustment ();\n\t\tpublic Gtk.ScrollablePolicy get_hscroll_policy ();\n\t\tpublic unowned Gtk.Adjustment get_vadjustment ();\n\t\tpublic Gtk.ScrollablePolicy get_vscroll_policy ();\n\t\tpublic void set_hadjustment (Gtk.Adjustment hadjustment);\n\t\tpublic void set_hscroll_policy (Gtk.ScrollablePolicy policy);\n\t\tpublic void set_vadjustment (Gtk.Adjustment vadjustment);\n\t\tpublic void set_vscroll_policy (Gtk.ScrollablePolicy policy);\n\t\tpublic Gtk.Adjustment hadjustment { get; set construct; }\n\t\tpublic Gtk.ScrollablePolicy hscroll_policy { get; set; }\n\t\tpublic Gtk.Adjustment vadjustment { get; set construct; }\n\t\tpublic Gtk.ScrollablePolicy vscroll_policy { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface StyleProvider {\n\t\tpublic abstract unowned Gtk.IconFactory get_icon_factory (Gtk.WidgetPath path);\n\t\tpublic abstract unowned Gtk.StyleProperties get_style (Gtk.WidgetPath path);\n\t\tpublic abstract bool get_style_property (Gtk.WidgetPath path, Gtk.StateFlags state, GLib.ParamSpec pspec, GLib.Value value);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface ToolShell : Gtk.Widget {\n\t\tpublic abstract Pango.EllipsizeMode get_ellipsize_mode ();\n\t\tpublic abstract Gtk.IconSize get_icon_size ();\n\t\tpublic abstract Gtk.Orientation get_orientation ();\n\t\tpublic abstract Gtk.ReliefStyle get_relief_style ();\n\t\tpublic abstract Gtk.ToolbarStyle get_style ();\n\t\tpublic abstract float get_text_alignment ();\n\t\tpublic abstract Gtk.Orientation get_text_orientation ();\n\t\tpublic abstract unowned Gtk.SizeGroup get_text_size_group ();\n\t\tpublic abstract void rebuild_menu ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface TreeDragDest {\n\t\tpublic abstract bool drag_data_received (Gtk.TreePath dest, Gtk.SelectionData selection_data);\n\t\tpublic abstract bool row_drop_possible (Gtk.TreePath dest_path, Gtk.SelectionData selection_data);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface TreeDragSource {\n\t\tpublic abstract bool drag_data_delete (Gtk.TreePath path);\n\t\tpublic abstract bool drag_data_get (Gtk.TreePath path, Gtk.SelectionData selection_data);\n\t\tpublic abstract bool row_draggable (Gtk.TreePath path);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface TreeModel : GLib.Object {\n\t\tpublic void @foreach (Gtk.TreeModelForeachFunc func);\n\t\t[CCode (sentinel = \"-1\")]\n\t\tpublic void @get (Gtk.TreeIter iter, ...);\n\t\tpublic abstract GLib.Type get_column_type (int index_);\n\t\tpublic abstract Gtk.TreeModelFlags get_flags ();\n\t\tpublic abstract bool get_iter (out Gtk.TreeIter iter, Gtk.TreePath path);\n\t\tpublic bool get_iter_first (out Gtk.TreeIter iter);\n\t\tpublic bool get_iter_from_string (out Gtk.TreeIter iter, string path_string);\n\t\tpublic abstract int get_n_columns ();\n\t\tpublic abstract Gtk.TreePath? get_path (Gtk.TreeIter iter);\n\t\tpublic string get_string_from_iter (Gtk.TreeIter iter);\n\t\tpublic void get_valist (Gtk.TreeIter iter, void* var_args);\n\t\tpublic abstract void get_value (Gtk.TreeIter iter, int column, out GLib.Value value);\n\t\tpublic abstract bool iter_children (out Gtk.TreeIter iter, Gtk.TreeIter? parent);\n\t\tpublic abstract bool iter_has_child (Gtk.TreeIter iter);\n\t\tpublic abstract int iter_n_children (Gtk.TreeIter? iter);\n\t\tpublic abstract bool iter_next (ref Gtk.TreeIter iter);\n\t\tpublic abstract bool iter_nth_child (out Gtk.TreeIter iter, Gtk.TreeIter? parent, int n);\n\t\tpublic abstract bool iter_parent (out Gtk.TreeIter iter, Gtk.TreeIter child);\n\t\tpublic virtual bool iter_previous (ref Gtk.TreeIter iter);\n\t\tpublic virtual void ref_node (Gtk.TreeIter iter);\n\t\tpublic void rows_reordered_with_length (Gtk.TreePath path, Gtk.TreeIter iter, int new_order, int length);\n\t\tpublic virtual void unref_node (Gtk.TreeIter iter);\n\t\t[HasEmitter]\n\t\tpublic signal void row_changed (Gtk.TreePath path, Gtk.TreeIter iter);\n\t\t[HasEmitter]\n\t\tpublic signal void row_deleted (Gtk.TreePath path);\n\t\t[HasEmitter]\n\t\tpublic signal void row_has_child_toggled (Gtk.TreePath path, Gtk.TreeIter iter);\n\t\t[HasEmitter]\n\t\tpublic signal void row_inserted (Gtk.TreePath path, Gtk.TreeIter iter);\n\t\t[HasEmitter]\n\t\tpublic signal void rows_reordered (Gtk.TreePath path, Gtk.TreeIter? iter, void* new_order);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic interface TreeSortable : Gtk.TreeModel, GLib.Object {\n\t\tpublic abstract bool get_sort_column_id (out int sort_column_id, out Gtk.SortType order);\n\t\tpublic abstract bool has_default_sort_func ();\n\t\tpublic abstract void set_default_sort_func (owned Gtk.TreeIterCompareFunc sort_func);\n\t\tpublic abstract void set_sort_column_id (int sort_column_id, Gtk.SortType order);\n\t\tpublic abstract void set_sort_func (int sort_column_id, owned Gtk.TreeIterCompareFunc sort_func);\n\t\t[HasEmitter]\n\t\tpublic signal void sort_column_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct AccelKey {\n\t\tpublic uint accel_key;\n\t\tpublic Gdk.ModifierType accel_mods;\n\t\tpublic uint accel_flags;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct ActionEntry {\n\t\tpublic weak string name;\n\t\tpublic weak string stock_id;\n\t\tpublic weak string label;\n\t\tpublic weak string accelerator;\n\t\tpublic weak string tooltip;\n\t\t[CCode (delegate_target = false, type = \"GCallback\")]\n\t\tpublic weak Gtk.ActionCallback callback;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct Allocation {\n\t\tpublic int x;\n\t\tpublic int y;\n\t\tpublic int width;\n\t\tpublic int height;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct BindingArg {\n\t\t[CCode (cname = \"d.long_data\")]\n\t\tpublic long long_data;\n\t\t[CCode (cname = \"d.double_data\")]\n\t\tpublic double double_data;\n\t\t[CCode (cname = \"d.string_data\")]\n\t\tpublic weak string string_data;\n\t\tpublic GLib.Type arg_type;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct Border {\n\t\tpublic int16 left;\n\t\tpublic int16 right;\n\t\tpublic int16 top;\n\t\tpublic int16 bottom;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h,gtk/gtkimmodule.h\")]\n\tpublic struct IMContextInfo {\n\t\tpublic weak string context_id;\n\t\tpublic weak string context_name;\n\t\tpublic weak string domain;\n\t\tpublic weak string domain_dirname;\n\t\tpublic weak string default_locales;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct RadioActionEntry {\n\t\tpublic weak string name;\n\t\tpublic weak string stock_id;\n\t\tpublic weak string label;\n\t\tpublic weak string accelerator;\n\t\tpublic weak string tooltip;\n\t\tpublic int value;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_copy_function = false, has_destroy_function = false)]\n\tpublic struct RecentData {\n\t\tpublic string display_name;\n\t\tpublic string description;\n\t\tpublic string mime_type;\n\t\tpublic string app_name;\n\t\tpublic string app_exec;\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] groups;\n\t\tpublic bool is_private;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct Requisition {\n\t\tpublic int width;\n\t\tpublic int height;\n\t\tpublic Gtk.Requisition copy ();\n\t\tpublic void free ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct StockItem {\n\t\tpublic weak string stock_id;\n\t\tpublic weak string label;\n\t\tpublic Gdk.ModifierType modifier;\n\t\tpublic uint keyval;\n\t\tpublic weak string translation_domain;\n\t\tpublic Gtk.StockItem copy ();\n\t\tpublic void free ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct TargetEntry {\n\t\tpublic weak string target;\n\t\tpublic uint flags;\n\t\tpublic uint info;\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic TargetEntry (string target, uint flags, uint info);\n\t\tpublic Gtk.TargetEntry copy ();\n\t\tpublic void free ();\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct TextIter {\n\t\tpublic void* dummy1;\n\t\tpublic void* dummy2;\n\t\tpublic int dummy3;\n\t\tpublic int dummy4;\n\t\tpublic int dummy5;\n\t\tpublic int dummy6;\n\t\tpublic int dummy7;\n\t\tpublic int dummy8;\n\t\tpublic void* dummy9;\n\t\tpublic void* dummy10;\n\t\tpublic int dummy11;\n\t\tpublic int dummy12;\n\t\tpublic int dummy13;\n\t\tpublic void* dummy14;\n\t\tpublic void assign (Gtk.TextIter other);\n\t\tpublic bool backward_char ();\n\t\tpublic bool backward_chars (int count);\n\t\tpublic bool backward_cursor_position ();\n\t\tpublic bool backward_cursor_positions (int count);\n\t\tpublic bool backward_find_char (Gtk.TextCharPredicate pred, Gtk.TextIter? limit);\n\t\tpublic bool backward_line ();\n\t\tpublic bool backward_lines (int count);\n\t\tpublic bool backward_search (string str, Gtk.TextSearchFlags flags, out Gtk.TextIter match_start, out Gtk.TextIter match_end, Gtk.TextIter? limit);\n\t\tpublic bool backward_sentence_start ();\n\t\tpublic bool backward_sentence_starts (int count);\n\t\tpublic bool backward_to_tag_toggle (Gtk.TextTag? tag);\n\t\tpublic bool backward_visible_cursor_position ();\n\t\tpublic bool backward_visible_cursor_positions (int count);\n\t\tpublic bool backward_visible_line ();\n\t\tpublic bool backward_visible_lines (int count);\n\t\tpublic bool backward_visible_word_start ();\n\t\tpublic bool backward_visible_word_starts (int count);\n\t\tpublic bool backward_word_start ();\n\t\tpublic bool backward_word_starts (int count);\n\t\tpublic bool begins_tag (Gtk.TextTag? tag);\n\t\tpublic bool can_insert (bool default_editability);\n\t\tpublic int compare (Gtk.TextIter rhs);\n\t\tpublic Gtk.TextIter copy ();\n\t\tpublic bool editable (bool default_setting);\n\t\tpublic bool ends_line ();\n\t\tpublic bool ends_sentence ();\n\t\tpublic bool ends_tag (Gtk.TextTag? tag);\n\t\tpublic bool ends_word ();\n\t\tpublic bool equal (Gtk.TextIter rhs);\n\t\tpublic bool forward_char ();\n\t\tpublic bool forward_chars (int count);\n\t\tpublic bool forward_cursor_position ();\n\t\tpublic bool forward_cursor_positions (int count);\n\t\tpublic bool forward_find_char (Gtk.TextCharPredicate pred, Gtk.TextIter? limit);\n\t\tpublic bool forward_line ();\n\t\tpublic bool forward_lines (int count);\n\t\tpublic bool forward_search (string str, Gtk.TextSearchFlags flags, out Gtk.TextIter match_start, out Gtk.TextIter match_end, Gtk.TextIter? limit);\n\t\tpublic bool forward_sentence_end ();\n\t\tpublic bool forward_sentence_ends (int count);\n\t\tpublic void forward_to_end ();\n\t\tpublic bool forward_to_line_end ();\n\t\tpublic bool forward_to_tag_toggle (Gtk.TextTag? tag);\n\t\tpublic bool forward_visible_cursor_position ();\n\t\tpublic bool forward_visible_cursor_positions (int count);\n\t\tpublic bool forward_visible_line ();\n\t\tpublic bool forward_visible_lines (int count);\n\t\tpublic bool forward_visible_word_end ();\n\t\tpublic bool forward_visible_word_ends (int count);\n\t\tpublic bool forward_word_end ();\n\t\tpublic bool forward_word_ends (int count);\n\t\tpublic void free ();\n\t\tpublic bool get_attributes (Gtk.TextAttributes values);\n\t\tpublic unowned Gtk.TextBuffer get_buffer ();\n\t\tpublic int get_bytes_in_line ();\n\t\tpublic unichar get_char ();\n\t\tpublic int get_chars_in_line ();\n\t\tpublic unowned Gtk.TextChildAnchor get_child_anchor ();\n\t\tpublic unowned Pango.Language get_language ();\n\t\tpublic int get_line ();\n\t\tpublic int get_line_index ();\n\t\tpublic int get_line_offset ();\n\t\tpublic GLib.SList<weak Gtk.TextMark> get_marks ();\n\t\tpublic int get_offset ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\tpublic unowned string get_slice (Gtk.TextIter end);\n\t\tpublic GLib.SList<weak Gtk.TextTag> get_tags ();\n\t\tpublic unowned string get_text (Gtk.TextIter end);\n\t\tpublic GLib.SList<weak Gtk.TextTag> get_toggled_tags (bool toggled_on);\n\t\tpublic int get_visible_line_index ();\n\t\tpublic int get_visible_line_offset ();\n\t\tpublic unowned string get_visible_slice (Gtk.TextIter end);\n\t\tpublic unowned string get_visible_text (Gtk.TextIter end);\n\t\tpublic bool has_tag (Gtk.TextTag tag);\n\t\tpublic bool in_range (Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic bool inside_sentence ();\n\t\tpublic bool inside_word ();\n\t\tpublic bool is_cursor_position ();\n\t\tpublic bool is_end ();\n\t\tpublic bool is_start ();\n\t\tpublic void order (Gtk.TextIter second);\n\t\tpublic void set_line (int line_number);\n\t\tpublic void set_line_index (int byte_on_line);\n\t\tpublic void set_line_offset (int char_on_line);\n\t\tpublic void set_offset (int char_offset);\n\t\tpublic void set_visible_line_index (int byte_on_line);\n\t\tpublic void set_visible_line_offset (int char_on_line);\n\t\tpublic bool starts_line ();\n\t\tpublic bool starts_sentence ();\n\t\tpublic bool starts_word ();\n\t\tpublic bool toggles_tag (Gtk.TextTag tag);\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct ToggleActionEntry {\n\t\tpublic weak string name;\n\t\tpublic weak string stock_id;\n\t\tpublic weak string label;\n\t\tpublic weak string accelerator;\n\t\tpublic weak string tooltip;\n\t\t[CCode (delegate_target = false, type = \"GCallback\")]\n\t\tpublic weak Gtk.ActionCallback callback;\n\t\tpublic bool is_active;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic struct TreeIter {\n\t\tpublic int stamp;\n\t\tpublic void* user_data;\n\t\tpublic void* user_data2;\n\t\tpublic void* user_data3;\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ACCEL_\")]\n\t[Flags]\n\tpublic enum AccelFlags {\n\t\tVISIBLE,\n\t\tLOCKED,\n\t\tMASK\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ALIGN_\")]\n\tpublic enum Align {\n\t\tFILL,\n\t\tSTART,\n\t\tEND,\n\t\tCENTER,\n\t\tBASELINE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_APPLICATION_INHIBIT_\")]\n\t[Flags]\n\tpublic enum ApplicationInhibitFlags {\n\t\tLOGOUT,\n\t\tSWITCH,\n\t\tSUSPEND,\n\t\tIDLE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ARROWS_\")]\n\tpublic enum ArrowPlacement {\n\t\tBOTH,\n\t\tSTART,\n\t\tEND\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ARROW_\")]\n\tpublic enum ArrowType {\n\t\tUP,\n\t\tDOWN,\n\t\tLEFT,\n\t\tRIGHT,\n\t\tNONE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ASSISTANT_PAGE_\")]\n\tpublic enum AssistantPageType {\n\t\tCONTENT,\n\t\tINTRO,\n\t\tCONFIRM,\n\t\tSUMMARY,\n\t\tPROGRESS,\n\t\tCUSTOM\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_\")]\n\t[Flags]\n\tpublic enum AttachOptions {\n\t\tEXPAND,\n\t\tSHRINK,\n\t\tFILL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_BASELINE_POSITION_\")]\n\tpublic enum BaselinePosition {\n\t\tTOP,\n\t\tCENTER,\n\t\tBOTTOM\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_BORDER_STYLE_\")]\n\tpublic enum BorderStyle {\n\t\tNONE,\n\t\tSOLID,\n\t\tINSET,\n\t\tOUTSET,\n\t\tHIDDEN,\n\t\tDOTTED,\n\t\tDASHED,\n\t\tDOUBLE,\n\t\tGROOVE,\n\t\tRIDGE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_BUTTONBOX_\")]\n\tpublic enum ButtonBoxStyle {\n\t\tSPREAD,\n\t\tEDGE,\n\t\tSTART,\n\t\tEND,\n\t\tCENTER\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_BUTTONS_\")]\n\tpublic enum ButtonsType {\n\t\tNONE,\n\t\tOK,\n\t\tCLOSE,\n\t\tCANCEL,\n\t\tYES_NO,\n\t\tOK_CANCEL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CALENDAR_\")]\n\t[Flags]\n\tpublic enum CalendarDisplayOptions {\n\t\tSHOW_HEADING,\n\t\tSHOW_DAY_NAMES,\n\t\tNO_MONTH_CHANGE,\n\t\tSHOW_WEEK_NUMBERS,\n\t\tSHOW_DETAILS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CELL_RENDERER_ACCEL_MODE_\")]\n\tpublic enum CellRendererAccelMode {\n\t\tGTK,\n\t\tOTHER,\n\t\tMODIFIER_TAP\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CELL_RENDERER_MODE_\")]\n\tpublic enum CellRendererMode {\n\t\tINERT,\n\t\tACTIVATABLE,\n\t\tEDITABLE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CELL_RENDERER_\")]\n\t[Flags]\n\tpublic enum CellRendererState {\n\t\tSELECTED,\n\t\tPRELIT,\n\t\tINSENSITIVE,\n\t\tSORTED,\n\t\tFOCUSED,\n\t\tEXPANDABLE,\n\t\tEXPANDED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CORNER_\")]\n\tpublic enum CornerType {\n\t\tTOP_LEFT,\n\t\tBOTTOM_LEFT,\n\t\tTOP_RIGHT,\n\t\tBOTTOM_RIGHT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CSS_PROVIDER_ERROR_\")]\n\tpublic enum CssProviderError {\n\t\tFAILED,\n\t\tSYNTAX,\n\t\tIMPORT,\n\t\tNAME,\n\t\tDEPRECATED,\n\t\tUNKNOWN_VALUE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_CSS_SECTION_\")]\n\tpublic enum CssSectionType {\n\t\tDOCUMENT,\n\t\tIMPORT,\n\t\tCOLOR_DEFINITION,\n\t\tBINDING_SET,\n\t\tRULESET,\n\t\tSELECTOR,\n\t\tDECLARATION,\n\t\tVALUE,\n\t\tKEYFRAMES\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_DEBUG_\")]\n\t[Flags]\n\tpublic enum DebugFlag {\n\t\tMISC,\n\t\tPLUGSOCKET,\n\t\tTEXT,\n\t\tTREE,\n\t\tUPDATES,\n\t\tKEYBINDINGS,\n\t\tMULTIHEAD,\n\t\tMODULES,\n\t\tGEOMETRY,\n\t\tICONTHEME,\n\t\tPRINTING,\n\t\tBUILDER,\n\t\tSIZE_REQUEST,\n\t\tNO_CSS_CACHE,\n\t\tBASELINES,\n\t\tPIXEL_CACHE,\n\t\tNO_PIXEL_CACHE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_DELETE_\")]\n\tpublic enum DeleteType {\n\t\tCHARS,\n\t\tWORD_ENDS,\n\t\tWORDS,\n\t\tDISPLAY_LINES,\n\t\tDISPLAY_LINE_ENDS,\n\t\tPARAGRAPH_ENDS,\n\t\tPARAGRAPHS,\n\t\tWHITESPACE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_DEST_DEFAULT_\")]\n\t[Flags]\n\tpublic enum DestDefaults {\n\t\tMOTION,\n\t\tHIGHLIGHT,\n\t\tDROP,\n\t\tALL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_DIALOG_\")]\n\t[Flags]\n\tpublic enum DialogFlags {\n\t\tMODAL,\n\t\tDESTROY_WITH_PARENT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_DIR_\")]\n\tpublic enum DirectionType {\n\t\tTAB_FORWARD,\n\t\tTAB_BACKWARD,\n\t\tUP,\n\t\tDOWN,\n\t\tLEFT,\n\t\tRIGHT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_DRAG_RESULT_\")]\n\tpublic enum DragResult {\n\t\tSUCCESS,\n\t\tNO_TARGET,\n\t\tUSER_CANCELLED,\n\t\tTIMEOUT_EXPIRED,\n\t\tGRAB_BROKEN,\n\t\tERROR\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ENTRY_ICON_\")]\n\tpublic enum EntryIconPosition {\n\t\tPRIMARY,\n\t\tSECONDARY\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_EXPANDER_\")]\n\tpublic enum ExpanderStyle {\n\t\tCOLLAPSED,\n\t\tSEMI_COLLAPSED,\n\t\tSEMI_EXPANDED,\n\t\tEXPANDED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_FILE_CHOOSER_ACTION_\")]\n\tpublic enum FileChooserAction {\n\t\tOPEN,\n\t\tSAVE,\n\t\tSELECT_FOLDER,\n\t\tCREATE_FOLDER\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_FILE_CHOOSER_CONFIRMATION_\")]\n\tpublic enum FileChooserConfirmation {\n\t\tCONFIRM,\n\t\tACCEPT_FILENAME,\n\t\tSELECT_AGAIN\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_FILE_CHOOSER_ERROR_\")]\n\tpublic enum FileChooserError {\n\t\tNONEXISTENT,\n\t\tBAD_FILENAME,\n\t\tALREADY_EXISTS,\n\t\tINCOMPLETE_HOSTNAME\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_FILE_FILTER_\")]\n\t[Flags]\n\tpublic enum FileFilterFlags {\n\t\tFILENAME,\n\t\tURI,\n\t\tDISPLAY_NAME,\n\t\tMIME_TYPE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_IM_PREEDIT_\")]\n\tpublic enum IMPreeditStyle {\n\t\tNOTHING,\n\t\tCALLBACK,\n\t\tNONE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_IM_STATUS_\")]\n\tpublic enum IMStatusStyle {\n\t\tNOTHING,\n\t\tCALLBACK,\n\t\tNONE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ICON_LOOKUP_\")]\n\t[Flags]\n\tpublic enum IconLookupFlags {\n\t\tNO_SVG,\n\t\tFORCE_SVG,\n\t\tUSE_BUILTIN,\n\t\tGENERIC_FALLBACK,\n\t\tFORCE_SIZE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ICON_SIZE_\")]\n\tpublic enum IconSize {\n\t\tINVALID,\n\t\tMENU,\n\t\tSMALL_TOOLBAR,\n\t\tLARGE_TOOLBAR,\n\t\tBUTTON,\n\t\tDND,\n\t\tDIALOG\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ICON_THEME_\")]\n\tpublic enum IconThemeError {\n\t\tNOT_FOUND,\n\t\tFAILED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ICON_VIEW_\")]\n\tpublic enum IconViewDropPosition {\n\t\tNO_DROP,\n\t\tDROP_INTO,\n\t\tDROP_LEFT,\n\t\tDROP_RIGHT,\n\t\tDROP_ABOVE,\n\t\tDROP_BELOW\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_IMAGE_\")]\n\tpublic enum ImageType {\n\t\tEMPTY,\n\t\tPIXBUF,\n\t\tSTOCK,\n\t\tICON_SET,\n\t\tANIMATION,\n\t\tICON_NAME,\n\t\tGICON,\n\t\tSURFACE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_INPUT_HINT_\")]\n\t[Flags]\n\tpublic enum InputHints {\n\t\tNONE,\n\t\tSPELLCHECK,\n\t\tNO_SPELLCHECK,\n\t\tWORD_COMPLETION,\n\t\tLOWERCASE,\n\t\tUPPERCASE_CHARS,\n\t\tUPPERCASE_WORDS,\n\t\tUPPERCASE_SENTENCES,\n\t\tINHIBIT_OSK\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_INPUT_PURPOSE_\")]\n\tpublic enum InputPurpose {\n\t\tFREE_FORM,\n\t\tALPHA,\n\t\tDIGITS,\n\t\tNUMBER,\n\t\tPHONE,\n\t\tURL,\n\t\tEMAIL,\n\t\tNAME,\n\t\tPASSWORD,\n\t\tPIN\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_JUNCTION_\")]\n\t[Flags]\n\tpublic enum JunctionSides {\n\t\tNONE,\n\t\tCORNER_TOPLEFT,\n\t\tCORNER_TOPRIGHT,\n\t\tCORNER_BOTTOMLEFT,\n\t\tCORNER_BOTTOMRIGHT,\n\t\tTOP,\n\t\tBOTTOM,\n\t\tLEFT,\n\t\tRIGHT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_JUSTIFY_\")]\n\tpublic enum Justification {\n\t\tLEFT,\n\t\tRIGHT,\n\t\tCENTER,\n\t\tFILL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_LEVEL_BAR_MODE_\")]\n\tpublic enum LevelBarMode {\n\t\tCONTINUOUS,\n\t\tDISCRETE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_LICENSE_\")]\n\tpublic enum License {\n\t\tUNKNOWN,\n\t\tCUSTOM,\n\t\tGPL_2_0,\n\t\tGPL_3_0,\n\t\tLGPL_2_1,\n\t\tLGPL_3_0,\n\t\tBSD,\n\t\tMIT_X11,\n\t\tARTISTIC\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_MENU_DIR_\")]\n\tpublic enum MenuDirectionType {\n\t\tPARENT,\n\t\tCHILD,\n\t\tNEXT,\n\t\tPREV\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_MESSAGE_\")]\n\tpublic enum MessageType {\n\t\tINFO,\n\t\tWARNING,\n\t\tQUESTION,\n\t\tERROR,\n\t\tOTHER\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_MOVEMENT_\")]\n\tpublic enum MovementStep {\n\t\tLOGICAL_POSITIONS,\n\t\tVISUAL_POSITIONS,\n\t\tWORDS,\n\t\tDISPLAY_LINES,\n\t\tDISPLAY_LINE_ENDS,\n\t\tPARAGRAPHS,\n\t\tPARAGRAPH_ENDS,\n\t\tPAGES,\n\t\tBUFFER_ENDS,\n\t\tHORIZONTAL_PAGES\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_NOTEBOOK_TAB_\")]\n\tpublic enum NotebookTab {\n\t\tFIRST,\n\t\tLAST\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_NUMBER_UP_LAYOUT_\")]\n\tpublic enum NumberUpLayout {\n\t\tLEFT_TO_RIGHT_TOP_TO_BOTTOM,\n\t\tLEFT_TO_RIGHT_BOTTOM_TO_TOP,\n\t\tRIGHT_TO_LEFT_TOP_TO_BOTTOM,\n\t\tRIGHT_TO_LEFT_BOTTOM_TO_TOP,\n\t\tTOP_TO_BOTTOM_LEFT_TO_RIGHT,\n\t\tTOP_TO_BOTTOM_RIGHT_TO_LEFT,\n\t\tBOTTOM_TO_TOP_LEFT_TO_RIGHT,\n\t\tBOTTOM_TO_TOP_RIGHT_TO_LEFT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_ORIENTATION_\")]\n\tpublic enum Orientation {\n\t\tHORIZONTAL,\n\t\tVERTICAL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PACK_DIRECTION_\")]\n\tpublic enum PackDirection {\n\t\tLTR,\n\t\tRTL,\n\t\tTTB,\n\t\tBTT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PACK_\")]\n\tpublic enum PackType {\n\t\tSTART,\n\t\tEND\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PAGE_ORIENTATION_\")]\n\tpublic enum PageOrientation {\n\t\tPORTRAIT,\n\t\tLANDSCAPE,\n\t\tREVERSE_PORTRAIT,\n\t\tREVERSE_LANDSCAPE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PAGE_SET_\")]\n\tpublic enum PageSet {\n\t\tALL,\n\t\tEVEN,\n\t\tODD\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PATH_PRIO_\")]\n\tpublic enum PathPriorityType {\n\t\tLOWEST,\n\t\tGTK,\n\t\tAPPLICATION,\n\t\tTHEME,\n\t\tRC,\n\t\tHIGHEST\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PATH_\")]\n\tpublic enum PathType {\n\t\tWIDGET,\n\t\tWIDGET_CLASS,\n\t\tCLASS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PLACES_OPEN_\")]\n\t[Flags]\n\tpublic enum PlacesOpenFlags {\n\t\tNORMAL,\n\t\tNEW_TAB,\n\t\tNEW_WINDOW\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_POLICY_\")]\n\tpublic enum PolicyType {\n\t\tALWAYS,\n\t\tAUTOMATIC,\n\t\tNEVER\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_POS_\")]\n\tpublic enum PositionType {\n\t\tLEFT,\n\t\tRIGHT,\n\t\tTOP,\n\t\tBOTTOM\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_DUPLEX_\")]\n\tpublic enum PrintDuplex {\n\t\tSIMPLEX,\n\t\tHORIZONTAL,\n\t\tVERTICAL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_ERROR_\")]\n\tpublic enum PrintError {\n\t\tGENERAL,\n\t\tINTERNAL_ERROR,\n\t\tNOMEM,\n\t\tINVALID_FILE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_OPERATION_ACTION_\")]\n\tpublic enum PrintOperationAction {\n\t\tPRINT_DIALOG,\n\t\tPRINT,\n\t\tPREVIEW,\n\t\tEXPORT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_OPERATION_RESULT_\")]\n\tpublic enum PrintOperationResult {\n\t\tERROR,\n\t\tAPPLY,\n\t\tCANCEL,\n\t\tIN_PROGRESS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_PAGES_\")]\n\tpublic enum PrintPages {\n\t\tALL,\n\t\tCURRENT,\n\t\tRANGES,\n\t\tSELECTION\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_QUALITY_\")]\n\tpublic enum PrintQuality {\n\t\tLOW,\n\t\tNORMAL,\n\t\tHIGH,\n\t\tDRAFT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_PRINT_STATUS_\")]\n\tpublic enum PrintStatus {\n\t\tINITIAL,\n\t\tPREPARING,\n\t\tGENERATING_DATA,\n\t\tSENDING_DATA,\n\t\tPENDING,\n\t\tPENDING_ISSUE,\n\t\tPRINTING,\n\t\tFINISHED,\n\t\tFINISHED_ABORTED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RC_\")]\n\t[Flags]\n\tpublic enum RcFlags {\n\t\tFG,\n\t\tBG,\n\t\tTEXT,\n\t\tBASE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RC_TOKEN_\")]\n\tpublic enum RcTokenType {\n\t\tINVALID,\n\t\tINCLUDE,\n\t\tNORMAL,\n\t\tACTIVE,\n\t\tPRELIGHT,\n\t\tSELECTED,\n\t\tINSENSITIVE,\n\t\tFG,\n\t\tBG,\n\t\tTEXT,\n\t\tBASE,\n\t\tXTHICKNESS,\n\t\tYTHICKNESS,\n\t\tFONT,\n\t\tFONTSET,\n\t\tFONT_NAME,\n\t\tBG_PIXMAP,\n\t\tPIXMAP_PATH,\n\t\tSTYLE,\n\t\tBINDING,\n\t\tBIND,\n\t\tWIDGET,\n\t\tWIDGET_CLASS,\n\t\tCLASS,\n\t\tLOWEST,\n\t\tGTK,\n\t\tAPPLICATION,\n\t\tTHEME,\n\t\tRC,\n\t\tHIGHEST,\n\t\tENGINE,\n\t\tMODULE_PATH,\n\t\tIM_MODULE_PATH,\n\t\tIM_MODULE_FILE,\n\t\tSTOCK,\n\t\tLTR,\n\t\tRTL,\n\t\tCOLOR,\n\t\tUNBIND,\n\t\tLAST\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RECENT_CHOOSER_ERROR_\")]\n\tpublic enum RecentChooserError {\n\t\tNOT_FOUND,\n\t\tINVALID_URI\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RECENT_FILTER_\")]\n\t[Flags]\n\tpublic enum RecentFilterFlags {\n\t\tURI,\n\t\tDISPLAY_NAME,\n\t\tMIME_TYPE,\n\t\tAPPLICATION,\n\t\tGROUP,\n\t\tAGE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RECENT_MANAGER_ERROR_\")]\n\tpublic enum RecentManagerError {\n\t\tNOT_FOUND,\n\t\tINVALID_URI,\n\t\tINVALID_ENCODING,\n\t\tNOT_REGISTERED,\n\t\tREAD,\n\t\tWRITE,\n\t\tUNKNOWN\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RECENT_SORT_\")]\n\tpublic enum RecentSortType {\n\t\tNONE,\n\t\tMRU,\n\t\tLRU,\n\t\tCUSTOM\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_REGION_\")]\n\t[Flags]\n\tpublic enum RegionFlags {\n\t\tEVEN,\n\t\tODD,\n\t\tFIRST,\n\t\tLAST,\n\t\tONLY,\n\t\tSORTED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RELIEF_\")]\n\tpublic enum ReliefStyle {\n\t\tNORMAL,\n\t\tHALF,\n\t\tNONE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RESIZE_\")]\n\tpublic enum ResizeMode {\n\t\tPARENT,\n\t\tQUEUE,\n\t\t[Deprecated]\n\t\tIMMEDIATE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_RESPONSE_\")]\n\tpublic enum ResponseType {\n\t\tNONE,\n\t\tREJECT,\n\t\tACCEPT,\n\t\tDELETE_EVENT,\n\t\tOK,\n\t\tCANCEL,\n\t\tCLOSE,\n\t\tYES,\n\t\tNO,\n\t\tAPPLY,\n\t\tHELP\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_REVEALER_TRANSITION_TYPE_\")]\n\tpublic enum RevealerTransitionType {\n\t\tNONE,\n\t\tCROSSFADE,\n\t\tSLIDE_RIGHT,\n\t\tSLIDE_LEFT,\n\t\tSLIDE_UP,\n\t\tSLIDE_DOWN\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SCROLL_\")]\n\tpublic enum ScrollStep {\n\t\tSTEPS,\n\t\tPAGES,\n\t\tENDS,\n\t\tHORIZONTAL_STEPS,\n\t\tHORIZONTAL_PAGES,\n\t\tHORIZONTAL_ENDS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SCROLL_\")]\n\tpublic enum ScrollType {\n\t\tNONE,\n\t\tJUMP,\n\t\tSTEP_BACKWARD,\n\t\tSTEP_FORWARD,\n\t\tPAGE_BACKWARD,\n\t\tPAGE_FORWARD,\n\t\tSTEP_UP,\n\t\tSTEP_DOWN,\n\t\tPAGE_UP,\n\t\tPAGE_DOWN,\n\t\tSTEP_LEFT,\n\t\tSTEP_RIGHT,\n\t\tPAGE_LEFT,\n\t\tPAGE_RIGHT,\n\t\tSTART,\n\t\tEND\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SCROLL_\")]\n\tpublic enum ScrollablePolicy {\n\t\tMINIMUM,\n\t\tNATURAL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SELECTION_\")]\n\tpublic enum SelectionMode {\n\t\tNONE,\n\t\tSINGLE,\n\t\tBROWSE,\n\t\tMULTIPLE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SENSITIVITY_\")]\n\tpublic enum SensitivityType {\n\t\tAUTO,\n\t\tON,\n\t\tOFF\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SHADOW_\")]\n\tpublic enum ShadowType {\n\t\tNONE,\n\t\tIN,\n\t\tOUT,\n\t\tETCHED_IN,\n\t\tETCHED_OUT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SIZE_GROUP_\")]\n\tpublic enum SizeGroupMode {\n\t\tNONE,\n\t\tHORIZONTAL,\n\t\tVERTICAL,\n\t\tBOTH\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SIZE_REQUEST_\")]\n\tpublic enum SizeRequestMode {\n\t\tHEIGHT_FOR_WIDTH,\n\t\tWIDTH_FOR_HEIGHT,\n\t\tCONSTANT_SIZE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cname = \"gint\")]\n\tpublic enum SortColumn {\n\t\t[CCode (cname = \"GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID\")]\n\t\tDEFAULT,\n\t\t[CCode (cname = \"GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID\")]\n\t\tUNSORTED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SORT_\")]\n\tpublic enum SortType {\n\t\tASCENDING,\n\t\tDESCENDING\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_UPDATE_\")]\n\tpublic enum SpinButtonUpdatePolicy {\n\t\tALWAYS,\n\t\tIF_VALID\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_SPIN_\")]\n\tpublic enum SpinType {\n\t\tSTEP_FORWARD,\n\t\tSTEP_BACKWARD,\n\t\tPAGE_FORWARD,\n\t\tPAGE_BACKWARD,\n\t\tHOME,\n\t\tEND,\n\t\tUSER_DEFINED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_STACK_TRANSITION_TYPE_\")]\n\tpublic enum StackTransitionType {\n\t\tNONE,\n\t\tCROSSFADE,\n\t\tSLIDE_RIGHT,\n\t\tSLIDE_LEFT,\n\t\tSLIDE_UP,\n\t\tSLIDE_DOWN,\n\t\tSLIDE_LEFT_RIGHT,\n\t\tSLIDE_UP_DOWN\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_STATE_FLAG_\")]\n\t[Flags]\n\tpublic enum StateFlags {\n\t\tNORMAL,\n\t\tACTIVE,\n\t\tPRELIGHT,\n\t\tSELECTED,\n\t\tINSENSITIVE,\n\t\tINCONSISTENT,\n\t\tFOCUSED,\n\t\tBACKDROP,\n\t\tDIR_LTR,\n\t\tDIR_RTL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_STATE_\")]\n\tpublic enum StateType {\n\t\tNORMAL,\n\t\tACTIVE,\n\t\tPRELIGHT,\n\t\tSELECTED,\n\t\tINSENSITIVE,\n\t\tINCONSISTENT,\n\t\tFOCUSED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TARGET_\")]\n\t[Flags]\n\tpublic enum TargetFlags {\n\t\tSAME_APP,\n\t\tSAME_WIDGET,\n\t\tOTHER_APP,\n\t\tOTHER_WIDGET\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TEXT_BUFFER_TARGET_INFO_\")]\n\tpublic enum TextBufferTargetInfo {\n\t\tBUFFER_CONTENTS,\n\t\tRICH_TEXT,\n\t\tTEXT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TEXT_DIR_\")]\n\tpublic enum TextDirection {\n\t\tNONE,\n\t\tLTR,\n\t\tRTL\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TEXT_SEARCH_\")]\n\t[Flags]\n\tpublic enum TextSearchFlags {\n\t\tVISIBLE_ONLY,\n\t\tTEXT_ONLY,\n\t\tCASE_INSENSITIVE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TEXT_WINDOW_\")]\n\tpublic enum TextWindowType {\n\t\tPRIVATE,\n\t\tWIDGET,\n\t\tTEXT,\n\t\tLEFT,\n\t\tRIGHT,\n\t\tTOP,\n\t\tBOTTOM\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TOOL_PALETTE_DRAG_\")]\n\t[Flags]\n\tpublic enum ToolPaletteDragTargets {\n\t\tITEMS,\n\t\tGROUPS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TOOLBAR_SPACE_\")]\n\tpublic enum ToolbarSpaceStyle {\n\t\tEMPTY,\n\t\tLINE\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TOOLBAR_\")]\n\tpublic enum ToolbarStyle {\n\t\tICONS,\n\t\tTEXT,\n\t\tBOTH,\n\t\tBOTH_HORIZ\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TREE_MODEL_\")]\n\t[Flags]\n\tpublic enum TreeModelFlags {\n\t\tITERS_PERSIST,\n\t\tLIST_ONLY\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TREE_VIEW_COLUMN_\")]\n\tpublic enum TreeViewColumnSizing {\n\t\tGROW_ONLY,\n\t\tAUTOSIZE,\n\t\tFIXED\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TREE_VIEW_DROP_\")]\n\tpublic enum TreeViewDropPosition {\n\t\tBEFORE,\n\t\tAFTER,\n\t\tINTO_OR_BEFORE,\n\t\tINTO_OR_AFTER\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_TREE_VIEW_GRID_LINES_\")]\n\tpublic enum TreeViewGridLines {\n\t\tNONE,\n\t\tHORIZONTAL,\n\t\tVERTICAL,\n\t\tBOTH\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_UI_MANAGER_\")]\n\t[Flags]\n\tpublic enum UIManagerItemType {\n\t\tAUTO,\n\t\tMENUBAR,\n\t\tMENU,\n\t\tTOOLBAR,\n\t\tPLACEHOLDER,\n\t\tPOPUP,\n\t\tMENUITEM,\n\t\tTOOLITEM,\n\t\tSEPARATOR,\n\t\tACCELERATOR,\n\t\tPOPUP_WITH_ACCELS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_UNIT_\")]\n\tpublic enum Unit {\n\t\tNONE,\n\t\tPOINTS,\n\t\tINCH,\n\t\tMM\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_WIDGET_HELP_\")]\n\tpublic enum WidgetHelpType {\n\t\tTOOLTIP,\n\t\tWHATS_THIS\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_WIN_POS_\")]\n\tpublic enum WindowPosition {\n\t\tNONE,\n\t\tCENTER,\n\t\tMOUSE,\n\t\tCENTER_ALWAYS,\n\t\tCENTER_ON_PARENT\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_WINDOW_\")]\n\tpublic enum WindowType {\n\t\tTOPLEVEL,\n\t\tPOPUP\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_WRAP_\")]\n\tpublic enum WrapMode {\n\t\tNONE,\n\t\tCHAR,\n\t\tWORD,\n\t\tWORD_CHAR\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\", cprefix = \"GTK_BUILDER_ERROR_\")]\n\tpublic errordomain BuilderError {\n\t\tINVALID_TYPE_FUNCTION,\n\t\tUNHANDLED_TAG,\n\t\tMISSING_ATTRIBUTE,\n\t\tINVALID_ATTRIBUTE,\n\t\tINVALID_TAG,\n\t\tMISSING_PROPERTY_VALUE,\n\t\tINVALID_VALUE,\n\t\tVERSION_MISMATCH,\n\t\tDUPLICATE_ID,\n\t\tOBJECT_TYPE_REFUSED,\n\t\tTEMPLATE_MISMATCH\n\t}\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool AccelGroupActivate (Gtk.AccelGroup accel_group, GLib.Object acceleratable, uint keyval, Gdk.ModifierType modifier);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool AccelGroupFindFunc (Gtk.AccelKey key, GLib.Closure closure);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void AccelMapForeach (void* data, string accel_path, uint accel_key, Gdk.ModifierType accel_mods, bool changed);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ActionCallback (Gtk.Action action);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate int AssistantPageFunc (int current_page);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void BuilderConnectFunc (Gtk.Builder builder, GLib.Object object, string signal_name, string handler_name, GLib.Object? connect_object, GLib.ConnectFlags flags);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate string CalendarDetailFunc (Gtk.Calendar calendar, uint year, uint month, uint day);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void Callback (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool CellAllocCallback (Gtk.CellRenderer renderer, Gdk.Rectangle cell_area, Gdk.Rectangle cell_background);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool CellCallback (Gtk.CellRenderer renderer);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void CellLayoutDataFunc (Gtk.CellLayout cell_layout, Gtk.CellRenderer cell, Gtk.TreeModel tree_model, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void ClipboardClearFunc (Gtk.Clipboard clipboard, void* user_data_or_owner);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void ClipboardGetFunc (Gtk.Clipboard clipboard, Gtk.SelectionData selection_data, uint info, void* user_data_or_owner);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ClipboardImageReceivedFunc (Gtk.Clipboard clipboard, Gdk.Pixbuf pixbuf);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ClipboardReceivedFunc (Gtk.Clipboard clipboard, Gtk.SelectionData selection_data);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ClipboardRichTextReceivedFunc (Gtk.Clipboard clipboard, Gdk.Atom format, [CCode (array_length_type = \"gsize\")] uint8[] text);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ClipboardTargetsReceivedFunc (Gtk.Clipboard clipboard, Gdk.Atom[] atoms);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ClipboardTextReceivedFunc (Gtk.Clipboard clipboard, string? text);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ClipboardURIReceivedFunc (Gtk.Clipboard clipboard, [CCode (array_length = false, array_null_terminated = true)] string[] uris);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void ColorSelectionChangePaletteFunc (Gdk.Color colors, int n_colors);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void ColorSelectionChangePaletteWithScreenFunc (Gdk.Screen screen, Gdk.Color colors, int n_colors);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool EntryCompletionMatchFunc (Gtk.EntryCompletion completion, string key, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool FileFilterFunc (Gtk.FileFilterInfo filter_info);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool FontFilterFunc (Pango.FontFamily family, Pango.FontFace face);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void IconViewForeachFunc (Gtk.IconView icon_view, Gtk.TreePath path);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate int KeySnoopFunc (Gtk.Widget grab_widget, Gdk.EventKey event, void* func_data);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool ListBoxFilterFunc (Gtk.ListBoxRow row);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate int ListBoxSortFunc (Gtk.ListBoxRow row1, Gtk.ListBoxRow row2);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void ListBoxUpdateHeaderFunc (Gtk.ListBoxRow row, Gtk.ListBoxRow before);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void MenuDetachFunc (Gtk.Widget attach_widget, Gtk.Menu menu);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void MenuPositionFunc (Gtk.Menu menu, out int x, out int y, out bool push_in);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void ModuleDisplayInitFunc (Gdk.Display display);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate void ModuleInitFunc (int argc, string argv);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void PageSetupDoneFunc (Gtk.PageSetup page_setup);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void PrintSettingsFunc (string key, string value);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void RadioActionCallback (Gtk.Action action, Gtk.Action current);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate bool RcPropertyParser (GLib.ParamSpec pspec, GLib.StringBuilder rc_string, GLib.Value property_value);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool RecentFilterFunc (Gtk.RecentFilterInfo filter_info);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate int RecentSortFunc (Gtk.RecentInfo a, Gtk.RecentInfo b);\n\t[CCode (cheader_filename = \"gtk/gtk.h\", has_target = false)]\n\tpublic delegate bool StylePropertyParser (string str, GLib.Value value) throws GLib.Error;\n\t[CCode (cheader_filename = \"gtk/gtk.h\", instance_pos = 5.9)]\n\tpublic delegate bool TextBufferDeserializeFunc (Gtk.TextBuffer register_buffer, Gtk.TextBuffer content_buffer, Gtk.TextIter iter, [CCode (array_length_type = \"gsize\")] uint8[] data, bool create_tags) throws GLib.Error;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate uchar TextBufferSerializeFunc (Gtk.TextBuffer register_buffer, Gtk.TextBuffer content_buffer, Gtk.TextIter start, Gtk.TextIter end, size_t length);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TextCharPredicate (unichar ch);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TextTagTableForeach (Gtk.TextTag tag);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TickCallback (Gtk.Widget widget, Gdk.FrameClock frame_clock);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate unowned string TranslateFunc (string path);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TreeCellDataFunc (Gtk.TreeViewColumn tree_column, Gtk.CellRenderer cell, Gtk.TreeModel tree_model, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TreeDestroyCountFunc (Gtk.TreeView tree_view, Gtk.TreePath path, int children);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate int TreeIterCompareFunc (Gtk.TreeModel model, Gtk.TreeIter a, Gtk.TreeIter b);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TreeModelFilterModifyFunc (Gtk.TreeModel model, Gtk.TreeIter iter, GLib.Value value, int column);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TreeModelFilterVisibleFunc (Gtk.TreeModel model, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TreeModelForeachFunc (Gtk.TreeModel model, Gtk.TreePath path, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TreeSelectionForeachFunc (Gtk.TreeModel model, Gtk.TreePath path, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TreeSelectionFunc (Gtk.TreeSelection selection, Gtk.TreeModel model, Gtk.TreePath path, bool path_currently_selected);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TreeViewColumnDropFunc (Gtk.TreeView tree_view, Gtk.TreeViewColumn column, Gtk.TreeViewColumn prev_column, Gtk.TreeViewColumn next_column);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TreeViewMappingFunc (Gtk.TreeView tree_view, Gtk.TreePath path);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TreeViewRowSeparatorFunc (Gtk.TreeModel model, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate bool TreeViewSearchEqualFunc (Gtk.TreeModel model, int column, string key, Gtk.TreeIter iter);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic delegate void TreeViewSearchPositionFunc (Gtk.TreeView tree_view, Gtk.Widget search_dialog);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int BINARY_AGE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int INPUT_ERROR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int INTERFACE_AGE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string LEVEL_BAR_OFFSET_HIGH;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string LEVEL_BAR_OFFSET_LOW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int MAJOR_VERSION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int MAX_COMPOSE_LEN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int MICRO_VERSION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int MINOR_VERSION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_A3;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_A4;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_A5;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_B5;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_EXECUTIVE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_LEGAL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PAPER_NAME_LETTER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int PATH_PRIO_MASK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_COLLATE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_DEFAULT_SOURCE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_DITHER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_DUPLEX;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_FINISHINGS;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_MEDIA_TYPE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_NUMBER_UP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_NUMBER_UP_LAYOUT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_N_COPIES;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_ORIENTATION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_OUTPUT_BASENAME;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_OUTPUT_BIN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_OUTPUT_DIR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_OUTPUT_FILE_FORMAT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_OUTPUT_URI;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PAGE_RANGES;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PAGE_SET;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PAPER_FORMAT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PAPER_HEIGHT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PAPER_WIDTH;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PRINTER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PRINTER_LPI;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_PRINT_PAGES;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_QUALITY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_RESOLUTION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_RESOLUTION_X;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_RESOLUTION_Y;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_REVERSE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_SCALE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_USE_COLOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_WIN32_DRIVER_EXTRA;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string PRINT_SETTINGS_WIN32_DRIVER_VERSION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int PRIORITY_RESIZE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ABOUT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ABOUT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ADD\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ADD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.APPLY\", since = \"vala-0.12\")]\n\tpublic const string STOCK_APPLY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.BOLD\", since = \"vala-0.12\")]\n\tpublic const string STOCK_BOLD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CANCEL\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CANCEL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CAPS_LOCK_WARNING\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CAPS_LOCK_WARNING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CDROM\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CDROM;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CLEAR\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CLEAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CLOSE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CLOSE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.COLOR_PICKER\", since = \"vala-0.12\")]\n\tpublic const string STOCK_COLOR_PICKER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CONNECT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CONNECT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CONVERT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CONVERT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.COPY\", since = \"vala-0.12\")]\n\tpublic const string STOCK_COPY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.CUT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_CUT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DELETE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DELETE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DIALOG_AUTHENTICATION\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DIALOG_AUTHENTICATION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DIALOG_ERROR\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DIALOG_ERROR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DIALOG_INFO\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DIALOG_INFO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DIALOG_QUESTION\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DIALOG_QUESTION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DIALOG_WARNING\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DIALOG_WARNING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DIRECTORY\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DIRECTORY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DISCARD\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DISCARD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DISCONNECT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DISCONNECT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DND\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DND;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.DND_MULTIPLE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_DND_MULTIPLE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.EDIT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_EDIT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.EXECUTE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_EXECUTE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.FILE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_FILE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.FIND\", since = \"vala-0.12\")]\n\tpublic const string STOCK_FIND;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.FIND_AND_REPLACE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_FIND_AND_REPLACE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.FLOPPY\", since = \"vala-0.12\")]\n\tpublic const string STOCK_FLOPPY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.FULLSCREEN\", since = \"vala-0.12\")]\n\tpublic const string STOCK_FULLSCREEN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GOTO_BOTTOM\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GOTO_BOTTOM;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GOTO_FIRST\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GOTO_FIRST;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GOTO_LAST\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GOTO_LAST;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GOTO_TOP\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GOTO_TOP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GO_BACK\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GO_BACK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GO_DOWN\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GO_DOWN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GO_FORWARD\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GO_FORWARD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.GO_UP\", since = \"vala-0.12\")]\n\tpublic const string STOCK_GO_UP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.HARDDISK\", since = \"vala-0.12\")]\n\tpublic const string STOCK_HARDDISK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.HELP\", since = \"vala-0.12\")]\n\tpublic const string STOCK_HELP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.HOME\", since = \"vala-0.12\")]\n\tpublic const string STOCK_HOME;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.INDENT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_INDENT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.INDEX\", since = \"vala-0.12\")]\n\tpublic const string STOCK_INDEX;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.INFO\", since = \"vala-0.12\")]\n\tpublic const string STOCK_INFO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ITALIC\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ITALIC;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.JUMP_TO\", since = \"vala-0.12\")]\n\tpublic const string STOCK_JUMP_TO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.JUSTIFY_CENTER\", since = \"vala-0.12\")]\n\tpublic const string STOCK_JUSTIFY_CENTER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.JUSTIFY_FILL\", since = \"vala-0.12\")]\n\tpublic const string STOCK_JUSTIFY_FILL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.JUSTIFY_LEFT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_JUSTIFY_LEFT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.JUSTIFY_RIGHT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_JUSTIFY_RIGHT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.FULLSCREEN\", since = \"vala-0.12\")]\n\tpublic const string STOCK_LEAVE_FULLSCREEN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_FORWARD\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_FORWARD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_NEXT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_NEXT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_PAUSE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_PAUSE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_PLAY\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_PLAY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_PREVIOUS\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_PREVIOUS;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_RECORD\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_RECORD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_REWIND\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_REWIND;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MEDIA_STOP\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MEDIA_STOP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.MISSING_IMAGE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_MISSING_IMAGE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.NETWORK\", since = \"vala-0.12\")]\n\tpublic const string STOCK_NETWORK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.NEW\", since = \"vala-0.12\")]\n\tpublic const string STOCK_NEW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.NO\", since = \"vala-0.12\")]\n\tpublic const string STOCK_NO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.OK\", since = \"vala-0.12\")]\n\tpublic const string STOCK_OK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.OPEN\", since = \"vala-0.12\")]\n\tpublic const string STOCK_OPEN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ORIENTATION_LANDSCAPE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ORIENTATION_LANDSCAPE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ORIENTATION_PORTRAIT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ORIENTATION_PORTRAIT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ORIENTATION_REVERSE_LANDSCAPE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ORIENTATION_REVERSE_LANDSCAPE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ORIENTATION_REVERSE_PORTRAIT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ORIENTATION_REVERSE_PORTRAIT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PAGE_SETUP\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PAGE_SETUP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PASTE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PASTE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PREFERENCES\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PREFERENCES;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PRINT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PRINT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PRINT_ERROR\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PRINT_ERROR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PRINT_PAUSED\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PRINT_PAUSED;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PRINT_PREVIEW\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PRINT_PREVIEW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PRINT_REPORT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PRINT_REPORT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PRINT_WARNING\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PRINT_WARNING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.PROPERTIES\", since = \"vala-0.12\")]\n\tpublic const string STOCK_PROPERTIES;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.QUIT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_QUIT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.REDO\", since = \"vala-0.12\")]\n\tpublic const string STOCK_REDO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.REFRESH\", since = \"vala-0.12\")]\n\tpublic const string STOCK_REFRESH;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.REMOVE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_REMOVE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.REVERT_TO_SAVED\", since = \"vala-0.12\")]\n\tpublic const string STOCK_REVERT_TO_SAVED;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SAVE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SAVE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SAVE_AS\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SAVE_AS;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SELECT_ALL\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SELECT_ALL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SELECT_COLOR\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SELECT_COLOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SELECT_FONT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SELECT_FONT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SORT_ASCENDING\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SORT_ASCENDING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SORT_DESCENDING\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SORT_DESCENDING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.SPELL_CHECK\", since = \"vala-0.12\")]\n\tpublic const string STOCK_SPELL_CHECK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.STOP\", since = \"vala-0.12\")]\n\tpublic const string STOCK_STOP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.STRIKETHROUGH\", since = \"vala-0.12\")]\n\tpublic const string STOCK_STRIKETHROUGH;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.UNDELETE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_UNDELETE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.UNDERLINE\", since = \"vala-0.12\")]\n\tpublic const string STOCK_UNDERLINE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.UNDO\", since = \"vala-0.12\")]\n\tpublic const string STOCK_UNDO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.UNINDENT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_UNINDENT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.YES\", since = \"vala-0.12\")]\n\tpublic const string STOCK_YES;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ZOOM_100\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ZOOM_100;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ZOOM_FIT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ZOOM_FIT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ZOOM_IN\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ZOOM_IN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.ZOOM_OUT\", since = \"vala-0.12\")]\n\tpublic const string STOCK_ZOOM_OUT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_ACCELERATOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_ARROW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_BACKGROUND;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_BOTTOM;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_BUTTON;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_CALENDAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_CELL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_CHECK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_COMBOBOX_ENTRY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_CONTEXT_MENU;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_CURSOR_HANDLE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_DEFAULT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_DIM_LABEL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_DND;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_DOCK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_ENTRY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_ERROR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_EXPANDER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_FRAME;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_GRIP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_HEADER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_HIGHLIGHT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_HORIZONTAL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_IMAGE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_INFO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_INLINE_TOOLBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_INSERTION_CURSOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_LEFT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_LEVEL_BAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_LINKED;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_LIST;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_LIST_ROW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_MARK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_MENU;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_MENUBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_MENUITEM;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_NOTEBOOK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_OSD;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_PANE_SEPARATOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_PRIMARY_TOOLBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_PROGRESSBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_PULSE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_QUESTION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_RADIO;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_RAISED;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_READ_ONLY;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_RIGHT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_RUBBERBAND;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SCALE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SCALE_HAS_MARKS_ABOVE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SCALE_HAS_MARKS_BELOW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SCROLLBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SCROLLBARS_JUNCTION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SEPARATOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SIDEBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SLIDER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SPINBUTTON;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_SPINNER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_TITLEBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_TOOLBAR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_TOOLTIP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_TOP;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_TROUGH;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_VERTICAL;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_VIEW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_CLASS_WARNING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_BACKGROUND_COLOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_BACKGROUND_IMAGE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_BORDER_COLOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_BORDER_RADIUS;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_BORDER_STYLE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_BORDER_WIDTH;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_COLOR;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_FONT;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_MARGIN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_PROPERTY_PADDING;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int STYLE_PROVIDER_PRIORITY_APPLICATION;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int STYLE_PROVIDER_PRIORITY_FALLBACK;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int STYLE_PROVIDER_PRIORITY_SETTINGS;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int STYLE_PROVIDER_PRIORITY_THEME;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int STYLE_PROVIDER_PRIORITY_USER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_REGION_COLUMN;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_REGION_COLUMN_HEADER;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_REGION_ROW;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const string STYLE_REGION_TAB;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic const int TEXT_VIEW_PRIORITY_VALIDATE;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool accel_groups_activate (GLib.Object object, uint accel_key, Gdk.ModifierType accel_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned GLib.SList<Gtk.AccelGroup> accel_groups_from_object (GLib.Object object);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static Gdk.ModifierType accelerator_get_default_mod_mask ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string accelerator_get_label (uint accelerator_key, Gdk.ModifierType accelerator_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string accelerator_get_label_with_keycode (Gdk.Display display, uint accelerator_key, uint keycode, Gdk.ModifierType accelerator_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string accelerator_name (uint accelerator_key, Gdk.ModifierType accelerator_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string accelerator_name_with_keycode (Gdk.Display display, uint accelerator_key, uint keycode, Gdk.ModifierType accelerator_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void accelerator_parse (string accelerator, out uint accelerator_key, out Gdk.ModifierType accelerator_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void accelerator_parse_with_keycode (string accelerator, uint accelerator_key, uint accelerator_codes, Gdk.ModifierType accelerator_mods);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void accelerator_set_default_mod_mask (Gdk.ModifierType default_mod_mask);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool accelerator_valid (uint keyval, Gdk.ModifierType modifiers);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool alternative_dialog_button_order (Gdk.Screen screen);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool bindings_activate (GLib.Object object, uint keyval, Gdk.ModifierType modifiers);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool bindings_activate_event (GLib.Object object, Gdk.EventKey event);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool cairo_should_draw_window (Cairo.Context cr, Gdk.Window window);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void cairo_transform_to_window (Cairo.Context cr, Gtk.Widget widget, Gdk.Window window);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string check_version (uint required_major, uint required_minor, uint required_micro);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void device_grab_add (Gtk.Widget widget, Gdk.Device device, bool block_others);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void device_grab_remove (Gtk.Widget widget, Gdk.Device device);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void disable_setlocale ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static int distribute_natural_allocation (int extra_space, uint n_requested_sizes, Gtk.RequestedSize sizes);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gdk.DragContext drag_begin (Gtk.Widget widget, Gtk.TargetList targets, Gdk.DragAction actions, int button, Gdk.Event? event);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gdk.DragContext drag_begin_with_coordinates (Gtk.Widget widget, Gtk.TargetList targets, Gdk.DragAction actions, int button, Gdk.Event event, int x, int y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool drag_check_threshold (Gtk.Widget widget, int start_x, int start_y, int current_x, int current_y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_add_image_targets (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_add_text_targets (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_add_uri_targets (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static Gdk.Atom drag_dest_find_target (Gtk.Widget widget, Gdk.DragContext context, Gtk.TargetList target_list);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.TargetList drag_dest_get_target_list (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool drag_dest_get_track_motion (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_set (Gtk.Widget widget, Gtk.DestDefaults flags, Gtk.TargetEntry[] targets, Gdk.DragAction actions);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_set_proxy (Gtk.Widget widget, Gdk.Window proxy_window, Gdk.DragProtocol protocol, bool use_coordinates);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_set_target_list (Gtk.Widget widget, Gtk.TargetList target_list);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_set_track_motion (Gtk.Widget widget, bool track_motion);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_dest_unset (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_finish (Gdk.DragContext context, bool success, bool del, uint32 time_);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_get_data (Gtk.Widget widget, Gdk.DragContext context, Gdk.Atom target, uint32 time_);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget drag_get_source_widget (Gdk.DragContext context);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_highlight (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_default (Gdk.DragContext context);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_gicon (Gdk.DragContext context, GLib.Icon icon, int hot_x, int hot_y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_name (Gdk.DragContext context, string icon_name, int hot_x, int hot_y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_pixbuf (Gdk.DragContext context, Gdk.Pixbuf pixbuf, int hot_x, int hot_y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_stock (Gdk.DragContext context, string stock_id, int hot_x, int hot_y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_surface (Gdk.DragContext context, Cairo.Surface surface);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_set_icon_widget (Gdk.DragContext context, Gtk.Widget widget, int hot_x, int hot_y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_add_image_targets (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_add_text_targets (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_add_uri_targets (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.TargetList drag_source_get_target_list (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_set (Gtk.Widget widget, Gdk.ModifierType start_button_mask, Gtk.TargetEntry[] targets, Gdk.DragAction actions);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_set_icon_gicon (Gtk.Widget widget, GLib.Icon icon);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_set_icon_name (Gtk.Widget widget, string icon_name);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_set_icon_pixbuf (Gtk.Widget widget, Gdk.Pixbuf pixbuf);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_set_icon_stock (Gtk.Widget widget, string stock_id);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_set_target_list (Gtk.Widget widget, Gtk.TargetList target_list);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_source_unset (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void drag_unhighlight (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_insertion_cursor\", since = \"3.4\")]\n\tpublic static void draw_insertion_cursor (Gtk.Widget widget, Cairo.Context cr, Gdk.Rectangle location, bool is_primary, Gtk.TextDirection direction, bool draw_arrow);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool events_pending ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint get_binary_age ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static Gdk.Event get_current_event ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gdk.Device get_current_event_device ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool get_current_event_state (out Gdk.ModifierType state);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint32 get_current_event_time ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint get_debug_flags ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Pango.Language get_default_language ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget get_event_widget (Gdk.Event event);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint get_interface_age ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint get_major_version ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint get_micro_version ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint get_minor_version ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static GLib.OptionGroup get_option_group (bool open_default_display);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void grab_add (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget grab_get_current ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void grab_remove (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static Gtk.IconSize icon_size_from_name (string name);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string icon_size_get_name (Gtk.IconSize size);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool icon_size_lookup (Gtk.IconSize size, out int width, out int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool icon_size_lookup_for_settings (Gtk.Settings settings, Gtk.IconSize size, out int width, out int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static Gtk.IconSize icon_size_register (string name, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void icon_size_register_alias (string alias, Gtk.IconSize target);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void init ([CCode (array_length_pos = 0.9)] ref unowned string[]? argv);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool init_check ([CCode (array_length_pos = 0.9)] ref unowned string[] argv);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool init_with_args ([CCode (array_length_pos = 0.9)] ref unowned string[] argv, string? parameter_string, [CCode (array_length = false)] GLib.OptionEntry[] entries, string? translation_domain) throws GLib.Error;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.4\")]\n\tpublic static uint key_snooper_install (Gtk.KeySnoopFunc snooper, void* func_data);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.4\")]\n\tpublic static void key_snooper_remove (uint snooper_handler_id);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void main ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void main_do_event (Gdk.Event event);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool main_iteration ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool main_iteration_do (bool blocking);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint main_level ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void main_quit ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_arrow (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, Gtk.ArrowType arrow_type, bool fill, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_background\", since = \"3.0\")]\n\tpublic static void paint_box (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_frame_gap\", since = \"3.0\")]\n\tpublic static void paint_box_gap (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height, Gtk.PositionType gap_side, int gap_x, int gap_width);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_check (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_diamond (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_expander\", since = \"3.0\")]\n\tpublic static void paint_expander (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget? widget, string? detail, int x, int y, Gtk.ExpanderStyle expander_style);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_frame and render_background\", since = \"3.0\")]\n\tpublic static void paint_extension (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height, Gtk.PositionType gap_side);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_flat_box (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_focus (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_handle (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height, Gtk.Orientation orientation);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_hline (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget? widget, string? detail, int x1, int x2, int y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_layout (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, bool use_text, Gtk.Widget? widget, string? detail, int x, int y, Pango.Layout layout);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_option (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_handle\", since = \"3.0\")]\n\tpublic static void paint_resize_grip (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget? widget, string? detail, Gdk.WindowEdge edge, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_shadow (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_frame\", since = \"3.0\")]\n\tpublic static void paint_shadow_gap (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height, Gtk.PositionType gap_side, int gap_x, int gap_width);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_slider (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height, Gtk.Orientation orientation);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"render_activity\", since = \"3.0\")]\n\tpublic static void paint_spinner (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget widget, string detail, uint step, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_tab (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.ShadowType shadow_type, Gtk.Widget? widget, string? detail, int x, int y, int width, int height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (since = \"3.0\")]\n\tpublic static void paint_vline (Gtk.Style style, Cairo.Context cr, Gtk.StateType state_type, Gtk.Widget? widget, string? detail, int y1_, int y2_, int x);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool parse_args (int argc, string[] argv);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static GLib.Quark print_error_quark ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.PageSetup print_run_page_setup_dialog (Gtk.Window parent, Gtk.PageSetup page_setup, Gtk.PrintSettings settings);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void print_run_page_setup_dialog_async (Gtk.Window parent, Gtk.PageSetup page_setup, Gtk.PrintSettings settings, Gtk.PageSetupDoneFunc done_cb, void* data);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void propagate_event (Gtk.Widget widget, Gdk.Event event);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void rc_add_default_file (string filename);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_find_module_in_path (string module_file);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_find_pixmap_in_path (Gtk.Settings settings, GLib.Scanner scanner, string pixmap_file);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_get_default_files ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_get_im_module_file ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_get_im_module_path ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_get_module_dir ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Style rc_get_style (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Style? rc_get_style_by_paths (Gtk.Settings settings, string? widget_path, string? class_path, GLib.Type type);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string rc_get_theme_dir ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void rc_parse (string filename);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint rc_parse_color (GLib.Scanner scanner, Gdk.Color color);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint rc_parse_color_full (GLib.Scanner scanner, Gtk.RcStyle style, Gdk.Color color);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint rc_parse_priority (GLib.Scanner scanner, Gtk.PathPriorityType priority);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static uint rc_parse_state (GLib.Scanner scanner, Gtk.StateType state);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void rc_parse_string (string rc_string);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool rc_reparse_all ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool rc_reparse_all_for_settings (Gtk.Settings settings, bool force_load);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void rc_reset_styles (Gtk.Settings settings);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned GLib.Scanner rc_scanner_new ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void rc_set_default_files (string filenames);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_activity\", since = \"vala-0.16\")]\n\tpublic static void render_activity (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_arrow\", since = \"vala-0.16\")]\n\tpublic static void render_arrow (Gtk.StyleContext context, Cairo.Context cr, double angle, double x, double y, double size);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_background\", since = \"vala-0.16\")]\n\tpublic static void render_background (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_check\", since = \"vala-0.16\")]\n\tpublic static void render_check (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_expander\", since = \"vala-0.16\")]\n\tpublic static void render_expander (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_extension\", since = \"vala-0.16\")]\n\tpublic static void render_extension (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height, Gtk.PositionType gap_side);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_focus\", since = \"vala-0.16\")]\n\tpublic static void render_focus (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_frame\", since = \"vala-0.16\")]\n\tpublic static void render_frame (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_frame_gap\", since = \"vala-0.16\")]\n\tpublic static void render_frame_gap (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height, Gtk.PositionType gap_side, double xy0_gap, double xy1_gap);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_handle\", since = \"vala-0.16\")]\n\tpublic static void render_handle (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_icon\", since = \"vala-0.16\")]\n\tpublic static void render_icon (Gtk.StyleContext context, Cairo.Context cr, Gdk.Pixbuf pixbuf, double x, double y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_icon_pixbuf\", since = \"vala-0.16\")]\n\tpublic static unowned Gdk.Pixbuf render_icon_pixbuf (Gtk.StyleContext context, Gtk.IconSource source, Gtk.IconSize size);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void render_icon_surface (Gtk.StyleContext context, Cairo.Context cr, Cairo.Surface surface, double x, double y);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void render_insertion_cursor (Gtk.StyleContext context, Cairo.Context cr, double x, double y, Pango.Layout layout, int index, Pango.Direction direction);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_layout\", since = \"vala-0.16\")]\n\tpublic static void render_layout (Gtk.StyleContext context, Cairo.Context cr, double x, double y, Pango.Layout layout);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_line\", since = \"vala-0.16\")]\n\tpublic static void render_line (Gtk.StyleContext context, Cairo.Context cr, double x0, double y0, double x1, double y1);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_option\", since = \"vala-0.16\")]\n\tpublic static void render_option (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"StyleContext.render_slider\", since = \"vala-0.16\")]\n\tpublic static void render_slider (Gtk.StyleContext context, Cairo.Context cr, double x, double y, double width, double height, Gtk.Orientation orientation);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void rgb_to_hsv (double r, double g, double b, double h, double s, double v);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void selection_add_target (Gtk.Widget widget, Gdk.Atom selection, Gdk.Atom target, uint info);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void selection_add_targets (Gtk.Widget widget, Gdk.Atom selection, Gtk.TargetEntry[] targets, uint ntargets);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void selection_clear_targets (Gtk.Widget widget, Gdk.Atom selection);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool selection_convert (Gtk.Widget widget, Gdk.Atom selection, Gdk.Atom target, uint32 time_);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool selection_owner_set (Gtk.Widget widget, Gdk.Atom selection, uint32 time_);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool selection_owner_set_for_display (Gdk.Display display, Gtk.Widget widget, Gdk.Atom selection, uint32 time_);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void selection_remove_all (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void set_debug_flags (uint flags);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void show_about_dialog (Gtk.Window? parent, ...);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool show_uri (Gdk.Screen? screen, string uri, uint32 timestamp) throws GLib.Error;\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.add\", since = \"vala-0.12\")]\n\tpublic static void stock_add (Gtk.StockItem[] items);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.add_static\", since = \"vala-0.12\")]\n\tpublic static void stock_add_static (Gtk.StockItem[] items);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.list_ids\", since = \"vala-0.12\")]\n\tpublic static GLib.SList<string> stock_list_ids ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\t[Deprecated (replacement = \"Gtk.Stock.set_translate_func\", since = \"vala-0.22\")]\n\tpublic static void stock_set_translate_func (string domain, owned Gtk.TranslateFunc func);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void target_table_free (Gtk.TargetEntry[] targets);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static Gtk.TargetEntry[] target_table_new_from_list (Gtk.TargetList list);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool targets_include_image (Gdk.Atom[] targets, bool writable);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool targets_include_rich_text (Gdk.Atom[] targets, Gtk.TextBuffer buffer);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool targets_include_text (Gdk.Atom[] targets);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool targets_include_uri (Gdk.Atom[] targets);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget test_create_simple_window (string window_title, string dialog_text);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget test_create_widget (GLib.Type widget_type, ...);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget test_display_button_window (string window_title, string dialog_text);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget test_find_label (Gtk.Widget widget, string label_pattern);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget test_find_sibling (Gtk.Widget base_widget, GLib.Type widget_type);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned Gtk.Widget test_find_widget (Gtk.Widget widget, string label_pattern, GLib.Type widget_type);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void test_init ([CCode (array_length_pos = 0.9)] ref unowned string[] argvp, ...);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned GLib.Type[] test_list_all_types (uint n_types);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void test_register_all_types ();\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static double test_slider_get_value (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void test_slider_set_perc (Gtk.Widget widget, double percentage);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool test_spin_button_click (Gtk.SpinButton spinner, uint button, bool upwards);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static unowned string test_text_get (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void test_text_set (Gtk.Widget widget, string str);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool test_widget_click (Gtk.Widget widget, uint button, Gdk.ModifierType modifiers);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool test_widget_send_key (Gtk.Widget widget, uint keyval, Gdk.ModifierType modifiers);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static void test_widget_wait_for_draw (Gtk.Widget widget);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool tree_get_row_drag_data (Gtk.SelectionData selection_data, out unowned Gtk.TreeModel tree_model, out unowned Gtk.TreePath path);\n\t[CCode (cheader_filename = \"gtk/gtk.h\")]\n\tpublic static bool tree_set_row_drag_data (Gtk.SelectionData selection_data, Gtk.TreeModel tree_model, Gtk.TreePath path);\n}\n"
  },
  {
    "path": "extravapi/gtksourceview-3.0/gtksourceview-3.0.deps",
    "content": "atk\ngdk-3.0\ngdk-pixbuf-2.0\ngio-2.0\ngtk+-3.0\npango\ncairo\n"
  },
  {
    "path": "extravapi/gtksourceview-3.0/gtksourceview-3.0.vapi",
    "content": "/* gtksourceview-3.0.vapi generated by vapigen, do not modify. */\n\n[CCode (cprefix = \"Gtk\", gir_namespace = \"GtkSource\", gir_version = \"3.0\", lower_case_cprefix = \"gtk_\")]\nnamespace Gtk {\n\tnamespace SourceUtils {\n\t\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\")]\n\t\tpublic static string escape_search_text (string text);\n\t\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\")]\n\t\tpublic static string unescape_search_text (string text);\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_buffer_get_type ()\")]\n\t[GIR (name = \"Buffer\")]\n\tpublic class SourceBuffer : Gtk.TextBuffer {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceBuffer (Gtk.TextTagTable? table);\n\t\tpublic bool backward_iter_to_source_mark (Gtk.TextIter iter, string? category);\n\t\tpublic void begin_not_undoable_action ();\n\t\tpublic unowned Gtk.SourceMark create_source_mark (string? name, string category, Gtk.TextIter where);\n\t\tpublic void end_not_undoable_action ();\n\t\tpublic void ensure_highlight (Gtk.TextIter start, Gtk.TextIter end);\n\t\tpublic bool forward_iter_to_source_mark (Gtk.TextIter iter, string? category);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] get_context_classes_at_iter (Gtk.TextIter iter);\n\t\tpublic bool get_highlight_matching_brackets ();\n\t\tpublic bool get_highlight_syntax ();\n\t\tpublic unowned Gtk.SourceLanguage get_language ();\n\t\tpublic int get_max_undo_levels ();\n\t\tpublic GLib.SList<weak Gtk.SourceMark> get_source_marks_at_iter (Gtk.TextIter iter, string? category);\n\t\tpublic GLib.SList<weak Gtk.SourceMark> get_source_marks_at_line (int line, string? category);\n\t\tpublic unowned Gtk.SourceStyleScheme get_style_scheme ();\n\t\tpublic unowned Gtk.SourceUndoManager get_undo_manager ();\n\t\tpublic bool iter_backward_to_context_class_toggle (Gtk.TextIter iter, string context_class);\n\t\tpublic bool iter_forward_to_context_class_toggle (Gtk.TextIter iter, string context_class);\n\t\tpublic bool iter_has_context_class (Gtk.TextIter iter, string context_class);\n\t\tpublic void remove_source_marks (Gtk.TextIter start, Gtk.TextIter end, string? category);\n\t\tpublic void set_highlight_matching_brackets (bool highlight);\n\t\tpublic void set_highlight_syntax (bool highlight);\n\t\tpublic void set_language (Gtk.SourceLanguage? language);\n\t\tpublic void set_max_undo_levels (int max_undo_levels);\n\t\tpublic void set_style_scheme (Gtk.SourceStyleScheme? scheme);\n\t\tpublic void set_undo_manager (Gtk.SourceUndoManager? manager);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceBuffer.with_language (Gtk.SourceLanguage language);\n\t\t[NoAccessorMethod]\n\t\tpublic bool can_redo { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool can_undo { get; }\n\t\tpublic bool highlight_matching_brackets { get; set; }\n\t\tpublic bool highlight_syntax { get; set; }\n\t\tpublic Gtk.SourceLanguage language { get; set; }\n\t\tpublic int max_undo_levels { get; set; }\n\t\tpublic Gtk.SourceStyleScheme style_scheme { get; set; }\n\t\tpublic Gtk.SourceUndoManager undo_manager { get; set construct; }\n\t\tpublic virtual signal void bracket_matched (Gtk.TextIter iter, Gtk.SourceBracketMatchType state);\n\t\tpublic signal void highlight_updated (Gtk.TextIter object, Gtk.TextIter p0);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void redo ();\n\t\tpublic signal void source_mark_updated (Gtk.TextMark mark);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void undo ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_get_type ()\")]\n\t[GIR (name = \"Completion\")]\n\tpublic class SourceCompletion : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceCompletion ();\n\t\tpublic bool add_provider (Gtk.SourceCompletionProvider provider) throws GLib.Error;\n\t\tpublic void block_interactive ();\n\t\tpublic unowned Gtk.SourceCompletionContext create_context (Gtk.TextIter? position);\n\t\tpublic unowned Gtk.SourceCompletionInfo get_info_window ();\n\t\tpublic unowned GLib.List<Gtk.SourceCompletionProvider> get_providers ();\n\t\tpublic unowned Gtk.SourceView get_view ();\n\t\t[Deprecated (since = \"3.8\")]\n\t\tpublic void move_window (Gtk.TextIter iter);\n\t\t[NoWrapper]\n\t\tpublic virtual bool proposal_activated (Gtk.SourceCompletionProvider provider, Gtk.SourceCompletionProposal proposal);\n\t\tpublic bool remove_provider (Gtk.SourceCompletionProvider provider) throws GLib.Error;\n\t\t[CCode (cname = \"gtk_source_completion_show\")]\n\t\tpublic bool start (GLib.List<Gtk.SourceCompletionProvider>? providers, Gtk.SourceCompletionContext context);\n\t\tpublic void unblock_interactive ();\n\t\t[NoAccessorMethod]\n\t\tpublic uint accelerators { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint auto_complete_delay { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint proposal_page_size { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint provider_page_size { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool remember_info_visibility { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool select_on_show { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_headers { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool show_icons { get; set construct; }\n\t\tpublic Gtk.SourceView view { get; construct; }\n\t\tpublic virtual signal void activate_proposal ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void hide ();\n\t\tpublic virtual signal void move_cursor (Gtk.ScrollStep step, int num);\n\t\tpublic virtual signal void move_page (Gtk.ScrollStep step, int num);\n\t\tpublic virtual signal void populate_context (Gtk.SourceCompletionContext context);\n\t\tpublic virtual signal void show ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_context_get_type ()\")]\n\t[GIR (name = \"CompletionContext\")]\n\tpublic class SourceCompletionContext : GLib.InitiallyUnowned {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceCompletionContext ();\n\t\tpublic void add_proposals (Gtk.SourceCompletionProvider provider, GLib.List<Gtk.SourceCompletionProposal>? proposals, bool finished);\n\t\tpublic Gtk.SourceCompletionActivation get_activation ();\n\t\tpublic Gtk.TextIter get_iter ();\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.SourceCompletionActivation activation { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.SourceCompletion completion { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TextIter iter { get; set; }\n\t\tpublic virtual signal void cancelled ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_info_get_type ()\")]\n\t[GIR (name = \"CompletionInfo\")]\n\tpublic class SourceCompletionInfo : Gtk.Window, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceCompletionInfo ();\n\t\t[Deprecated (since = \"3.8\")]\n\t\tpublic unowned Gtk.Widget get_widget ();\n\t\tpublic void move_to_iter (Gtk.TextView view, Gtk.TextIter? iter);\n\t\t[Deprecated (since = \"3.8\")]\n\t\tpublic void set_widget (Gtk.Widget? widget);\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic virtual signal void before_show ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_item_get_type ()\")]\n\t[GIR (name = \"CompletionItem\")]\n\tpublic class SourceCompletionItem : GLib.Object, Gtk.SourceCompletionProposal {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceCompletionItem (string label, string text, Gdk.Pixbuf? icon, string? info);\n\t\t[CCode (has_construct_function = false)]\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic SourceCompletionItem.from_stock (string? label, string text, string stock, string? info);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceCompletionItem.with_markup (string markup, string text, Gdk.Pixbuf? icon, string? info);\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf icon { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string info { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string label { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string markup { owned get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_words_get_type ()\")]\n\t[GIR (name = \"CompletionWords\")]\n\tpublic class SourceCompletionWords : GLib.Object, Gtk.SourceCompletionProvider {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceCompletionWords (string? name, Gdk.Pixbuf? icon);\n\t\tpublic void register (Gtk.TextBuffer buffer);\n\t\tpublic void unregister (Gtk.TextBuffer buffer);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.SourceCompletionActivation activation { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.Pixbuf icon { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int interactive_delay { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint minimum_word_size { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string name { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int priority { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint proposals_batch_size { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic uint scan_batch_size { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_gutter_get_type ()\")]\n\t[GIR (name = \"Gutter\")]\n\tpublic class SourceGutter : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceGutter ();\n\t\tpublic void get_padding (int xpad, int ypad);\n\t\tpublic unowned Gtk.SourceGutterRenderer get_renderer_at_pos (int x, int y);\n\t\tpublic unowned Gdk.Window get_window ();\n\t\tpublic bool insert (Gtk.SourceGutterRenderer renderer, int position);\n\t\tpublic void queue_draw ();\n\t\tpublic void remove (Gtk.SourceGutterRenderer renderer);\n\t\tpublic void reorder (Gtk.SourceGutterRenderer renderer, int position);\n\t\tpublic void set_padding (int xpad, int ypad);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.SourceView view { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.TextWindowType window_type { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int xpad { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int ypad { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_gutter_renderer_get_type ()\")]\n\t[GIR (name = \"GutterRenderer\")]\n\tpublic abstract class SourceGutterRenderer : GLib.InitiallyUnowned {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceGutterRenderer ();\n\t\tpublic virtual void begin (Cairo.Context cr, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.TextIter start, Gtk.TextIter end);\n\t\t[NoWrapper]\n\t\tpublic virtual void change_buffer (Gtk.TextBuffer old_buffer);\n\t\t[NoWrapper]\n\t\tpublic virtual void change_view (Gtk.TextView old_view);\n\t\tpublic virtual void draw (Cairo.Context cr, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.TextIter start, Gtk.TextIter end, Gtk.SourceGutterRendererState state);\n\t\tpublic virtual void end ();\n\t\tpublic void get_alignment (out float xalign, out float yalign);\n\t\tpublic Gtk.SourceGutterRendererAlignmentMode get_alignment_mode ();\n\t\tpublic bool get_background (out Gdk.RGBA color);\n\t\tpublic void get_padding (out int xpad, out int ypad);\n\t\tpublic int get_size ();\n\t\tpublic unowned Gtk.TextView get_view ();\n\t\tpublic bool get_visible ();\n\t\tpublic Gtk.TextWindowType get_window_type ();\n\t\tpublic void set_alignment (float xalign, float yalign);\n\t\tpublic void set_alignment_mode (Gtk.SourceGutterRendererAlignmentMode mode);\n\t\tpublic void set_background (Gdk.RGBA? color);\n\t\tpublic void set_padding (int xpad, int ypad);\n\t\tpublic void set_size (int size);\n\t\tpublic void set_visible (bool visible);\n\t\tpublic Gtk.SourceGutterRendererAlignmentMode alignment_mode { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA background_rgba { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_set { get; set construct; }\n\t\tpublic int size { get; set construct; }\n\t\tpublic Gtk.TextView view { get; }\n\t\tpublic bool visible { get; set construct; }\n\t\tpublic Gtk.TextWindowType window_type { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic float xalign { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int xpad { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic float yalign { get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic int ypad { get; set construct; }\n\t\t[HasEmitter]\n\t\tpublic virtual signal void activate (Gtk.TextIter iter, Cairo.RectangleInt area, Gdk.Event event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool query_activatable (Gtk.TextIter iter, Cairo.RectangleInt area, Gdk.Event event);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void query_data (Gtk.TextIter start, Gtk.TextIter end, Gtk.SourceGutterRendererState state);\n\t\t[HasEmitter]\n\t\tpublic virtual signal bool query_tooltip (Gtk.TextIter iter, Cairo.RectangleInt area, int x, int y, Gtk.Tooltip tooltip);\n\t\t[HasEmitter]\n\t\tpublic virtual signal void queue_draw ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_gutter_renderer_pixbuf_get_type ()\")]\n\t[GIR (name = \"GutterRendererPixbuf\")]\n\tpublic class SourceGutterRendererPixbuf : Gtk.SourceGutterRenderer {\n\t\t[CCode (has_construct_function = false, type = \"GtkSourceGutterRenderer*\")]\n\t\tpublic SourceGutterRendererPixbuf ();\n\t\tpublic unowned GLib.Icon get_gicon ();\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic unowned string get_stock_id ();\n\t\tpublic void set_gicon (GLib.Icon? icon);\n\t\tpublic void set_icon_name (string? icon_name);\n\t\tpublic void set_pixbuf (Gdk.Pixbuf? pixbuf);\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic void set_stock_id (string? stock_id);\n\t\tpublic GLib.Icon gicon { get; set; }\n\t\tpublic string icon_name { get; set; }\n\t\tpublic Gdk.Pixbuf pixbuf { get; set; }\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic string stock_id { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_gutter_renderer_text_get_type ()\")]\n\t[GIR (name = \"GutterRendererText\")]\n\tpublic class SourceGutterRendererText : Gtk.SourceGutterRenderer {\n\t\t[CCode (has_construct_function = false, type = \"GtkSourceGutterRenderer*\")]\n\t\tpublic SourceGutterRendererText ();\n\t\tpublic void measure (string text, int width, int height);\n\t\tpublic void measure_markup (string markup, int width, int height);\n\t\tpublic void set_markup (string markup, int length);\n\t\tpublic void set_text (string text, int length);\n\t\t[NoAccessorMethod]\n\t\tpublic string markup { owned get; set construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_language_get_type ()\")]\n\t[GIR (name = \"Language\")]\n\tpublic class SourceLanguage : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceLanguage ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] get_globs ();\n\t\tpublic bool get_hidden ();\n\t\tpublic unowned string get_id ();\n\t\tpublic unowned string get_metadata (string name);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] get_mime_types ();\n\t\tpublic unowned string get_name ();\n\t\tpublic unowned string get_section ();\n\t\tpublic unowned string get_style_fallback (string style_id);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] get_style_ids ();\n\t\tpublic unowned string get_style_name (string style_id);\n\t\tpublic bool hidden { get; }\n\t\tpublic string id { get; }\n\t\tpublic string name { get; }\n\t\tpublic string section { get; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_language_manager_get_type ()\")]\n\t[GIR (name = \"LanguageManager\")]\n\tpublic class SourceLanguageManager : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceLanguageManager ();\n\t\tpublic static unowned Gtk.SourceLanguageManager get_default ();\n\t\tpublic unowned Gtk.SourceLanguage get_language (string id);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_language_ids ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_search_path ();\n\t\tpublic unowned Gtk.SourceLanguage guess_language (string? filename, string? content_type);\n\t\tpublic void set_search_path ([CCode (array_length = false, array_null_terminated = true)] string[]? dirs);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] language_ids { get; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] search_path { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_mark_get_type ()\")]\n\t[GIR (name = \"Mark\")]\n\tpublic class SourceMark : Gtk.TextMark {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceMark (string name, string category);\n\t\tpublic unowned string get_category ();\n\t\tpublic unowned Gtk.SourceMark next (string? category);\n\t\tpublic unowned Gtk.SourceMark prev (string category);\n\t\tpublic string category { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_mark_attributes_get_type ()\")]\n\t[GIR (name = \"MarkAttributes\")]\n\tpublic class SourceMarkAttributes : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceMarkAttributes ();\n\t\tpublic bool get_background (out Gdk.RGBA background);\n\t\tpublic unowned GLib.Icon get_gicon ();\n\t\tpublic unowned string get_icon_name ();\n\t\tpublic unowned Gdk.Pixbuf get_pixbuf ();\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic unowned string get_stock_id ();\n\t\tpublic string get_tooltip_markup (Gtk.SourceMark mark);\n\t\tpublic string get_tooltip_text (Gtk.SourceMark mark);\n\t\tpublic unowned Gdk.Pixbuf render_icon (Gtk.Widget widget, int size);\n\t\tpublic void set_background (Gdk.RGBA background);\n\t\tpublic void set_gicon (GLib.Icon gicon);\n\t\tpublic void set_icon_name (string icon_name);\n\t\tpublic void set_pixbuf (Gdk.Pixbuf pixbuf);\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic void set_stock_id (string stock_id);\n\t\t[NoAccessorMethod]\n\t\tpublic Gdk.RGBA background { get; set; }\n\t\tpublic GLib.Icon gicon { get; set; }\n\t\tpublic string icon_name { get; set; }\n\t\tpublic Gdk.Pixbuf pixbuf { get; set; }\n\t\t[Deprecated (since = \"3.10\")]\n\t\tpublic string stock_id { get; set; }\n\t\tpublic signal string query_tooltip_markup (Gtk.SourceMark mark);\n\t\tpublic signal string query_tooltip_text (Gtk.SourceMark mark);\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_print_compositor_get_type ()\")]\n\t[GIR (name = \"PrintCompositor\")]\n\tpublic class SourcePrintCompositor : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourcePrintCompositor (Gtk.SourceBuffer buffer);\n\t\tpublic void draw_page (Gtk.PrintContext context, int page_nr);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourcePrintCompositor.from_view (Gtk.SourceView view);\n\t\tpublic string get_body_font_name ();\n\t\tpublic double get_bottom_margin (Gtk.Unit unit);\n\t\tpublic unowned Gtk.SourceBuffer get_buffer ();\n\t\tpublic string get_footer_font_name ();\n\t\tpublic string get_header_font_name ();\n\t\tpublic bool get_highlight_syntax ();\n\t\tpublic double get_left_margin (Gtk.Unit unit);\n\t\tpublic string get_line_numbers_font_name ();\n\t\tpublic int get_n_pages ();\n\t\tpublic double get_pagination_progress ();\n\t\tpublic bool get_print_footer ();\n\t\tpublic bool get_print_header ();\n\t\tpublic uint get_print_line_numbers ();\n\t\tpublic double get_right_margin (Gtk.Unit unit);\n\t\tpublic uint get_tab_width ();\n\t\tpublic double get_top_margin (Gtk.Unit unit);\n\t\tpublic Gtk.WrapMode get_wrap_mode ();\n\t\tpublic bool paginate (Gtk.PrintContext context);\n\t\tpublic void set_body_font_name (string font_name);\n\t\tpublic void set_bottom_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_footer_font_name (string? font_name);\n\t\tpublic void set_footer_format (bool separator, string? left, string? center, string? right);\n\t\tpublic void set_header_font_name (string? font_name);\n\t\tpublic void set_header_format (bool separator, string? left, string? center, string? right);\n\t\tpublic void set_highlight_syntax (bool highlight);\n\t\tpublic void set_left_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_line_numbers_font_name (string? font_name);\n\t\tpublic void set_print_footer (bool print);\n\t\tpublic void set_print_header (bool print);\n\t\tpublic void set_print_line_numbers (uint interval);\n\t\tpublic void set_right_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_tab_width (uint width);\n\t\tpublic void set_top_margin (double margin, Gtk.Unit unit);\n\t\tpublic void set_wrap_mode (Gtk.WrapMode wrap_mode);\n\t\tpublic string body_font_name { owned get; set; }\n\t\tpublic Gtk.SourceBuffer buffer { get; construct; }\n\t\tpublic string footer_font_name { owned get; set; }\n\t\tpublic string header_font_name { owned get; set; }\n\t\tpublic bool highlight_syntax { get; set; }\n\t\tpublic string line_numbers_font_name { owned get; set; }\n\t\tpublic int n_pages { get; }\n\t\tpublic bool print_footer { get; set; }\n\t\tpublic bool print_header { get; set; }\n\t\tpublic uint print_line_numbers { get; set; }\n\t\tpublic uint tab_width { get; set; }\n\t\tpublic Gtk.WrapMode wrap_mode { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_search_context_get_type ()\")]\n\t[GIR (name = \"SearchContext\")]\n\tpublic class SourceSearchContext : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceSearchContext (Gtk.SourceBuffer buffer, Gtk.SourceSearchSettings? settings);\n\t\tpublic bool backward (Gtk.TextIter iter, out Gtk.TextIter match_start, out Gtk.TextIter match_end);\n\t\tpublic async bool backward_async (Gtk.TextIter iter, GLib.Cancellable? cancellable, out Gtk.TextIter match_start, out Gtk.TextIter match_end) throws GLib.Error;\n\t\tpublic bool forward (Gtk.TextIter iter, out Gtk.TextIter match_start, out Gtk.TextIter match_end);\n\t\tpublic async bool forward_async (Gtk.TextIter iter, GLib.Cancellable? cancellable, out Gtk.TextIter match_start, out Gtk.TextIter match_end) throws GLib.Error;\n\t\tpublic unowned Gtk.SourceBuffer get_buffer ();\n\t\tpublic bool get_highlight ();\n\t\tpublic int get_occurrence_position (Gtk.TextIter match_start, Gtk.TextIter match_end);\n\t\tpublic int get_occurrences_count ();\n\t\tpublic GLib.Error? get_regex_error ();\n\t\tpublic unowned Gtk.SourceSearchSettings get_settings ();\n\t\tpublic bool replace (Gtk.TextIter match_start, Gtk.TextIter match_end, string replace, int replace_length) throws GLib.Error;\n\t\tpublic uint replace_all (string replace, int replace_length) throws GLib.Error;\n\t\tpublic void set_highlight (bool highlight);\n\t\tpublic void set_settings (Gtk.SourceSearchSettings? settings);\n\t\tpublic Gtk.SourceBuffer buffer { get; construct; }\n\t\tpublic bool highlight { get; set construct; }\n\t\tpublic int occurrences_count { get; }\n\t\tpublic GLib.Error? regex_error { owned get; }\n\t\tpublic Gtk.SourceSearchSettings settings { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_search_settings_get_type ()\")]\n\t[GIR (name = \"SearchSettings\")]\n\tpublic class SourceSearchSettings : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceSearchSettings ();\n\t\tpublic bool get_at_word_boundaries ();\n\t\tpublic bool get_case_sensitive ();\n\t\tpublic bool get_regex_enabled ();\n\t\tpublic unowned string get_search_text ();\n\t\tpublic bool get_wrap_around ();\n\t\tpublic void set_at_word_boundaries (bool at_word_boundaries);\n\t\tpublic void set_case_sensitive (bool case_sensitive);\n\t\tpublic void set_regex_enabled (bool regex_enabled);\n\t\tpublic void set_search_text (string? search_text);\n\t\tpublic void set_wrap_around (bool wrap_around);\n\t\tpublic bool at_word_boundaries { get; set construct; }\n\t\tpublic bool case_sensitive { get; set construct; }\n\t\tpublic bool regex_enabled { get; set construct; }\n\t\tpublic string search_text { get; set construct; }\n\t\tpublic bool wrap_around { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_style_get_type ()\")]\n\t[GIR (name = \"Style\")]\n\tpublic class SourceStyle : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceStyle ();\n\t\tpublic Gtk.SourceStyle copy ();\n\t\t[NoAccessorMethod]\n\t\tpublic string background { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool background_set { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool bold { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool bold_set { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string foreground { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool foreground_set { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool italic { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool italic_set { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic string line_background { owned get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool line_background_set { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool strikethrough { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool strikethrough_set { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool underline { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool underline_set { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_style_scheme_get_type ()\")]\n\t[GIR (name = \"StyleScheme\")]\n\tpublic class SourceStyleScheme : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SourceStyleScheme ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_authors ();\n\t\tpublic unowned string get_description ();\n\t\tpublic unowned string get_filename ();\n\t\tpublic unowned string get_id ();\n\t\tpublic unowned string get_name ();\n\t\tpublic unowned Gtk.SourceStyle get_style (string style_id);\n\t\tpublic string description { get; }\n\t\tpublic string filename { get; }\n\t\tpublic string id { get; construct; }\n\t\tpublic string name { get; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_style_scheme_manager_get_type ()\")]\n\t[GIR (name = \"StyleSchemeManager\")]\n\tpublic class SourceStyleSchemeManager : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic SourceStyleSchemeManager ();\n\t\tpublic void append_search_path (string path);\n\t\tpublic void force_rescan ();\n\t\tpublic static unowned Gtk.SourceStyleSchemeManager get_default ();\n\t\tpublic unowned Gtk.SourceStyleScheme get_scheme (string scheme_id);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_scheme_ids ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_search_path ();\n\t\tpublic void prepend_search_path (string path);\n\t\tpublic void set_search_path ([CCode (array_length = false, array_null_terminated = true)] string[]? path);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] scheme_ids { get; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] search_path { get; set; }\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_view_get_type ()\")]\n\t[GIR (name = \"View\")]\n\tpublic class SourceView : Gtk.TextView, Atk.Implementor, Gtk.Buildable, Gtk.Scrollable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SourceView ();\n\t\tpublic bool get_auto_indent ();\n\t\tpublic unowned Gtk.SourceCompletion get_completion ();\n\t\tpublic Gtk.SourceDrawSpacesFlags get_draw_spaces ();\n\t\tpublic unowned Gtk.SourceGutter get_gutter (Gtk.TextWindowType window_type);\n\t\tpublic bool get_highlight_current_line ();\n\t\tpublic bool get_indent_on_tab ();\n\t\tpublic int get_indent_width ();\n\t\tpublic bool get_insert_spaces_instead_of_tabs ();\n\t\tpublic unowned Gtk.SourceMarkAttributes get_mark_attributes (string category, int priority);\n\t\tpublic uint get_right_margin_position ();\n\t\tpublic bool get_show_line_marks ();\n\t\tpublic bool get_show_line_numbers ();\n\t\tpublic bool get_show_right_margin ();\n\t\tpublic Gtk.SourceSmartHomeEndType get_smart_home_end ();\n\t\tpublic uint get_tab_width ();\n\t\tpublic uint get_visual_column (Gtk.TextIter iter);\n\t\tpublic void set_auto_indent (bool enable);\n\t\tpublic void set_draw_spaces (Gtk.SourceDrawSpacesFlags flags);\n\t\tpublic void set_highlight_current_line (bool hl);\n\t\tpublic void set_indent_on_tab (bool enable);\n\t\tpublic void set_indent_width (int width);\n\t\tpublic void set_insert_spaces_instead_of_tabs (bool enable);\n\t\tpublic void set_mark_attributes (string category, Gtk.SourceMarkAttributes attributes, int priority);\n\t\tpublic void set_right_margin_position (uint pos);\n\t\tpublic void set_show_line_marks (bool show);\n\t\tpublic void set_show_line_numbers (bool show);\n\t\tpublic void set_show_right_margin (bool show);\n\t\tpublic void set_smart_home_end (Gtk.SourceSmartHomeEndType smart_he);\n\t\tpublic void set_tab_width (uint width);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic SourceView.with_buffer (Gtk.SourceBuffer buffer);\n\t\tpublic bool auto_indent { get; set; }\n\t\tpublic Gtk.SourceCompletion completion { get; }\n\t\tpublic Gtk.SourceDrawSpacesFlags draw_spaces { get; set; }\n\t\tpublic bool highlight_current_line { get; set; }\n\t\tpublic bool indent_on_tab { get; set; }\n\t\tpublic int indent_width { get; set; }\n\t\tpublic bool insert_spaces_instead_of_tabs { get; set; }\n\t\tpublic uint right_margin_position { get; set; }\n\t\tpublic bool show_line_marks { get; set; }\n\t\tpublic bool show_line_numbers { get; set; }\n\t\tpublic bool show_right_margin { get; set; }\n\t\tpublic Gtk.SourceSmartHomeEndType smart_home_end { get; set; }\n\t\tpublic uint tab_width { get; set; }\n\t\tpublic virtual signal void line_mark_activated (Gtk.TextIter iter, Gdk.Event event);\n\t\tpublic virtual signal void move_lines (bool copy, int step);\n\t\tpublic virtual signal void move_words (int step);\n\t\tpublic virtual signal void redo ();\n\t\tpublic virtual signal void show_completion ();\n\t\tpublic virtual signal void undo ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_proposal_get_type ()\")]\n\t[GIR (name = \"CompletionProposal\")]\n\tpublic interface SourceCompletionProposal : GLib.Object {\n\t\tpublic virtual bool equal (Gtk.SourceCompletionProposal other);\n\t\tpublic virtual unowned Gdk.Pixbuf get_icon ();\n\t\tpublic abstract string get_info ();\n\t\tpublic abstract string get_label ();\n\t\tpublic abstract string get_markup ();\n\t\tpublic abstract string get_text ();\n\t\tpublic virtual uint hash ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void changed ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_completion_provider_get_type ()\")]\n\t[GIR (name = \"CompletionProvider\")]\n\tpublic interface SourceCompletionProvider : GLib.Object {\n\t\tpublic virtual bool activate_proposal (Gtk.SourceCompletionProposal proposal, Gtk.TextIter iter);\n\t\tpublic virtual Gtk.SourceCompletionActivation get_activation ();\n\t\tpublic virtual unowned Gdk.Pixbuf? get_icon ();\n\t\tpublic virtual unowned Gtk.Widget? get_info_widget (Gtk.SourceCompletionProposal proposal);\n\t\tpublic virtual int get_interactive_delay ();\n\t\tpublic virtual string get_name ();\n\t\tpublic virtual int get_priority ();\n\t\tpublic virtual bool get_start_iter (Gtk.SourceCompletionContext context, Gtk.SourceCompletionProposal proposal, Gtk.TextIter iter);\n\t\tpublic virtual bool match (Gtk.SourceCompletionContext context);\n\t\tpublic virtual void populate (Gtk.SourceCompletionContext context);\n\t\tpublic virtual void update_info (Gtk.SourceCompletionProposal proposal, Gtk.SourceCompletionInfo info);\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", type_id = \"gtk_source_undo_manager_get_type ()\")]\n\t[GIR (name = \"UndoManager\")]\n\tpublic interface SourceUndoManager : GLib.Object {\n\t\tpublic abstract void begin_not_undoable_action ();\n\t\tpublic abstract bool can_redo ();\n\t\tpublic abstract bool can_undo ();\n\t\tpublic abstract void end_not_undoable_action ();\n\t\tpublic abstract void redo ();\n\t\tpublic abstract void undo ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void can_redo_changed ();\n\t\t[HasEmitter]\n\t\tpublic virtual signal void can_undo_changed ();\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_BRACKET_MATCH_\", type_id = \"gtk_source_bracket_match_type_get_type ()\")]\n\t[GIR (name = \"BracketMatchType\")]\n\tpublic enum SourceBracketMatchType {\n\t\tNONE,\n\t\tOUT_OF_RANGE,\n\t\tNOT_FOUND,\n\t\tFOUND\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_COMPLETION_ACTIVATION_\", type_id = \"gtk_source_completion_activation_get_type ()\")]\n\t[Flags]\n\t[GIR (name = \"CompletionActivation\")]\n\tpublic enum SourceCompletionActivation {\n\t\tNONE,\n\t\tINTERACTIVE,\n\t\tUSER_REQUESTED\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_DRAW_SPACES_\", type_id = \"gtk_source_draw_spaces_flags_get_type ()\")]\n\t[Flags]\n\t[GIR (name = \"DrawSpacesFlags\")]\n\tpublic enum SourceDrawSpacesFlags {\n\t\tSPACE,\n\t\tTAB,\n\t\tNEWLINE,\n\t\tNBSP,\n\t\tLEADING,\n\t\tTEXT,\n\t\tTRAILING,\n\t\tALL\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_GUTTER_RENDERER_ALIGNMENT_MODE_\", type_id = \"gtk_source_gutter_renderer_alignment_mode_get_type ()\")]\n\t[GIR (name = \"GutterRendererAlignmentMode\")]\n\tpublic enum SourceGutterRendererAlignmentMode {\n\t\tCELL,\n\t\tFIRST,\n\t\tLAST\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_GUTTER_RENDERER_STATE_\", type_id = \"gtk_source_gutter_renderer_state_get_type ()\")]\n\t[Flags]\n\t[GIR (name = \"GutterRendererState\")]\n\tpublic enum SourceGutterRendererState {\n\t\tNORMAL,\n\t\tCURSOR,\n\t\tPRELIT,\n\t\tSELECTED\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_SMART_HOME_END_\", type_id = \"gtk_source_smart_home_end_type_get_type ()\")]\n\t[GIR (name = \"SmartHomeEndType\")]\n\tpublic enum SourceSmartHomeEndType {\n\t\tDISABLED,\n\t\tBEFORE,\n\t\tAFTER,\n\t\tALWAYS\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_VIEW_GUTTER_POSITION_\", type_id = \"gtk_source_view_gutter_position_get_type ()\")]\n\t[GIR (name = \"ViewGutterPosition\")]\n\tpublic enum SourceViewGutterPosition {\n\t\tLINES,\n\t\tMARKS\n\t}\n\t[CCode (cheader_filename = \"gtksourceview/gtksource.h\", cprefix = \"GTK_SOURCE_COMPLETION_ERROR_\")]\n\t[GIR (name = \"CompletionError\")]\n\tpublic errordomain SourceCompletionError {\n\t\tALREADY_BOUND,\n\t\tNOT_BOUND;\n\t\t[CCode (cname = \"gtk_source_completion_error_quark\")]\n\t\tpublic static GLib.Quark uark ();\n\t}\n}\n"
  },
  {
    "path": "extravapi/webkit2gtk-3.0/webkit2gtk-3.0.deps",
    "content": "gtk+-3.0\nlibsoup-2.4\n"
  },
  {
    "path": "extravapi/webkit2gtk-3.0/webkit2gtk-3.0.vapi",
    "content": "/* webkit2gtk-3.0.vapi generated by vapigen, do not modify. */\n\n[CCode (cprefix = \"WebKit\", gir_namespace = \"WebKit2\", gir_version = \"3.0\", lower_case_cprefix = \"webkit_\")]\nnamespace WebKit {\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_authentication_request_get_type ()\")]\n\tpublic class AuthenticationRequest : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected AuthenticationRequest ();\n\t\tpublic void authenticate (WebKit.Credential? credential);\n\t\tpublic bool can_save_credentials ();\n\t\tpublic void cancel ();\n\t\tpublic unowned string get_host ();\n\t\tpublic uint get_port ();\n\t\tpublic WebKit.Credential get_proposed_credential ();\n\t\tpublic unowned string get_realm ();\n\t\tpublic WebKit.AuthenticationScheme get_scheme ();\n\t\tpublic bool is_for_proxy ();\n\t\tpublic bool is_retry ();\n\t\tpublic signal void cancelled ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_back_forward_list_get_type ()\")]\n\tpublic class BackForwardList : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected BackForwardList ();\n\t\tpublic unowned WebKit.BackForwardListItem get_back_item ();\n\t\tpublic GLib.List<weak WebKit.BackForwardListItem> get_back_list ();\n\t\tpublic GLib.List<weak WebKit.BackForwardListItem> get_back_list_with_limit (uint limit);\n\t\tpublic unowned WebKit.BackForwardListItem get_current_item ();\n\t\tpublic unowned WebKit.BackForwardListItem get_forward_item ();\n\t\tpublic GLib.List<weak WebKit.BackForwardListItem> get_forward_list ();\n\t\tpublic GLib.List<weak WebKit.BackForwardListItem> get_forward_list_with_limit (uint limit);\n\t\tpublic uint get_length ();\n\t\tpublic unowned WebKit.BackForwardListItem get_nth_item (int index);\n\t\tpublic signal void changed (WebKit.BackForwardListItem? item_added, void* items_removed);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_back_forward_list_item_get_type ()\")]\n\tpublic class BackForwardListItem : GLib.InitiallyUnowned {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected BackForwardListItem ();\n\t\tpublic unowned string get_original_uri ();\n\t\tpublic unowned string get_title ();\n\t\tpublic unowned string get_uri ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", copy_function = \"g_boxed_copy\", free_function = \"g_boxed_free\", type_id = \"webkit_certificate_info_get_type ()\")]\n\t[Compact]\n\tpublic class CertificateInfo {\n\t\tpublic WebKit.CertificateInfo copy ();\n\t\tpublic void free ();\n\t\tpublic unowned GLib.TlsCertificate get_tls_certificate ();\n\t\tpublic GLib.TlsCertificateFlags get_tls_errors ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_context_menu_get_type ()\")]\n\tpublic class ContextMenu : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenu ();\n\t\tpublic void append (WebKit.ContextMenuItem item);\n\t\tpublic unowned WebKit.ContextMenuItem first ();\n\t\tpublic unowned WebKit.ContextMenuItem get_item_at_position (uint position);\n\t\tpublic unowned GLib.List<WebKit.ContextMenuItem> get_items ();\n\t\tpublic uint get_n_items ();\n\t\tpublic void insert (WebKit.ContextMenuItem item, int position);\n\t\tpublic unowned WebKit.ContextMenuItem last ();\n\t\tpublic void move_item (WebKit.ContextMenuItem item, int position);\n\t\tpublic void prepend (WebKit.ContextMenuItem item);\n\t\tpublic void remove (WebKit.ContextMenuItem item);\n\t\tpublic void remove_all ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenu.with_items (GLib.List<WebKit.ContextMenuItem> items);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_context_menu_item_get_type ()\")]\n\tpublic class ContextMenuItem : GLib.InitiallyUnowned {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenuItem (Gtk.Action action);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenuItem.from_stock_action (WebKit.ContextMenuAction action);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenuItem.from_stock_action_with_label (WebKit.ContextMenuAction action, string label);\n\t\tpublic unowned Gtk.Action get_action ();\n\t\tpublic WebKit.ContextMenuAction get_stock_action ();\n\t\tpublic unowned WebKit.ContextMenu get_submenu ();\n\t\tpublic bool is_separator ();\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenuItem.separator ();\n\t\tpublic void set_submenu (WebKit.ContextMenu? submenu);\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic ContextMenuItem.with_submenu (string label, WebKit.ContextMenu submenu);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_cookie_manager_get_type ()\")]\n\tpublic class CookieManager : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected CookieManager ();\n\t\tpublic void delete_all_cookies ();\n\t\tpublic void delete_cookies_for_domain (string domain);\n\t\tpublic async WebKit.CookieAcceptPolicy get_accept_policy (GLib.Cancellable? cancellable) throws GLib.Error;\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic async string[] get_domains_with_cookies (GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic void set_accept_policy (WebKit.CookieAcceptPolicy policy);\n\t\tpublic void set_persistent_storage (string filename, WebKit.CookiePersistentStorage storage);\n\t\tpublic signal void changed ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", copy_function = \"g_boxed_copy\", free_function = \"g_boxed_free\", type_id = \"webkit_credential_get_type ()\")]\n\t[Compact]\n\tpublic class Credential {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Credential (string username, string password, WebKit.CredentialPersistence persistence);\n\t\tpublic WebKit.Credential copy ();\n\t\tpublic void free ();\n\t\tpublic unowned string get_password ();\n\t\tpublic WebKit.CredentialPersistence get_persistence ();\n\t\tpublic unowned string get_username ();\n\t\tpublic bool has_password ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_download_get_type ()\")]\n\tpublic class Download : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Download ();\n\t\tpublic void cancel ();\n\t\tpublic unowned string get_destination ();\n\t\tpublic double get_elapsed_time ();\n\t\tpublic double get_estimated_progress ();\n\t\tpublic uint64 get_received_data_length ();\n\t\tpublic unowned WebKit.URIRequest get_request ();\n\t\tpublic unowned WebKit.URIResponse get_response ();\n\t\tpublic unowned WebKit.WebView get_web_view ();\n\t\tpublic void set_destination (string uri);\n\t\tpublic string destination { get; }\n\t\tpublic double estimated_progress { get; }\n\t\tpublic WebKit.URIResponse response { get; }\n\t\tpublic signal void created_destination (string destination);\n\t\tpublic virtual signal bool decide_destination (string suggested_filename);\n\t\tpublic signal void failed (void* error);\n\t\tpublic signal void finished ();\n\t\tpublic signal void received_data (uint64 data_length);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_favicon_database_get_type ()\")]\n\tpublic class FaviconDatabase : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected FaviconDatabase ();\n\t\tpublic void clear ();\n\t\tpublic async Cairo.Surface get_favicon (string page_uri, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic string get_favicon_uri (string page_uri);\n\t\tpublic signal void favicon_changed (string page_uri, string favicon_uri);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_file_chooser_request_get_type ()\")]\n\tpublic class FileChooserRequest : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected FileChooserRequest ();\n\t\tpublic void cancel ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_mime_types ();\n\t\tpublic unowned Gtk.FileFilter get_mime_types_filter ();\n\t\tpublic bool get_select_multiple ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_selected_files ();\n\t\tpublic void select_files ([CCode (array_length = false, array_null_terminated = true)] string[] files);\n\t\t[NoAccessorMethod]\n\t\tpublic Gtk.FileFilter filter { owned get; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] mime_types { get; }\n\t\tpublic bool select_multiple { get; }\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] selected_files { get; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_find_controller_get_type ()\")]\n\tpublic class FindController : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected FindController ();\n\t\tpublic void count_matches (string search_text, uint32 find_options, uint max_match_count);\n\t\tpublic uint get_max_match_count ();\n\t\tpublic uint32 get_options ();\n\t\tpublic unowned string get_search_text ();\n\t\tpublic unowned WebKit.WebView get_web_view ();\n\t\tpublic void search (string search_text, uint32 find_options, uint max_match_count);\n\t\tpublic void search_finish ();\n\t\tpublic void search_next ();\n\t\tpublic void search_previous ();\n\t\tpublic uint max_match_count { get; }\n\t\tpublic WebKit.FindOptions options { get; }\n\t\t[NoAccessorMethod]\n\t\tpublic string text { owned get; }\n\t\tpublic WebKit.WebView web_view { get; construct; }\n\t\tpublic signal void counted_matches (uint match_count);\n\t\tpublic signal void failed_to_find_text ();\n\t\tpublic signal void found_text (uint match_count);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_form_submission_request_get_type ()\")]\n\tpublic class FormSubmissionRequest : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected FormSubmissionRequest ();\n\t\tpublic unowned GLib.HashTable<void*,void*> get_text_fields ();\n\t\tpublic void submit ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_geolocation_permission_request_get_type ()\")]\n\tpublic class GeolocationPermissionRequest : GLib.Object, WebKit.PermissionRequest {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected GeolocationPermissionRequest ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_hit_test_result_get_type ()\")]\n\tpublic class HitTestResult : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected HitTestResult ();\n\t\tpublic bool context_is_editable ();\n\t\tpublic bool context_is_image ();\n\t\tpublic bool context_is_link ();\n\t\tpublic bool context_is_media ();\n\t\tpublic bool context_is_scrollbar ();\n\t\tpublic uint get_context ();\n\t\tpublic unowned string get_image_uri ();\n\t\tpublic unowned string get_link_label ();\n\t\tpublic unowned string get_link_title ();\n\t\tpublic unowned string get_link_uri ();\n\t\tpublic unowned string get_media_uri ();\n\t\tpublic uint context { get; construct; }\n\t\tpublic string image_uri { get; construct; }\n\t\tpublic string link_label { get; construct; }\n\t\tpublic string link_title { get; construct; }\n\t\tpublic string link_uri { get; construct; }\n\t\tpublic string media_uri { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", ref_function = \"webkit_javascript_result_ref\", type_id = \"webkit_javascript_result_get_type ()\", unref_function = \"webkit_javascript_result_unref\")]\n\t[Compact]\n\tpublic class JavascriptResult {\n\t\tpublic WebKit.JavascriptResult @ref ();\n\t\tpublic void unref ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", ref_function = \"webkit_mime_info_ref\", type_id = \"webkit_mime_info_get_type ()\", unref_function = \"webkit_mime_info_unref\")]\n\t[Compact]\n\tpublic class MimeInfo {\n\t\tpublic unowned string get_description ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_extensions ();\n\t\tpublic unowned string get_mime_type ();\n\t\tpublic WebKit.MimeInfo @ref ();\n\t\tpublic void unref ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_navigation_policy_decision_get_type ()\")]\n\tpublic class NavigationPolicyDecision : WebKit.PolicyDecision {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected NavigationPolicyDecision ();\n\t\tpublic unowned string get_frame_name ();\n\t\tpublic uint get_modifiers ();\n\t\tpublic uint get_mouse_button ();\n\t\tpublic WebKit.NavigationType get_navigation_type ();\n\t\tpublic unowned WebKit.URIRequest get_request ();\n\t\tpublic string frame_name { get; }\n\t\tpublic uint modifiers { get; }\n\t\tpublic uint mouse_button { get; }\n\t\tpublic WebKit.NavigationType navigation_type { get; }\n\t\tpublic WebKit.URIRequest request { get; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_plugin_get_type ()\")]\n\tpublic class Plugin : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected Plugin ();\n\t\tpublic unowned string get_description ();\n\t\tpublic unowned GLib.List<WebKit.MimeInfo> get_mime_info_list ();\n\t\tpublic unowned string get_name ();\n\t\tpublic unowned string get_path ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_policy_decision_get_type ()\")]\n\tpublic abstract class PolicyDecision : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected PolicyDecision ();\n\t\tpublic void download ();\n\t\tpublic void ignore ();\n\t\tpublic void use ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_print_operation_get_type ()\")]\n\tpublic class PrintOperation : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic PrintOperation (WebKit.WebView web_view);\n\t\tpublic unowned Gtk.PageSetup get_page_setup ();\n\t\tpublic unowned Gtk.PrintSettings get_print_settings ();\n\t\tpublic void print ();\n\t\tpublic WebKit.PrintOperationResponse run_dialog (Gtk.Window? parent);\n\t\tpublic void set_page_setup (Gtk.PageSetup page_setup);\n\t\tpublic void set_print_settings (Gtk.PrintSettings print_settings);\n\t\tpublic Gtk.PageSetup page_setup { get; set; }\n\t\tpublic Gtk.PrintSettings print_settings { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic WebKit.WebView web_view { owned get; construct; }\n\t\tpublic signal void failed (void* error);\n\t\tpublic signal void finished ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_response_policy_decision_get_type ()\")]\n\tpublic class ResponsePolicyDecision : WebKit.PolicyDecision {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected ResponsePolicyDecision ();\n\t\tpublic unowned WebKit.URIRequest get_request ();\n\t\tpublic unowned WebKit.URIResponse get_response ();\n\t\tpublic bool is_mime_type_supported ();\n\t\tpublic WebKit.URIRequest request { get; }\n\t\tpublic WebKit.URIResponse response { get; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", copy_function = \"g_boxed_copy\", free_function = \"g_boxed_free\", type_id = \"webkit_script_dialog_get_type ()\")]\n\t[Compact]\n\tpublic class ScriptDialog {\n\t\tpublic void confirm_set_confirmed (bool confirmed);\n\t\tpublic WebKit.ScriptDialogType get_dialog_type ();\n\t\tpublic unowned string get_message ();\n\t\tpublic unowned string prompt_get_default_text ();\n\t\tpublic void prompt_set_text (string text);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_security_manager_get_type ()\")]\n\tpublic class SecurityManager : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected SecurityManager ();\n\t\tpublic void register_uri_scheme_as_cors_enabled (string scheme);\n\t\tpublic void register_uri_scheme_as_display_isolated (string scheme);\n\t\tpublic void register_uri_scheme_as_empty_document (string scheme);\n\t\tpublic void register_uri_scheme_as_local (string scheme);\n\t\tpublic void register_uri_scheme_as_no_access (string scheme);\n\t\tpublic void register_uri_scheme_as_secure (string scheme);\n\t\tpublic bool uri_scheme_is_cors_enabled (string scheme);\n\t\tpublic bool uri_scheme_is_display_isolated (string scheme);\n\t\tpublic bool uri_scheme_is_empty_document (string scheme);\n\t\tpublic bool uri_scheme_is_local (string scheme);\n\t\tpublic bool uri_scheme_is_no_access (string scheme);\n\t\tpublic bool uri_scheme_is_secure (string scheme);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_settings_get_type ()\")]\n\tpublic class Settings : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic Settings ();\n\t\tpublic bool get_allow_modal_dialogs ();\n\t\tpublic bool get_auto_load_images ();\n\t\tpublic unowned string get_cursive_font_family ();\n\t\tpublic unowned string get_default_charset ();\n\t\tpublic unowned string get_default_font_family ();\n\t\tpublic uint32 get_default_font_size ();\n\t\tpublic uint32 get_default_monospace_font_size ();\n\t\tpublic bool get_draw_compositing_indicators ();\n\t\tpublic bool get_enable_accelerated_2d_canvas ();\n\t\tpublic bool get_enable_caret_browsing ();\n\t\tpublic bool get_enable_developer_extras ();\n\t\tpublic bool get_enable_dns_prefetching ();\n\t\tpublic bool get_enable_frame_flattening ();\n\t\tpublic bool get_enable_fullscreen ();\n\t\tpublic bool get_enable_html5_database ();\n\t\tpublic bool get_enable_html5_local_storage ();\n\t\tpublic bool get_enable_hyperlink_auditing ();\n\t\tpublic bool get_enable_java ();\n\t\tpublic bool get_enable_javascript ();\n\t\tpublic bool get_enable_media_stream ();\n\t\tpublic bool get_enable_mediasource ();\n\t\tpublic bool get_enable_offline_web_application_cache ();\n\t\tpublic bool get_enable_page_cache ();\n\t\tpublic bool get_enable_plugins ();\n\t\tpublic bool get_enable_private_browsing ();\n\t\tpublic bool get_enable_resizable_text_areas ();\n\t\tpublic bool get_enable_site_specific_quirks ();\n\t\tpublic bool get_enable_smooth_scrolling ();\n\t\tpublic bool get_enable_spatial_navigation ();\n\t\tpublic bool get_enable_tabs_to_links ();\n\t\tpublic bool get_enable_webaudio ();\n\t\tpublic bool get_enable_webgl ();\n\t\tpublic bool get_enable_write_console_messages_to_stdout ();\n\t\tpublic bool get_enable_xss_auditor ();\n\t\tpublic unowned string get_fantasy_font_family ();\n\t\tpublic bool get_javascript_can_access_clipboard ();\n\t\tpublic bool get_javascript_can_open_windows_automatically ();\n\t\tpublic bool get_load_icons_ignoring_image_load_setting ();\n\t\tpublic bool get_media_playback_allows_inline ();\n\t\tpublic bool get_media_playback_requires_user_gesture ();\n\t\tpublic uint32 get_minimum_font_size ();\n\t\tpublic unowned string get_monospace_font_family ();\n\t\tpublic unowned string get_pictograph_font_family ();\n\t\tpublic bool get_print_backgrounds ();\n\t\tpublic unowned string get_sans_serif_font_family ();\n\t\tpublic unowned string get_serif_font_family ();\n\t\tpublic unowned string get_user_agent ();\n\t\tpublic bool get_zoom_text_only ();\n\t\tpublic void set_allow_modal_dialogs (bool allowed);\n\t\tpublic void set_auto_load_images (bool enabled);\n\t\tpublic void set_cursive_font_family (string cursive_font_family);\n\t\tpublic void set_default_charset (string default_charset);\n\t\tpublic void set_default_font_family (string default_font_family);\n\t\tpublic void set_default_font_size (uint32 font_size);\n\t\tpublic void set_default_monospace_font_size (uint32 font_size);\n\t\tpublic void set_draw_compositing_indicators (bool enabled);\n\t\tpublic void set_enable_accelerated_2d_canvas (bool enabled);\n\t\tpublic void set_enable_caret_browsing (bool enabled);\n\t\tpublic void set_enable_developer_extras (bool enabled);\n\t\tpublic void set_enable_dns_prefetching (bool enabled);\n\t\tpublic void set_enable_frame_flattening (bool enabled);\n\t\tpublic void set_enable_fullscreen (bool enabled);\n\t\tpublic void set_enable_html5_database (bool enabled);\n\t\tpublic void set_enable_html5_local_storage (bool enabled);\n\t\tpublic void set_enable_hyperlink_auditing (bool enabled);\n\t\tpublic void set_enable_java (bool enabled);\n\t\tpublic void set_enable_javascript (bool enabled);\n\t\tpublic void set_enable_media_stream (bool enabled);\n\t\tpublic void set_enable_mediasource (bool enabled);\n\t\tpublic void set_enable_offline_web_application_cache (bool enabled);\n\t\tpublic void set_enable_page_cache (bool enabled);\n\t\tpublic void set_enable_plugins (bool enabled);\n\t\tpublic void set_enable_private_browsing (bool enabled);\n\t\tpublic void set_enable_resizable_text_areas (bool enabled);\n\t\tpublic void set_enable_site_specific_quirks (bool enabled);\n\t\tpublic void set_enable_smooth_scrolling (bool enabled);\n\t\tpublic void set_enable_spatial_navigation (bool enabled);\n\t\tpublic void set_enable_tabs_to_links (bool enabled);\n\t\tpublic void set_enable_webaudio (bool enabled);\n\t\tpublic void set_enable_webgl (bool enabled);\n\t\tpublic void set_enable_write_console_messages_to_stdout (bool enabled);\n\t\tpublic void set_enable_xss_auditor (bool enabled);\n\t\tpublic void set_fantasy_font_family (string fantasy_font_family);\n\t\tpublic void set_javascript_can_access_clipboard (bool enabled);\n\t\tpublic void set_javascript_can_open_windows_automatically (bool enabled);\n\t\tpublic void set_load_icons_ignoring_image_load_setting (bool enabled);\n\t\tpublic void set_media_playback_allows_inline (bool enabled);\n\t\tpublic void set_media_playback_requires_user_gesture (bool enabled);\n\t\tpublic void set_minimum_font_size (uint32 font_size);\n\t\tpublic void set_monospace_font_family (string monospace_font_family);\n\t\tpublic void set_pictograph_font_family (string pictograph_font_family);\n\t\tpublic void set_print_backgrounds (bool print_backgrounds);\n\t\tpublic void set_sans_serif_font_family (string sans_serif_font_family);\n\t\tpublic void set_serif_font_family (string serif_font_family);\n\t\tpublic void set_user_agent (string? user_agent);\n\t\tpublic void set_user_agent_with_application_details (string? application_name, string? application_version);\n\t\tpublic void set_zoom_text_only (bool zoom_text_only);\n\t\tpublic bool allow_modal_dialogs { get; set construct; }\n\t\tpublic bool auto_load_images { get; set construct; }\n\t\tpublic string cursive_font_family { get; set construct; }\n\t\tpublic string default_charset { get; set construct; }\n\t\tpublic string default_font_family { get; set construct; }\n\t\tpublic uint default_font_size { get; set construct; }\n\t\tpublic uint default_monospace_font_size { get; set construct; }\n\t\tpublic bool draw_compositing_indicators { get; set construct; }\n\t\tpublic bool enable_accelerated_2d_canvas { get; set construct; }\n\t\tpublic bool enable_caret_browsing { get; set construct; }\n\t\tpublic bool enable_developer_extras { get; set construct; }\n\t\tpublic bool enable_dns_prefetching { get; set construct; }\n\t\tpublic bool enable_frame_flattening { get; set construct; }\n\t\tpublic bool enable_fullscreen { get; set construct; }\n\t\tpublic bool enable_html5_database { get; set construct; }\n\t\tpublic bool enable_html5_local_storage { get; set construct; }\n\t\tpublic bool enable_hyperlink_auditing { get; set construct; }\n\t\tpublic bool enable_java { get; set construct; }\n\t\tpublic bool enable_javascript { get; set construct; }\n\t\tpublic bool enable_media_stream { get; set construct; }\n\t\tpublic bool enable_mediasource { get; set construct; }\n\t\tpublic bool enable_offline_web_application_cache { get; set construct; }\n\t\tpublic bool enable_page_cache { get; set construct; }\n\t\tpublic bool enable_plugins { get; set construct; }\n\t\tpublic bool enable_private_browsing { get; set construct; }\n\t\tpublic bool enable_resizable_text_areas { get; set construct; }\n\t\tpublic bool enable_site_specific_quirks { get; set construct; }\n\t\tpublic bool enable_smooth_scrolling { get; set construct; }\n\t\tpublic bool enable_spatial_navigation { get; set construct; }\n\t\tpublic bool enable_tabs_to_links { get; set construct; }\n\t\tpublic bool enable_webaudio { get; set construct; }\n\t\tpublic bool enable_webgl { get; set construct; }\n\t\tpublic bool enable_write_console_messages_to_stdout { get; set construct; }\n\t\tpublic bool enable_xss_auditor { get; set construct; }\n\t\tpublic string fantasy_font_family { get; set construct; }\n\t\tpublic bool javascript_can_access_clipboard { get; set construct; }\n\t\tpublic bool javascript_can_open_windows_automatically { get; set construct; }\n\t\tpublic bool load_icons_ignoring_image_load_setting { get; set construct; }\n\t\tpublic bool media_playback_allows_inline { get; set construct; }\n\t\tpublic bool media_playback_requires_user_gesture { get; set construct; }\n\t\tpublic uint minimum_font_size { get; set construct; }\n\t\tpublic string monospace_font_family { get; set construct; }\n\t\tpublic string pictograph_font_family { get; set construct; }\n\t\tpublic bool print_backgrounds { get; set construct; }\n\t\tpublic string sans_serif_font_family { get; set construct; }\n\t\tpublic string serif_font_family { get; set construct; }\n\t\tpublic string user_agent { get; set construct; }\n\t\tpublic bool zoom_text_only { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_uri_request_get_type ()\")]\n\tpublic class URIRequest : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic URIRequest (string uri);\n\t\tpublic unowned Soup.MessageHeaders get_http_headers ();\n\t\tpublic unowned string get_uri ();\n\t\tpublic void set_uri (string uri);\n\t\tpublic string uri { get; set construct; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_uri_response_get_type ()\")]\n\tpublic class URIResponse : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected URIResponse ();\n\t\tpublic uint64 get_content_length ();\n\t\tpublic unowned string get_mime_type ();\n\t\tpublic uint get_status_code ();\n\t\tpublic unowned string get_suggested_filename ();\n\t\tpublic unowned string get_uri ();\n\t\tpublic uint64 content_length { get; }\n\t\tpublic string mime_type { get; }\n\t\tpublic uint status_code { get; }\n\t\tpublic string suggested_filename { get; }\n\t\tpublic string uri { get; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_uri_scheme_request_get_type ()\")]\n\tpublic class URISchemeRequest : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected URISchemeRequest ();\n\t\tpublic void finish (GLib.InputStream stream, int64 stream_length, string? mime_type);\n\t\tpublic void finish_error (GLib.Error error);\n\t\tpublic unowned string get_path ();\n\t\tpublic unowned string get_scheme ();\n\t\tpublic unowned string get_uri ();\n\t\tpublic unowned WebKit.WebView get_web_view ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_web_context_get_type ()\")]\n\tpublic class WebContext : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WebContext ();\n\t\tpublic void allow_tls_certificate_for_host (WebKit.CertificateInfo info, string host);\n\t\tpublic void clear_cache ();\n\t\tpublic WebKit.Download download_uri (string uri);\n\t\tpublic WebKit.CacheModel get_cache_model ();\n\t\tpublic unowned WebKit.CookieManager get_cookie_manager ();\n\t\tpublic static unowned WebKit.WebContext get_default ();\n\t\tpublic unowned WebKit.FaviconDatabase get_favicon_database ();\n\t\tpublic unowned string get_favicon_database_directory ();\n\t\tpublic async GLib.List<WebKit.Plugin> get_plugins (GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic WebKit.ProcessModel get_process_model ();\n\t\tpublic unowned WebKit.SecurityManager get_security_manager ();\n\t\tpublic bool get_spell_checking_enabled ();\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic unowned string[] get_spell_checking_languages ();\n\t\tpublic WebKit.TLSErrorsPolicy get_tls_errors_policy ();\n\t\tpublic void prefetch_dns (string hostname);\n\t\tpublic void register_uri_scheme (string scheme, owned WebKit.URISchemeRequestCallback callback);\n\t\tpublic void set_additional_plugins_directory (string directory);\n\t\tpublic void set_cache_model (WebKit.CacheModel cache_model);\n\t\tpublic void set_disk_cache_directory (string directory);\n\t\tpublic void set_favicon_database_directory (string? path);\n\t\tpublic void set_preferred_languages ([CCode (array_length = false, array_null_terminated = true)] string[]? languages);\n\t\tpublic void set_process_model (WebKit.ProcessModel process_model);\n\t\tpublic void set_spell_checking_enabled (bool enabled);\n\t\tpublic void set_spell_checking_languages ([CCode (array_length = false, array_null_terminated = true)] string[] languages);\n\t\tpublic void set_tls_errors_policy (WebKit.TLSErrorsPolicy policy);\n\t\tpublic void set_web_extensions_directory (string directory);\n\t\tpublic void set_web_extensions_initialization_user_data (GLib.Variant user_data);\n\t\tpublic signal void download_started (WebKit.Download download);\n\t\tpublic signal void initialize_web_extensions ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_web_inspector_get_type ()\")]\n\tpublic class WebInspector : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WebInspector ();\n\t\tpublic void close ();\n\t\tpublic uint get_attached_height ();\n\t\tpublic unowned string get_inspected_uri ();\n\t\tpublic unowned WebKit.WebViewBase get_web_view ();\n\t\tpublic bool is_attached ();\n\t\tpublic void show ();\n\t\tpublic uint attached_height { get; }\n\t\tpublic string inspected_uri { get; }\n\t\t[HasEmitter]\n\t\tpublic signal bool attach ();\n\t\tpublic signal bool bring_to_front ();\n\t\tpublic signal void closed ();\n\t\t[HasEmitter]\n\t\tpublic signal bool detach ();\n\t\tpublic signal bool open_window ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_web_resource_get_type ()\")]\n\tpublic class WebResource : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WebResource ();\n\t\tpublic async uint8 get_data (GLib.Cancellable? cancellable, out size_t length) throws GLib.Error;\n\t\tpublic unowned WebKit.URIResponse get_response ();\n\t\tpublic unowned string get_uri ();\n\t\tpublic WebKit.URIResponse response { get; }\n\t\tpublic string uri { get; }\n\t\tpublic signal void failed (void* error);\n\t\tpublic signal void finished ();\n\t\tpublic signal void received_data (uint64 data_length);\n\t\tpublic signal void sent_request (WebKit.URIRequest request, WebKit.URIResponse redirected_response);\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_web_view_get_type ()\")]\n\tpublic class WebView : WebKit.WebViewBase, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic WebView ();\n\t\tpublic async bool can_execute_editing_command (string command, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic bool can_go_back ();\n\t\tpublic bool can_go_forward ();\n\t\tpublic bool can_show_mime_type (string mime_type);\n\t\tpublic WebKit.Download download_uri (string uri);\n\t\tpublic void execute_editing_command (string command);\n\t\tpublic unowned WebKit.BackForwardList get_back_forward_list ();\n\t\tpublic unowned WebKit.WebContext get_context ();\n\t\tpublic unowned string get_custom_charset ();\n\t\tpublic double get_estimated_load_progress ();\n\t\tpublic unowned Cairo.Surface get_favicon ();\n\t\tpublic unowned WebKit.FindController get_find_controller ();\n\t\tpublic unowned WebKit.WebViewGroup get_group ();\n\t\tpublic unowned WebKit.WebInspector get_inspector ();\n\t\tpublic unowned WebKit.WebResource get_main_resource ();\n\t\tpublic uint64 get_page_id ();\n\t\tpublic unowned WebKit.Settings get_settings ();\n\t\tpublic async Cairo.Surface get_snapshot (WebKit.SnapshotRegion region, WebKit.SnapshotOptions options, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic unowned string get_title ();\n\t\tpublic bool get_tls_info (out unowned GLib.TlsCertificate certificate, out GLib.TlsCertificateFlags errors);\n\t\tpublic unowned string get_uri ();\n\t\tpublic WebKit.ViewMode get_view_mode ();\n\t\tpublic unowned WebKit.WindowProperties get_window_properties ();\n\t\tpublic double get_zoom_level ();\n\t\tpublic void go_back ();\n\t\tpublic void go_forward ();\n\t\tpublic void go_to_back_forward_list_item (WebKit.BackForwardListItem list_item);\n\t\tpublic void load_alternate_html (string content, string content_uri, string? base_uri);\n\t\tpublic void load_html (string content, string? base_uri);\n\t\tpublic void load_plain_text (string plain_text);\n\t\tpublic void load_request (WebKit.URIRequest request);\n\t\tpublic void load_uri (string uri);\n\t\tpublic Gtk.Widget new_with_related_view ();\n\t\tpublic void reload ();\n\t\tpublic void reload_bypass_cache ();\n\t\tpublic async WebKit.JavascriptResult run_javascript (string script, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic async WebKit.JavascriptResult run_javascript_from_gresource (string resource, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic async GLib.InputStream save (WebKit.SaveMode save_mode, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic async bool save_to_file (GLib.File file, WebKit.SaveMode save_mode, GLib.Cancellable? cancellable) throws GLib.Error;\n\t\tpublic void set_custom_charset (string? charset);\n\t\tpublic void set_settings (WebKit.Settings settings);\n\t\tpublic void set_view_mode (WebKit.ViewMode view_mode);\n\t\tpublic void set_zoom_level (double zoom_level);\n\t\tpublic void stop_loading ();\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic WebView.with_context (WebKit.WebContext context);\n\t\t[CCode (has_construct_function = false, type = \"GtkWidget*\")]\n\t\tpublic WebView.with_group (WebKit.WebViewGroup group);\n\t\tpublic double estimated_load_progress { get; }\n\t\tpublic void* favicon { get; }\n\t\tpublic WebKit.WebViewGroup group { get; construct; }\n\t\t[NoAccessorMethod]\n\t\tpublic bool is_loading { get; }\n\t\tpublic WebKit.WebView related_view { construct; }\n\t\tpublic string title { get; }\n\t\tpublic string uri { get; }\n\t\tpublic WebKit.ViewMode view_mode { get; set; }\n\t\t[NoAccessorMethod]\n\t\tpublic WebKit.WebContext web_context { owned get; construct; }\n\t\tpublic double zoom_level { get; set; }\n\t\tpublic virtual signal bool authenticate (WebKit.AuthenticationRequest request);\n\t\tpublic virtual signal void close ();\n\t\tpublic virtual signal bool context_menu (WebKit.ContextMenu context_menu, Gdk.Event event, WebKit.HitTestResult hit_test_result);\n\t\tpublic virtual signal void context_menu_dismissed ();\n\t\tpublic signal Gtk.Widget create ();\n\t\tpublic virtual signal bool decide_policy (WebKit.PolicyDecision decision, WebKit.PolicyDecisionType type);\n\t\tpublic virtual signal bool enter_fullscreen ();\n\t\tpublic virtual signal void insecure_content_detected (WebKit.InsecureContentEvent event);\n\t\tpublic virtual signal bool leave_fullscreen ();\n\t\tpublic virtual signal void load_changed (WebKit.LoadEvent load_event);\n\t\tpublic virtual signal bool load_failed (WebKit.LoadEvent load_event, string failing_uri, void* error);\n\t\tpublic virtual signal bool load_failed_with_tls_errors (WebKit.CertificateInfo info, string host);\n\t\tpublic virtual signal void mouse_target_changed (WebKit.HitTestResult hit_test_result, uint modifiers);\n\t\tpublic virtual signal bool permission_request (WebKit.PermissionRequest permission_request);\n\t\tpublic virtual signal bool print (WebKit.PrintOperation print_operation);\n\t\tpublic virtual signal void ready_to_show ();\n\t\tpublic virtual signal void resource_load_started (WebKit.WebResource resource, WebKit.URIRequest request);\n\t\tpublic virtual signal void run_as_modal ();\n\t\tpublic virtual signal bool run_file_chooser (WebKit.FileChooserRequest request);\n\t\tpublic virtual signal bool script_dialog (WebKit.ScriptDialog dialog);\n\t\tpublic virtual signal void submit_form (WebKit.FormSubmissionRequest request);\n\t\tpublic virtual signal bool web_process_crashed ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_web_view_base_get_type ()\")]\n\tpublic class WebViewBase : Gtk.Container, Atk.Implementor, Gtk.Buildable {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WebViewBase ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_web_view_group_get_type ()\")]\n\tpublic class WebViewGroup : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tpublic WebViewGroup (string? name);\n\t\tpublic void add_user_style_sheet (string source, string? base_uri, [CCode (array_length = false, array_null_terminated = true)] string[]? whitelist, [CCode (array_length = false, array_null_terminated = true)] string[]? blacklist, WebKit.InjectedContentFrames injected_frames);\n\t\tpublic unowned string get_name ();\n\t\tpublic unowned WebKit.Settings get_settings ();\n\t\tpublic void remove_all_user_style_sheets ();\n\t\tpublic void set_settings (WebKit.Settings settings);\n\t\tpublic WebKit.Settings settings { get; set; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_window_properties_get_type ()\")]\n\tpublic class WindowProperties : GLib.Object {\n\t\t[CCode (has_construct_function = false)]\n\t\tprotected WindowProperties ();\n\t\tpublic bool get_fullscreen ();\n\t\tpublic Gdk.Rectangle get_geometry ();\n\t\tpublic bool get_locationbar_visible ();\n\t\tpublic bool get_menubar_visible ();\n\t\tpublic bool get_resizable ();\n\t\tpublic bool get_scrollbars_visible ();\n\t\tpublic bool get_statusbar_visible ();\n\t\tpublic bool get_toolbar_visible ();\n\t\tpublic bool fullscreen { get; construct; }\n\t\tpublic Cairo.RectangleInt geometry { get; construct; }\n\t\tpublic bool locationbar_visible { get; construct; }\n\t\tpublic bool menubar_visible { get; construct; }\n\t\tpublic bool resizable { get; construct; }\n\t\tpublic bool scrollbars_visible { get; construct; }\n\t\tpublic bool statusbar_visible { get; construct; }\n\t\tpublic bool toolbar_visible { get; construct; }\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", type_id = \"webkit_permission_request_get_type ()\")]\n\tpublic interface PermissionRequest : GLib.Object {\n\t\tpublic abstract void allow ();\n\t\tpublic abstract void deny ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_AUTHENTICATION_SCHEME_\", type_id = \"webkit_authentication_scheme_get_type ()\")]\n\tpublic enum AuthenticationScheme {\n\t\tDEFAULT,\n\t\tHTTP_BASIC,\n\t\tHTTP_DIGEST,\n\t\tHTML_FORM,\n\t\tNTLM,\n\t\tNEGOTIATE,\n\t\tCLIENT_CERTIFICATE_REQUESTED,\n\t\tSERVER_TRUST_EVALUATION_REQUESTED,\n\t\tUNKNOWN\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_CACHE_MODEL_\", type_id = \"webkit_cache_model_get_type ()\")]\n\tpublic enum CacheModel {\n\t\tDOCUMENT_VIEWER,\n\t\tWEB_BROWSER,\n\t\tDOCUMENT_BROWSER\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_CONTEXT_MENU_ACTION_\", type_id = \"webkit_context_menu_action_get_type ()\")]\n\tpublic enum ContextMenuAction {\n\t\tNO_ACTION,\n\t\tOPEN_LINK,\n\t\tOPEN_LINK_IN_NEW_WINDOW,\n\t\tDOWNLOAD_LINK_TO_DISK,\n\t\tCOPY_LINK_TO_CLIPBOARD,\n\t\tOPEN_IMAGE_IN_NEW_WINDOW,\n\t\tDOWNLOAD_IMAGE_TO_DISK,\n\t\tCOPY_IMAGE_TO_CLIPBOARD,\n\t\tCOPY_IMAGE_URL_TO_CLIPBOARD,\n\t\tOPEN_FRAME_IN_NEW_WINDOW,\n\t\tGO_BACK,\n\t\tGO_FORWARD,\n\t\tSTOP,\n\t\tRELOAD,\n\t\tCOPY,\n\t\tCUT,\n\t\tPASTE,\n\t\tDELETE,\n\t\tSELECT_ALL,\n\t\tINPUT_METHODS,\n\t\tUNICODE,\n\t\tSPELLING_GUESS,\n\t\tNO_GUESSES_FOUND,\n\t\tIGNORE_SPELLING,\n\t\tLEARN_SPELLING,\n\t\tIGNORE_GRAMMAR,\n\t\tFONT_MENU,\n\t\tBOLD,\n\t\tITALIC,\n\t\tUNDERLINE,\n\t\tOUTLINE,\n\t\tINSPECT_ELEMENT,\n\t\tOPEN_VIDEO_IN_NEW_WINDOW,\n\t\tOPEN_AUDIO_IN_NEW_WINDOW,\n\t\tCOPY_VIDEO_LINK_TO_CLIPBOARD,\n\t\tCOPY_AUDIO_LINK_TO_CLIPBOARD,\n\t\tTOGGLE_MEDIA_CONTROLS,\n\t\tTOGGLE_MEDIA_LOOP,\n\t\tENTER_VIDEO_FULLSCREEN,\n\t\tMEDIA_PLAY,\n\t\tMEDIA_PAUSE,\n\t\tMEDIA_MUTE,\n\t\tDOWNLOAD_VIDEO_TO_DISK,\n\t\tDOWNLOAD_AUDIO_TO_DISK,\n\t\tCUSTOM\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_COOKIE_POLICY_ACCEPT_\", type_id = \"webkit_cookie_accept_policy_get_type ()\")]\n\tpublic enum CookieAcceptPolicy {\n\t\tALWAYS,\n\t\tNEVER,\n\t\tNO_THIRD_PARTY\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_COOKIE_PERSISTENT_STORAGE_\", type_id = \"webkit_cookie_persistent_storage_get_type ()\")]\n\tpublic enum CookiePersistentStorage {\n\t\tTEXT,\n\t\tSQLITE\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_CREDENTIAL_PERSISTENCE_\", type_id = \"webkit_credential_persistence_get_type ()\")]\n\tpublic enum CredentialPersistence {\n\t\tNONE,\n\t\tFOR_SESSION,\n\t\tPERMANENT\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_FIND_OPTIONS_\", type_id = \"webkit_find_options_get_type ()\")]\n\t[Flags]\n\tpublic enum FindOptions {\n\t\tNONE,\n\t\tCASE_INSENSITIVE,\n\t\tAT_WORD_STARTS,\n\t\tTREAT_MEDIAL_CAPITAL_AS_WORD_START,\n\t\tBACKWARDS,\n\t\tWRAP_AROUND\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_HIT_TEST_RESULT_CONTEXT_\", type_id = \"webkit_hit_test_result_context_get_type ()\")]\n\t[Flags]\n\tpublic enum HitTestResultContext {\n\t\tDOCUMENT,\n\t\tLINK,\n\t\tIMAGE,\n\t\tMEDIA,\n\t\tEDITABLE,\n\t\tSCROLLBAR\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_INJECTED_CONTENT_FRAMES_\", type_id = \"webkit_injected_content_frames_get_type ()\")]\n\tpublic enum InjectedContentFrames {\n\t\tALL,\n\t\tTOP_ONLY\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_INSECURE_CONTENT_\", type_id = \"webkit_insecure_content_event_get_type ()\")]\n\tpublic enum InsecureContentEvent {\n\t\tRUN,\n\t\tDISPLAYED\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_LOAD_\", type_id = \"webkit_load_event_get_type ()\")]\n\tpublic enum LoadEvent {\n\t\tSTARTED,\n\t\tREDIRECTED,\n\t\tCOMMITTED,\n\t\tFINISHED\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_NAVIGATION_TYPE_\", type_id = \"webkit_navigation_type_get_type ()\")]\n\tpublic enum NavigationType {\n\t\tLINK_CLICKED,\n\t\tFORM_SUBMITTED,\n\t\tBACK_FORWARD,\n\t\tRELOAD,\n\t\tFORM_RESUBMITTED,\n\t\tOTHER\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_POLICY_DECISION_TYPE_\", type_id = \"webkit_policy_decision_type_get_type ()\")]\n\tpublic enum PolicyDecisionType {\n\t\tNAVIGATION_ACTION,\n\t\tNEW_WINDOW_ACTION,\n\t\tRESPONSE\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_PRINT_OPERATION_RESPONSE_\", type_id = \"webkit_print_operation_response_get_type ()\")]\n\tpublic enum PrintOperationResponse {\n\t\tPRINT,\n\t\tCANCEL\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_PROCESS_MODEL_\", type_id = \"webkit_process_model_get_type ()\")]\n\tpublic enum ProcessModel {\n\t\tSHARED_SECONDARY_PROCESS,\n\t\tMULTIPLE_SECONDARY_PROCESSES\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_SAVE_MODE_\", type_id = \"webkit_save_mode_get_type ()\")]\n\tpublic enum SaveMode {\n\t\tMHTML\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_SCRIPT_DIALOG_\", type_id = \"webkit_script_dialog_type_get_type ()\")]\n\tpublic enum ScriptDialogType {\n\t\tALERT,\n\t\tCONFIRM,\n\t\tPROMPT\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_SNAPSHOT_OPTIONS_\", type_id = \"webkit_snapshot_options_get_type ()\")]\n\t[Flags]\n\tpublic enum SnapshotOptions {\n\t\tNONE,\n\t\tINCLUDE_SELECTION_HIGHLIGHTING\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_SNAPSHOT_REGION_\", type_id = \"webkit_snapshot_region_get_type ()\")]\n\tpublic enum SnapshotRegion {\n\t\tVISIBLE,\n\t\tFULL_DOCUMENT\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_TLS_ERRORS_POLICY_\", type_id = \"webkit_tls_errors_policy_get_type ()\")]\n\tpublic enum TLSErrorsPolicy {\n\t\tIGNORE,\n\t\tFAIL\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_VIEW_MODE_\", type_id = \"webkit_view_mode_get_type ()\")]\n\tpublic enum ViewMode {\n\t\tWEB,\n\t\tSOURCE\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_DOWNLOAD_ERROR_\")]\n\tpublic errordomain DownloadError {\n\t\tNETWORK,\n\t\tCANCELLED_BY_USER,\n\t\tDESTINATION;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_FAVICON_DATABASE_ERROR_\")]\n\tpublic errordomain FaviconDatabaseError {\n\t\tNOT_INITIALIZED,\n\t\tFAVICON_NOT_FOUND,\n\t\tFAVICON_UNKNOWN;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_JAVASCRIPT_ERROR_SCRIPT_\")]\n\tpublic errordomain JavascriptError {\n\t\tFAILED;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_NETWORK_ERROR_\")]\n\tpublic errordomain NetworkError {\n\t\tFAILED,\n\t\tTRANSPORT,\n\t\tUNKNOWN_PROTOCOL,\n\t\tCANCELLED,\n\t\tFILE_DOES_NOT_EXIST;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_PLUGIN_ERROR_\")]\n\tpublic errordomain PluginError {\n\t\tFAILED,\n\t\tCANNOT_FIND_PLUGIN,\n\t\tCANNOT_LOAD_PLUGIN,\n\t\tJAVA_UNAVAILABLE,\n\t\tCONNECTION_CANCELLED,\n\t\tWILL_HANDLE_LOAD;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_POLICY_ERROR_\")]\n\tpublic errordomain PolicyError {\n\t\tFAILED,\n\t\tCANNOT_SHOW_MIME_TYPE,\n\t\tCANNOT_SHOW_URI,\n\t\tFRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE,\n\t\tCANNOT_USE_RESTRICTED_PORT;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_PRINT_ERROR_\")]\n\tpublic errordomain PrintError {\n\t\tGENERAL,\n\t\tPRINTER_NOT_FOUND,\n\t\tINVALID_PAGE_RANGE;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cprefix = \"WEBKIT_SNAPSHOT_ERROR_FAILED_TO_\")]\n\tpublic errordomain SnapshotError {\n\t\tCREATE;\n\t\tpublic static GLib.Quark quark ();\n\t}\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", instance_pos = 1.9)]\n\tpublic delegate void URISchemeRequestCallback (WebKit.URISchemeRequest request);\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cname = \"WEBKIT_EDITING_COMMAND_COPY\")]\n\tpublic const string EDITING_COMMAND_COPY;\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cname = \"WEBKIT_EDITING_COMMAND_CUT\")]\n\tpublic const string EDITING_COMMAND_CUT;\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cname = \"WEBKIT_EDITING_COMMAND_PASTE\")]\n\tpublic const string EDITING_COMMAND_PASTE;\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cname = \"WEBKIT_EDITING_COMMAND_REDO\")]\n\tpublic const string EDITING_COMMAND_REDO;\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cname = \"WEBKIT_EDITING_COMMAND_SELECT_ALL\")]\n\tpublic const string EDITING_COMMAND_SELECT_ALL;\n\t[CCode (cheader_filename = \"webkit2/webkit2.h\", cname = \"WEBKIT_EDITING_COMMAND_UNDO\")]\n\tpublic const string EDITING_COMMAND_UNDO;\n}\n"
  },
  {
    "path": "guanako/CMakeLists.txt",
    "content": "#\n# guanako/CMakeLists.txt\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\ncmake_minimum_required(VERSION \"2.8.4\")\n\ninclude(\"${CMAKE_SOURCE_DIR}/cmake/guanako.cmake\")\ninclude(\"${CMAKE_SOURCE_DIR}/cmake/Common.cmake\")\n\nif(CMAKE_MAJOR_VERSION GREATER \"2\")\n  cmake_policy(SET CMP0048 NEW)\n  project(\"${project_name}\" VERSION \"${${project_name}_VERSION}\" LANGUAGES \"C\")\nelse()\n  project(\"${project_name}\" \"C\")\nendif()\nstring(TOLOWER \"${project_name}\" project_name_lower)\n\n# export (sub)project version\nif(project_root)\n  set(\"${project_name}_VERSION\" \"${${project_name}_VERSION}\" PARENT_SCOPE)\nendif()\n\nset(bindir \"bin\")\nset(datarootdir \"share\")\nset(libdir \"lib\")\nset(includedir \"include\")\nset(datadir \"${datarootdir}/${project_name_lower}\")\nset(uidir \"${datadir}/ui\")\nif(NOT project_root OR NOT datadir)\n  set(datadir \"${datarootdir}/${project_name_lower}\")\nendif()\nset(localedir \"${datarootdir}/locale\")\nset(appdir \"${datarootdir}/applications\")\nset(gsettingsdir \"${datarootdir}/glib-2.0/schemas\")\nset(pixrootdir \"${datarootdir}/pixmaps\")\nset(pixdir \"${pixrootdir}/${project_name_lower}\")\nset(docdir \"${datadir}/doc\")\nset(mandir \"${datarootdir}/man\")\nset(mimedir \"${datarootdir}/mime/packages\")\nif(CMAKE_INSTALL_PREFIX)\n  set(install_prefix \"${CMAKE_INSTALL_PREFIX}/\")\nelse()\n  set(install_prefix)\nendif()\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake/vala\")\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")\n\n\nfind_package(Vala \"0.20\" REQUIRED)\n\n\nset(pc_prefix ${CMAKE_INSTALL_PREFIX})\nset(pc_exec_prefix \"\\${prefix}\")\nset(pc_libdir \"\\${exec_prefix}/${libdir}\")\nset(pc_includedir \"\\${prefix}/${includedir}\")\nset(pc_datarootdir \"\\${prefix}/${datarootdir}\")\nset(pc_vapidir \"\\${datarootdir}/vala-${VALA_SHORTVER}/vapi\")\nset(pc_version \"${${project_name}_VERSION}\")\n\n\n# Custom library version checks.\nset(definitions)\nset(vapidirs)\nfind_package(PkgConfig)\n# config\nlist(REMOVE_ITEM required_pkgs \"config {nocheck,nolink}\")\n# libvala-X.Y\nif(VALA_SHORTVER STREQUAL \"0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_20\")\nelseif(VALA_SHORTVER STREQUAL \"0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_20\")\nelseif(VALA_SHORTVER STREQUAL \"0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_20\")\nelseif(VALA_SHORTVER STREQUAL \"0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_26\")\nelseif(VALA_SHORTVER STREQUAL \"0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND definitions \"VALAC_0_26\")\nelseif(VALA_SHORTVER STREQUAL \"0.30\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(APPEND definitions \"VALAC_0_26\")\nelse()\n  list(REMOVE_ITEM required_pkgs \"libvala-0.20\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.22\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.24\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.26\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.28\")\n  list(REMOVE_ITEM required_pkgs \"libvala-0.30\")\n  list(APPEND required_pkgs \"libvala-${VALA_SHORTVER}\")\n  list(APPEND definitions \"VALAC_0_20\")\nendif()\n# glib-2.0\npkg_check_modules(GLIB2.0 REQUIRED \"glib-2.0\")\n\n\n# Configure template files.\nset(stripped_pkgs)\nset(stripped_pkgs_pkgconfig)\nforeach(pkgstr ${required_pkgs})\n  set(matchit)\n  string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nocheck[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit ${pkgstr})\n  string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkg ${pkgstr})\n  if(NOT matchit)\n    list(APPEND stripped_pkgs_pkgconfig \"${pkg}\")\n  endif()\n\n  string(REGEX REPLACE \"^([^ \\t]+).*\" \"\\\\1\"  pkg_pkgconfig \"${pkgstr}\")\n  list(APPEND stripped_pkgs \"${pkg_pkgconfig}\")\nendforeach()\nbase_list_to_delimited_string(pc_requirements\n  DELIM \" \"\n  BASE_LIST ${stripped_pkgs_pkgconfig}\n)\nconfigure_file(\"${project_name_lower}.pc.in\" \"${project_name_lower}.pc\" @ONLY)\n\nbase_list_to_delimited_string(deps_requirements\n  DELIM \"\\n\"\n  BASE_LIST ${stripped_pkgs}\n)\nconfigure_file(\"${project_name_lower}.deps.in\" \"${project_name_lower}.deps\")\n\n\nset(default_vala_flags\n  \"--thread\"\n  \"--target-glib\" \"${GLIB2.0_VERSION}\"\n  \"--enable-experimental\"\n  #\"--fatal-warnings\"\n)\n\ninclude(ValaPkgs)\nvala_pkgs(VALA_C\n  PACKAGES\n    ${required_pkgs}\n  DEFINITIONS\n    ${definitions}\n  OPTIONAL\n    ${optional_pkgs}\n  SRCFILES\n    ${srcfiles}\n  VAPIS\n    ${vapifiles}\n  LIBRARY\n    \"${project_name_lower}\"\n  GIRFILE\n    \"${project_name}-${${project_name}_VERSION}\"\n  OPTIONS\n    ${default_vala_flags}\n    ${vapidirs}\n)\n\nadd_library(\"${project_name_lower}\" SHARED ${VALA_C})\nset_target_properties(\"${project_name_lower}\" PROPERTIES\n    VERSION \"${${project_name}_VERSION}\"\n    SOVERSION \"${soversion}\"\n)\ntarget_link_libraries(\"${project_name_lower}\" ${PROJECT_LDFLAGS})\nadd_definitions(${PROJECT_C_FLAGS})\n\n# Set common C-macros.\nadd_definitions(-DPACKAGE_NAME=\"${project_name}\")\nadd_definitions(-DPACKAGE_VERSION=\"${${project_name}_VERSION}\")\nif(project_root)\n  add_definitions(-DGETTEXT_PACKAGE=\"${project_root}\")\nelse()\n  add_definitions(-DGETTEXT_PACKAGE=\"${project_name_lower}\")\nendif()\nadd_definitions(-DPACKAGE_DATA_DIR=\"${install_prefix}${datadir}\")\nadd_definitions(-DPACKAGE_UI_DIR=\"${install_prefix}${uidir}\")\nadd_definitions(-DLOCALE_DIR=\"${install_prefix}${localedir}\")\nadd_definitions(-DPIXMAP_DIR=\"${install_prefix}${pixdir}\")\nadd_definitions(-DVALA_VERSION=\"${VALA_SHORTVER}\")\n\ninstall(TARGETS \"${project_name_lower}\" DESTINATION \"${libdir}\")\ninstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.pc\" DESTINATION \"lib/pkgconfig\")\ninstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.h\" DESTINATION \"${includedir}\")\nset(vapi_files \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.deps\" \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.vapi\")\ninstall(FILES ${vapi_files} DESTINATION \"${VALA_VAPIDIR}\")\ninstall(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${project_name}-${${project_name}_VERSION}.gir\" DESTINATION \"${datarootdir}/gir-1.0\")\ninstall(FILES \"${CMAKE_CURRENT_SOURCE_DIR}/data/syntax\" DESTINATION \"${datadir}\")\ninstall(FILES \"${CMAKE_CURRENT_SOURCE_DIR}/data/${project_name_lower}.lang\" DESTINATION \"${datarootdir}/gtksourceview-3.0/language-specs\")\n\n# Install user interface files if used and copy them to build directory.\nset(uifiles_build)\nforeach(uifile ${uifiles})\n  add_custom_command(\n    OUTPUT\n      \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n    COMMAND\n      \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\" \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n    DEPENDS\n      \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\"\n    COMMENT \"\"\n  )\n  list(APPEND uifiles_build \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\")\n  install(FILES ${uifile} DESTINATION \"${uidir}\")\nendforeach()\nadd_custom_target(\"ui_copy_${project_name_lower}\" DEPENDS ${uifiles_build})\nadd_dependencies(\"${project_name_lower}\" \"ui_copy_${project_name_lower}\")\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "guanako/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string PACKAGE_NAME;\n    public const string PACKAGE_VERSION;\n    public const string GETTEXT_PACKAGE;\n    public const string PACKAGE_DATA_DIR;\n\n    public const string LOCALE_DIR;\n\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "guanako/data/guanako.lang",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n This file is part of Guanako.\n\n Copyright (C) 2012, 2013, Valama development team\n\n Guanako is free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n Guanako is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License along\n with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n-->\n<language id=\"guanako\" _name=\"Guanko\" version=\"2.0\" _section=\"Others\">\n    <metadata>\n        <property name=\"line-comment-start\">#</property>\n    </metadata>\n    <styles>\n        <style id=\"comment\" _name=\"Comment\" map-to=\"def:comment\"/>\n        <style id=\"entry-point\" _name=\"Entry Point\" map-to=\"def:function\"/>\n        <style id=\"operator\" _name=\"Operator\" map-to=\"def:keyword\"/>\n        <style id=\"whitespace\" _name=\"Whitespace Keyword\" map-to=\"def:string\"/>\n        <style id=\"variable\" _name=\"Variable\" map-to=\"sh:variable\"/>\n        <style id=\"inline-var\" _name=\"Inline Variable\" map-to=\"def:type\"/>\n        <style id=\"function\" _name=\"Function\" map-to=\"def:preprocessor\"/>\n        <style id=\"names\" _name=\"Names\" map-to=\"def:type\"/>\n        <!-- <style id=\"extra-info\" _name=\"Extra Information\" map-to=\"def:builtin\"/> -->\n    </styles>\n\n    <definitions>\n\n        <!-- Use this from sh.lang. -->\n        <!-- we cannot use def:shell-like-comment, because\n             m4.lang needs to replace this context -->\n        <context id=\"comment\" style-ref=\"comment\" end-at-line-end=\"true\" class=\"comment\" class-disabled=\"no-spell-check\">\n          <start>(?&lt;!\\S)#</start>\n          <include>\n            <context ref=\"def:in-comment\"/>\n          </include>\n        </context>\n\n        <context id=\"entry-point\" style-ref=\"entry-point\">\n            <match>\\b^init_[a-zA-Z_]+[ \\t]*$</match>\n        </context>\n\n        <context id=\"function\" style-ref=\"function\">\n            <match>\\b^[A-Z][a-zA-Z_]+[ \\t]*(:[ \\t]*[a-zA-Z_]+[ \\t]*)?$</match>\n        </context>\n\n        <context id=\"operator\" style-ref=\"operator\">\n            <!-- <keyword>\\|</keyword> -->\n            <match>[\\|]</match>\n        </context>\n\n        <context id=\"whitespace\" style-ref=\"whitespace\">\n            <match>\\??[_]+</match>\n        </context>\n\n        <context id=\"inline-var\" style-ref=\"inline-var\" end-at-line-end=\"true\">\n            <start>\\{</start><end>\\}\\>?</end>\n        </context>\n\n        <context id=\"variable\" style-ref=\"variable\">\n            <match>\\??\\$[a-zA-Z0-9_]+</match>\n        </context>\n\n        <context id=\"names\" style-ref=\"names\">\n            <match>\\*word</match>\n        </context>\n\n        <!-- <context id=\"extra-info\" style-ref=\"extra-info\"> -->\n        <!--     <start>\\<</start><end>\\></end> -->\n        <!-- </context> -->\n\n        <context id=\"guanako\" class=\"no-spell-check\">\n            <include>\n                <context ref=\"comment\"/>\n                <context ref=\"entry-point\"/>\n                <context ref=\"function\"/>\n                <context ref=\"operator\"/>\n                <context ref=\"inline-var\"/>\n                <context ref=\"variable\"/>\n                <context ref=\"whitespace\"/>\n                <context ref=\"names\"/>\n                <!-- <context ref=\"extra-info\"/> -->\n            </include>\n        </context>\n\n    </definitions>\n</language>\n"
  },
  {
    "path": "guanako/data/syntax",
    "content": "#\n# This file is part of Guanako\n#\n# Copyright (C) 2012, 2013, Valama development team\n#\n\ninit_method\n?_ $MetaLeftSide|$VarStatement|$IfStatement|$WhileStatement|$ForeachStatement|$ReturnStatement\n\ninit_deep_space\n?_ $UsingStatement|$NamespaceDeclaration|$ClassDeclaration|$FieldDeclaration\n\n# Using\n\nUsingStatement\nusing _ {@}>Namespace{child} ?$NamespaceChild{child} ?_ ;\n\nNamespaceChild : parent\n. {parent}>Namespace{child} ?$NamespaceChild{child}\n\nClassDeclaration\n?$AccessModifier ?$ClassAbstract class _ *word\n\nClassAbstract\nabstract _\n\nAccessModifier\npublic|private|internal _\n\nFieldDeclaration\n?$AccessModifier $Type _ *word ?_ $AssgEndAssg|;\n\nNamespaceDeclaration\nnamespace _ $NamespaceDeclarationNewName|$NamespaceDeclarationExisting\n\nNamespaceDeclarationNewName\n*word ?$NamespaceDeclarationNewNameChild\nNamespaceDeclarationNewNameChild\n. *word ?$NamespaceDeclarationNewNameChild\n\nNamespaceDeclarationExisting\n{@}>Namespace{child} ?$NamespaceDeclarationExistingChild{child}\n\nNamespaceDeclarationExistingChild : parent\n. {parent}>Namespace{child} ?$NamespaceDeclarationExistingChild{child}|?$NamespaceDeclarationNewNameChild\n\n# ==============\n# All kinds of statements\n# ==============\n\nReturnStatement\nreturn _ $BoolExp ?_ ;\n\nIfStatement\nif ?_ ( ?_ $BoolExp ?_ ) $Block\n\nWhileStatement\nwhile ?_ ( ?_ $BoolExp ?_ ) $Block\n\nForeachStatement\nforeach ?_ ( ?_ $Type _ *word _ in _ $Value ?_ ) $Block\n\nBlock\n?_ ~{|$init_method\n\n# ==============\n# Boolean expression\n# ==============\n\nBoolExp\n$BoolExpOptComp|$BoolExpNeg|$BoolExpBrackets ?$BoolExpAnd\n# $Value should be limited to bool values\n#|$BoolExpOr\n\nBoolExpOptComp\n$Value|true|false ?$BoolExpComp\n\nBoolExpComp\n_ $BoolExpValComp|$BoolExpTypeComp\n\nBoolExpValComp\n==|<=|>=|!=|<|> _ $BoolExp\n\nBoolExpTypeComp\nis _ $Type\n\nBoolExpNeg\n! ?_ $BoolExp\n\n#BoolExpOr\n#$BoolExpComp|$BoolExpNeg|$BoolExpBrackets _ || _ $BoolExp\n\nBoolExpAnd\n_ && _ $BoolExp\n\nBoolExpBrackets\n( ?_ $BoolExp ?_ )\n\n# ==============\n# var declaration\n# ==============\n\nVarStatement\nvar _ *word $AssgEndAssg\n\n\n# ==============\n# Big rule covering function calls, signal connecting and assignments\n# ==============\n\nMetaLeftSide\n$AssgInst{@}|$AssgStat{@}\n\nAssgIterInst : parent\n. $AssgInst{parent}\n\nAssgIterStat : parent\n. $AssgStat{parent}\n\nAssgInst : parent\n$AssgInstContinue{parent}|$AssgChildSignalConnect{parent}|$AssgChildMethodInst{parent}\nAssgInstContinue : parent\n$ChildVariableInst{parent}>{a}|$ChildPropertyInst{parent}>{a} $AssgIterInst{a}|$AssgEndAssg\n\nAssgStat : parent\n$AssgChildTypeStat{parent}|$AssgChildNamespaceStat{parent}|$AssgChildVariablesStat{parent}|$AssgChildMethodStat{parent}\n\nAssgChildNamespaceStat : parent\n{parent}>Namespace{a} $AssgIterStat{a}\n\nAssgChildTypeStat : parent\n{parent}>Class{a}|{parent}>Struct{a} $AssgIterStat{a}|$MLSdeclaration\n\nAssgChildVariablesStat : parent\n$ChildVariableStat{parent}>{a}|$ChildPropertyStat{parent}>{a} $AssgIterInst{a}|$AssgEndAssg\n\n# TODO: Handle arrays\nAssgChildMethodStat : parent\n{parent}>Method<static>{a} push_cur>{a} ?_ $ParamBrackets pop_cur>{a} ?_ $AssgIterInst{a}|;\n\nAssgChildMethodInst : parent\n{parent}>Method<instance>{a} push_cur>{a} ?_ $ParamBrackets pop_cur>{a} ?_ $AssgIterInst{a}|;\n\nAssgChildSignalConnect : parent\n{parent}>Signal{a} .connect ?_ ( ?_ $MethodName ?_ ) ?_ ;\n\nAssgEndAssg\n?_ = ?_ $BoolExp|$NewType ?_ ;\n\nMLSdeclaration\n?$ArrayBracketsOptContent ?_ *word $AssgEndAssg|;\n\n# ==============\n# Parameter brackets (e.g. for method calls)\n# ==============\n\nParamBrackets\n( ?_ ?$ParamBracketsChild ?_ )\nParamBracketsChild\n?$ParamBracketsMod $BoolExp ?$ParamBracketsIter\nParamBracketsIter\n?_ , ?_ $ParamBracketsChild\nParamBracketsMod\nref|out _\n\n# ==============\n# A value that could be used for assignments etc\n# ==============\n\nValue\n$ValInst{@}|$ValStat{@}|$ValString|$ValNumber\n\nValString\n\" *string \"\n\nValNumber\n*number ?$ValNumberDecimal ?f\n\nValNumberDecimal\n. *number\n\nValIterInst : parent\n. $ValInst{parent}\n\nValIterStat : parent\n. $ValStat{parent}\n\nValInst : parent\n$ChildVariableInst{parent}>{a}|$ChildPropertyInst{parent}>{a}|$ValChildMethodInst{parent}|$ChildConst{parent}>{a} ?$ValIterInst{a}\n\nValStat : parent\n$ValChildStuffStat{parent}|$ValChildVariablesStat{parent}|$ValChildMethodStat{parent}\n\nValChildStuffStat : parent\n{parent}>Namespace{a}|{parent}>Class{a} $ValIterStat{a}\n\nValChildVariablesStat : parent\n$ChildVariableStat{parent}>{a}|$ChildPropertyStat{parent}>{a}|$ChildConst{parent}>{a}|{parent}>Enum{a} ?$ValIterInst{a}\n\n# TODO: Handle arrays\nValChildMethodStat : parent\n{parent}>Method<static>{a} push_cur>{a} ?_ $ParamBrackets pop_cur>{a} ?_ ?$ValIterInst{a}\n\nValChildMethodInst : parent\n{parent}>Method<instance>{a} push_cur>{a} ?_ $ParamBrackets pop_cur>{a} ?_ ?$ValIterInst{a}\n\n\n# ==============\n# An instance creation\n# ==============\n\n# TODO: Correct struct initialization\nNewType\nnew _ $Type>{a} $NewTypeCreationCall{a}|$ArrayBracketsWithContent\n\nNewTypeCreationCall : parent\n?$NewTypeCreationMth{parent}>{parent} push_cur>{parent} ?_ $ParamBrackets pop_cur>{parent}\n\nNewTypeCreationMth : parent\n. {parent}>CreationMethod{ret}\n\n\nArrayBracketsWithContent\n?_ [ $ArrayBracketsContent ]\n\nArrayBracketsOptContent\n?_ [ ?$ArrayBracketsContent ]\n\nArrayBracketsContent\n?_ $Value ?$ArrayBracketsContentRep ?_\n\nArrayBracketsContentRep\n?_ , ?_ $Value ?$ArrayBracketsContentRep\n\n# ==============\n# A class or a struct\n# ==============\n\nType\n$TypeNamespace{@}>{ret}|$TypeClass{@}>{ret}\n\nTypeIter : parent\n. $TypeNamespace{parent}>{ret}|$TypeClass{parent}>{ret}\n\nTypeNamespace : parent\n{parent}>Namespace{a} $TypeIter{a}>{ret}\n\nTypeClass : parent\n{parent}>Class{ret}|{parent}>Struct{ret} ?$TypeIter{ret}>{ret}\n\n\n# ==============\n# Only the name of a method (e.g. for connecting a signal to it)\n# ==============\n\nMethodName\n$MethodNameStat{@}|$MethodNameInst{@}|{@}>Method\n\nMethodNameStat : parent\n$MethodNameStatClasses{parent}|$MethodNameStatVariables{parent}\n\nMethodNameStatClasses : parent\n{parent}>Namespace{a}|{parent}>Class{a} . $MethodNameStat{a}|{a}>Method<static>\nMethodNameStatVariables : parent\n{parent}>Field<static>{a}|{parent}>Property<static>{a} . $MethodNameInst{a}|{a}>Method<instance>\n\nMethodNameInst : parent\n{parent}>Field<instance>{a}|{parent}>Property<instance>{a} . $MethodNameInst{a}|{a}>Method<instance>\n\n\n# ==============\n# Helper functions to abstract single vs array types\n# ==============\n\nChildConst : parent\n{parent}>Constant<instance,array>{ret}|{parent}>Constant<instance,single>{ret}|$ChildConstArrEl{parent}>{ret}\nChildConstArrEl : parent\n{parent}>Constant<instance,arr_el>{ret} $ArrayBracketsWithContent\n\nChildVariableInst : parent\n{parent}>Field<instance,array>{ret}|{parent}>Field<instance,single>{ret}|$ChildVariableInstArrEl{parent}>{ret}\nChildVariableInstArrEl : parent\n{parent}>Field<instance,arr_el>{ret} $ArrayBracketsWithContent\n\nChildVariableStat : parent\n{parent}>Field<static,array>{ret}|{parent}>Field<static,single>{ret}|$ChildVariableStatArrEl{parent}>{ret}\nChildVariableStatArrEl : parent\n{parent}>Field<static,arr_el>{ret} $ArrayBracketsWithContent\n\nChildPropertyInst : parent\n{parent}>Property<instance,array>{ret}|{parent}>Property<instance,single>{ret}|$ChildPropertyInstArrEl{parent}>{ret}\nChildPropertyInstArrEl : parent\n{parent}>Property<instance,arr_el>{ret} $ArrayBracketsWithContent\n\nChildPropertyStat : parent\n{parent}>Property<static,array>{ret}|{parent}>Property<static,single>{ret}|$ChildPropertyStatArrEl{parent}>{ret}\nChildPropertyStatArrEl : parent\n{parent}>Property<static,arr_el>{ret} $ArrayBracketsWithContent\n\n"
  },
  {
    "path": "guanako/guanako.deps.in",
    "content": "@deps_requirements@\n"
  },
  {
    "path": "guanako/guanako.pc.in",
    "content": "prefix=@pc_prefix@\nexec_prefix=@pc_exec_prefix@\nlibdir=@pc_libdir@\nincludedir=@pc_includedir@\ndatarootdir=@pc_datarootdir@\nvapidir=@pc_vapidir@\n\nName: Guanako\nDescription: Guanako library\nVersion: @pc_version@\nRequires: @pc_requirements@\nLibs: -L${libdir} -lguanako\nCflags: -I${includedir}/\n"
  },
  {
    "path": "guanako/guanako.vala",
    "content": "/*\n * guanako/guanako.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Vala;\nusing Gee;\n\nnamespace Guanako {\n    /**\n     * Enable debug information.\n     */\n    public bool debug = false;\n\n    public static void init (bool reload = false) {\n        load_vapi_dirs (reload);\n        load_available_packages (reload);\n    }\n\n    public class CompletionProposal {\n        public CompletionProposal (Symbol smb, int rep_length) {\n            this.symbol = smb;\n            this.replace_length = rep_length;\n        }\n        public Symbol symbol;\n        public int replace_length;\n    }\n\n    public class Project {\n        CodeContext context;\n        CodeContext context_internal;\n        ParserExt parser;\n        int glib_major;\n        int glib_minor;\n        Type? manual_report;\n        bool initialized = false;\n\n        /**\n         * Manually added packages.\n         */\n        public TreeSet<string> packages { get; private set; }\n        /**\n         * Manually added source files.\n         */\n        public TreeSet<SourceFile> sourcefiles { get; private set; }\n\n        /**\n         * All enabled defines.\n         */\n        public TreeSet<string> defines { get; private set; }\n        /**\n         * Manually enabled defines.\n         */\n        public TreeSet<string> defines_manual { get; private set; }\n\n\n        public Project (string? filename = null,\n                        int glib_major = 2, int glib_minor = 18) throws IOError, Error {\n            context_internal = new CodeContext();\n            parser = new ParserExt();\n            packages = new TreeSet<string>();\n            sourcefiles = new TreeSet<SourceFile>();\n            defines = new TreeSet<string>();\n            defines_manual = new TreeSet<string>();\n            context_internal.report = new Reporter();\n            manual_report = null;\n\n            this.glib_major = glib_major;\n            this.glib_minor = glib_minor;\n\n            context_prep (context_internal, glib_major, glib_minor, define_action_int);\n            context = context_internal;\n\n            build_syntax_map (filename);\n        }\n\n        public delegate void DefineAction (string define);\n\n        private inline void define_action_int (string define) {\n            defines.add (define);\n        }\n\n        /**\n         * Set {@link Vala.CodeContext} options and flags.\n         */\n        public static void context_prep (CodeContext context,\n                                         int? glib_major = null,\n                                         int? glib_minor = null,\n                                         DefineAction? action = null) {\n            context.target_glib_major = (glib_major != null) ? glib_major : 2;\n            context.target_glib_minor = (glib_minor != null) ? glib_minor : 18;\n            for (int i = 2; i <= context.target_glib_major; ++i)\n                for (int j = 16; j <= context.target_glib_minor; j += 2) {\n                    var define = \"GLIB_%d_%d\".printf (i, j);\n                    context.add_define (define);\n                    if (action != null)\n                        action (define);\n                }\n            var vala_ver = Config.VALA_VERSION.split (\".\", 2);\n            if (vala_ver[0] != null && vala_ver[1] != null)\n                for (int i = 0; i <= int.parse (vala_ver[0]); ++i)\n                    for (int j = 2; j <= int.parse (vala_ver[1]); j += 2) {\n                        var define = \"VALA_%d_%d\".printf (i, j);\n                        context.add_define (define);\n                        if (action != null)\n                            action (define);\n                    }\n            else\n                errmsg (_(\"Not a valid Vala version, will  not set VALA_X_Y defines: %s\\n\"),\n                               Config.VALA_VERSION);\n            context.profile = Profile.GOBJECT;\n            context.add_define (\"GOBJECT\");\n            if (action != null)\n                action (\"GOBJECT\");\n        }\n\n        public void set_glib_version (int glib_major, int glib_minor) {\n            this.glib_major = glib_major;\n            this.glib_minor = glib_minor;\n        }\n\n        public int[] get_glib_version() {\n            return new int[] {glib_major, glib_minor};\n        }\n\n        public inline SourceFile[] get_source_files (bool vapis = false) {\n            lock (context)\n                return get_source_files_int (context, vapis);\n        }\n\n        /*\n         * Not a beautiful piece of code, but necessary to convert from\n         * Vala.List.\n         */\n        private SourceFile[] get_source_files_int (CodeContext context, bool vapis = false) {\n            SourceFile[] files = new SourceFile[0];\n            foreach (SourceFile file in context.get_source_files())\n                if (vapis || file.file_type == SourceFileType.SOURCE)\n                    files += file;\n            return files;\n        }\n\n        public inline SourceFile[] get_vapis() {\n            lock (context)\n                return get_vapis_int (context);\n        }\n\n        private SourceFile[] get_vapis_int (CodeContext context) {\n            SourceFile[] files = new SourceFile[0];\n            foreach (SourceFile file in context.get_source_files())\n                if (file.file_type == SourceFileType.PACKAGE)\n                    files += file;\n            return files;\n        }\n\n        private bool add_source_file_int (SourceFile source_file) {\n            foreach (SourceFile file in get_source_files_int (context_internal, true))\n                if (file.filename == source_file.filename)\n                    return false;\n\n            switch (source_file.file_type) {\n                case SourceFileType.SOURCE:\n                    var ns_ref = new UsingDirective (new UnresolvedSymbol (null, \"GLib\"));\n                    source_file.add_using_directive (ns_ref);\n                    context_internal.root.add_using_directive (ns_ref);\n                    break;\n                case SourceFileType.PACKAGE:\n                    var basename = Path.get_basename (source_file.filename);\n                    context_internal.add_package (basename.substring(0, basename.length - 5));\n                    break;\n                default:\n                    break;\n            }\n\n            context_internal.add_source_file (source_file);\n            sourcefiles.add (source_file);\n            return true;\n        }\n\n        public SourceFile? get_source_file_by_name (string filename) {\n            lock (context)\n                foreach (SourceFile file in context.get_source_files())\n                    if (file.filename == filename)\n                        return file;\n            return null;\n        }\n\n        public SourceFile? add_source_file_by_name (string filename, bool is_vapi = false) {\n            lock (context_internal) {\n                SourceFile source_file;\n                if (is_vapi)\n                    source_file = new SourceFile (context_internal,\n                                                  SourceFileType.PACKAGE,\n                                                  filename);\n                else\n                    source_file = new SourceFile (context_internal,\n                                                  SourceFileType.SOURCE,\n                                                  filename);\n                if (!add_source_file_int (source_file))\n                    return null;\n                else if (is_vapi)\n                    debug_msg (_(\"Vapi found: %s\\n\"), filename);\n                lock (context)\n                    context = context_internal;\n                return source_file;\n            }\n        }\n\n        public inline void set_reporter (Type reptype) {\n            if (reptype.is_a (typeof (Reporter))) {\n                /* Don't overwrite errorlist if reporter is set later. */\n                // lock (context) {\n                    manual_report = reptype;\n                //     context.report = Object.new (reptype) as Reporter;\n                // }\n            } else\n                manual_report = null;\n        }\n\n        public inline Gee.ArrayList<Reporter.Error> get_errorlist() {\n            lock (context)\n                return (context.report as Reporter).errlist;\n        }\n\n        /*\n         * Update context manually.\n         */\n        public inline bool add_define (string define) {\n            if (!defines.add (define))\n                return false;\n            defines_manual.add (define);\n            return true;  // also if already defined\n        }\n\n        public inline void commit_defines() {\n            lock (context_internal) {\n                foreach (var define in defines_manual)\n                    context_internal.add_define (define);\n                lock (context)\n                    context = context_internal;\n            }\n        }\n\n        public inline bool remove_define (string define) {\n            return remove_defines (new string[] {define});\n        }\n\n        public inline bool remove_defines (string[] defines) {\n            bool found = false;\n            foreach (var define in defines)\n                if (define in defines_manual) {\n                    found = true;\n                    break;\n                }\n            if (!found)\n                return false;\n            update_complete ({}, {}, defines);\n            return true;\n        }\n\n        public inline bool remove_file (SourceFile file) {\n            return remove_files (new SourceFile[] {file});\n        }\n\n        public inline bool remove_files (SourceFile[] files) {\n            var flist = new string[0];\n            foreach (var file in files)\n                foreach (var sf in sourcefiles)\n                    if (file.filename == sf.filename)\n                        flist += file.filename;\n            if (flist.length == 0)\n                return false;\n            update_complete (flist);\n            return true;\n        }\n\n        public Symbol root_symbol {\n            get {\n                lock (context)\n                    return context.root;\n            }\n        }\n\n        public string[] add_packages (string[] package_names, bool auto_update) {\n            lock (context_internal) {\n                string[] missing_packages = new string[0];\n\n                var old_deps = get_package_dependencies_int (context_internal, packages.to_array());\n                foreach (var pkg in packages)\n                    if (!(pkg in old_deps))\n                        old_deps += pkg;\n\n                var new_deps = new string[0];\n\n                /* Collect all new dependencies coming with the new packages */\n                foreach (var pkg in get_package_dependencies_int (context_internal, package_names))\n                    if (!(pkg in old_deps) && !(pkg in new_deps)) {\n                        var vapi_path = context_internal.get_vapi_path (pkg);\n                        if (vapi_path == null) {\n                            warning_msg (_(\"Vapi for package %s not found.\\n\"), pkg);\n                            missing_packages += pkg;\n                            continue;\n                        }\n                        debug_msg (_(\"Vapi found: %s\\n\"), vapi_path);\n                        context_internal.add_external_package (pkg);\n                        new_deps += pkg;\n                    }\n\n                foreach (var pkg in package_names) {\n                    /* Add the new packages that aren't dependencies. */\n                    if (!(pkg in new_deps)) {\n                        var vapi_path = context_internal.get_vapi_path (pkg);\n                        if (vapi_path == null) {\n                            warning_msg (_(\"Vapi for package %s not found.\\n\"), pkg);\n                            missing_packages += pkg;\n                            continue;\n                        }\n                        debug_msg (_(\"Vapi found: %s\\n\"), vapi_path);\n                        context_internal.add_external_package (pkg);\n                        new_deps += pkg;\n                    }\n                    packages.add (pkg);\n                }\n\n                /* Update completion info of all the new packages */\n                if (auto_update)\n                    foreach (var pkg in new_deps) {\n                        var vapi_path = context_internal.get_vapi_path (pkg);\n                        var pkg_file = get_source_file_int (context_internal, vapi_path);\n                        if (pkg_file == null) {\n                            errmsg (_(\"Could not load vapi: %s\\n\"), vapi_path);\n                            missing_packages += pkg;\n                            packages.remove (pkg);\n                            continue;\n                        }\n                        update_file (pkg_file);\n                    }\n\n                lock (context)\n                    context = context_internal;\n                return missing_packages;\n            }\n        }\n\n        public inline SourceFile? search_pkg (string pkg) {\n            lock (context)\n                return search_pkg_int (context, pkg);\n        }\n\n        private SourceFile? search_pkg_int (CodeContext context, string pkg) {\n            foreach (var file in context.get_source_files())\n                if (file.file_type == SourceFileType.PACKAGE) {\n                    var basename = Path.get_basename (file.filename);\n                    if (basename.substring (0, basename.length - 5) == pkg)\n                        return file;\n                }\n            return null;\n        }\n\n        public inline SourceFile? get_source_file (string filename) {\n            lock (context)\n                return get_source_file_int (context, filename);\n        }\n\n        private SourceFile? get_source_file_int (CodeContext context, string filename) {\n            foreach (SourceFile file in context.get_source_files())\n                if (file.filename == filename)\n                    return file;\n            return null;\n        }\n\n        public void remove_package (string package_name) {\n            lock (context_internal) {\n                packages.remove (package_name);\n                var deps = get_package_dependencies_int (context_internal, packages.to_array());\n\n                var remove_candidates = get_package_dependencies_int (context_internal, new string[] {package_name});\n                remove_candidates += package_name;\n\n                /* Collect all dependencies of package_name that are not required any more */\n                var unused = new string[0];\n                foreach (string pkg in remove_candidates)\n                    if (!(pkg in deps) && !(pkg in packages))\n                        unused += pkg;\n\n                foreach (string pkg in unused) {\n                    packages.remove (pkg);\n                    var pkg_file = get_source_file_int (context_internal, context.get_vapi_path (pkg));\n                    if (pkg_file == null)\n                        continue;\n                    vanish_file (pkg_file);\n                }\n\n                lock (context)\n                    context = context_internal;\n            }\n        }\n\n        public inline void update() {\n            update_complete();\n        }\n\n        private void update_complete (string[] rm_files = {},\n                                      string[] rm_pkgs = {},\n                                      string[] rm_defines = {}) {\n            lock (context_internal) {\n                var old_sourcefiles = sourcefiles;\n                var old_packages = context_internal.get_packages();\n                sourcefiles = new TreeSet<SourceFile>();\n                foreach (var define in rm_defines)\n                    if (defines_manual.remove (define))\n                        defines.remove (define);\n\n                context_internal = new CodeContext();\n                context_prep (context_internal, glib_major, glib_minor, define_action_int);\n\n                parser = new ParserExt();\n                foreach (var sf in old_sourcefiles) {\n                    if (sf.filename in rm_files)\n                        continue;\n                    var sf_new = new SourceFile (context_internal,\n                                                 sf.file_type,\n                                                 sf.filename,\n                                                 sf.content,\n                                                 sf.from_commandline);\n                    switch (sf.file_type) {\n                        case SourceFileType.SOURCE:\n                            var ns_ref = new UsingDirective (new UnresolvedSymbol (null, \"GLib\"));\n                            sf_new.add_using_directive (ns_ref);\n                            context_internal.root.add_using_directive (ns_ref);\n                            break;\n                        case SourceFileType.PACKAGE:\n                            var basename = Path.get_basename (sf.filename);\n                            context_internal.add_package (basename.substring(0, basename.length - 5));\n                            break;\n                        default:\n                            break;\n                    }\n                    context_internal.add_source_file (sf_new);\n                    sourcefiles.add (sf_new);\n                }\n                //TODO: Use packages from context.get_source_files directly.\n                foreach (var pkg in old_packages) {\n                    if (pkg in rm_pkgs)\n                        continue;\n                    context_internal.add_external_package (pkg);\n                }\n                foreach (var define in defines_manual)\n                    context_internal.add_define (define);\n\n                update_int();\n                lock (context)\n                    context = context_internal;\n            }\n        }\n\n        public inline void init() {\n            if (!initialized)\n                lock (context_internal) {\n                    initialized = true;\n                    update_int();\n                    lock (context)\n                        context = context_internal;\n                }\n        }\n\n        private void update_int() {\n            if (manual_report == null)\n                context_internal.report = new Reporter();\n            else\n                context_internal.report = Object.new (manual_report) as Reporter;\n\n            CodeContext.push (context_internal);\n            parser.parse (context_internal);\n\n            context_internal.resolver.resolve (context_internal);\n            context_internal.analyzer.analyze (context_internal);\n            context_internal.flow_analyzer.analyze (context_internal);\n            CodeContext.pop();\n        }\n\n        void vanish_file (SourceFile file) {\n            var nodes = new Gee.LinkedList<Vala.CodeNode>();\n            foreach (var node in file.get_nodes())\n                nodes.add (node);\n            foreach (var node in nodes) {\n                file.remove_node (node);\n                if (node is Vala.Symbol) {\n                    var sym = (Vala.Symbol) node;\n                    if (sym.owner != null)\n                        /*\n                         * We need to remove it from the scope.\n                         */\n                        sym.owner.remove (sym.name);\n                    if (context_internal.entry_point == sym)\n                        context_internal.entry_point = null;\n                    sym.name = \"\";  //TODO: Find a less stupid solution...\n                }\n            }\n        }\n\n        public void update_file (Vala.SourceFile file, string? new_content = null) {\n            if (new_content != null)\n                file.content = new_content;\n            lock (context_internal) {\n                /*\n                 * Removing nodes in the same loop causes problems (probably\n                 * due to read-only list).\n                 */\n                debug_msg (\"Update source file: %s\\n\", file.filename);\n                (context_internal.report as Reporter).reset_file (file.filename);\n\n                vanish_file (file);\n\n                file.current_using_directives = new Vala.ArrayList<Vala.UsingDirective>();\n                if (file.file_type == SourceFileType.SOURCE) {\n                    var ns_ref = new Vala.UsingDirective (new Vala.UnresolvedSymbol (null, \"GLib\"));\n                    file.add_using_directive (ns_ref);\n                    context_internal.root.add_using_directive (ns_ref);\n                }\n\n                CodeContext.push (context_internal);\n                parser.parse_file (file);\n\n                context_internal.resolver.resolve (context_internal);\n                context_internal.analyzer.visit_source_file (file);\n                context_internal.flow_analyzer.visit_source_file (file);\n\n                CodeContext.pop();\n\n                lock (context)\n                    context = context_internal;\n                debug_msg (\"Source file update finished.\\n\");\n            }\n        }\n\n        void build_syntax_map (string? filename = null) throws IOError, Error {\n            string fname;\n            if (filename == null)\n                fname = Path.build_path (Path.DIR_SEPARATOR_S,\n                                         Config.PACKAGE_DATA_DIR,\n                                         \"syntax\");\n            else\n                fname = filename;\n            debug_msg (_(\"Load syntax file: %s\\n\"), fname);\n            var file = File.new_for_path (fname);\n            var dis = new DataInputStream (file.read());\n            string line;\n            while ((line = dis.read_line (null)) != null) {\n                if (line.strip() == \"\" || line.has_prefix (\"#\"))\n                    continue;\n\n                string[] rule_line_split = dis.read_line (null).split (\" \");\n                RuleExpression[] rule_exprs = new RuleExpression[rule_line_split.length];\n                for (int q = 0; q < rule_line_split.length; q++) {\n                    rule_exprs[q] = new RuleExpression();\n                    rule_exprs[q].expr = rule_line_split[q];\n                }\n\n                string[] namesplit = line.split_set (\" :,\");\n\n                string[] parameters = new string[0];\n                foreach (string splt in namesplit[1:namesplit.length])\n                    if (splt != \"\")\n                        parameters += splt;\n\n                map_syntax[namesplit[0]] = new SyntaxRule (parameters, rule_exprs);\n            }\n        }\n\n        class SyntaxRule {\n            public SyntaxRule (string[] parameters, RuleExpression[] rule) {\n                this.parameters = parameters;\n                this.rule = rule;\n            }\n            public string[] parameters;\n            public RuleExpression[] rule;\n        }\n        Gee.HashMap<string, SyntaxRule> map_syntax = new Gee.HashMap<string, SyntaxRule>();\n\n        internal class RuleExpression {\n            public string expr;\n            public int rule_id;\n            public RuleExpression clone() {\n                var ret = new RuleExpression();\n                ret.expr = this.expr;\n                ret.rule_id = this.rule_id;\n                return ret;\n            }\n        }\n\n        public class ProposalSet {\n            public ProposalSet() {\n                // TreeSet with custom sorting function\n                comp_sets = new TreeSet<CompletionProposal>[27];\n                for (int q = 0; q < 27; q++)\n                    comp_sets[q] = new TreeSet<CompletionProposal> ((a,b) => {\n                        var name_a = ((CompletionProposal)a).symbol.name;\n                        var name_b = ((CompletionProposal)b).symbol.name;\n                        var name_a_case = name_a.casefold();\n                        var name_b_case = name_b.casefold();\n                        if (name_a_case < name_b_case)\n                            return -1;\n                        if (name_a_case > name_b_case)\n                            return 1;\n                        if (name_a < name_b)\n                            return -1;\n                        if (name_a > name_b)\n                            return 1;\n\n                        return 0;\n                    });\n                // TRANSLATORS: Collector for completion proposals.\n                // This string is normally not visible.\n                thread_add_items = new Thread<void*> (_(\"Proposal collector\"), run_thread_add_items);\n            }\n\n            bool active = true;\n            void* run_thread_add_items (){\n                while (active) {\n                    if (queue.size == 0)\n                        loop_thread.run();\n                    CompletionProposal prop = null;\n                    lock (queue) {\n                        if (queue.size == 0)\n                            continue;\n                        prop = queue[0];\n                        queue.remove_at (0);\n                    }\n                    if (prop != null) {\n                        if (65 <= prop.symbol.name.data[0] <= 90)\n                            comp_sets[prop.symbol.name.data[0] - 64].add (prop);\n                        else if (97 <= prop.symbol.name.data[0] <= 122)\n                            comp_sets[prop.symbol.name.data[0] - 96].add (prop);\n                        else\n                            comp_sets[0].add (prop);\n                    }\n                }\n                return null;\n            }\n\n            public void wait_for_finish() {\n                while (queue.size > 0) { //TODO: Cleaner solution\n                    Thread.usleep (1000);\n                }\n                active = false;\n                loop_thread.quit();\n            }\n\n            MainLoop loop_thread = new MainLoop();\n            Gee.LinkedList<CompletionProposal> queue = new Gee.LinkedList<CompletionProposal>();\n            Thread<void*> thread_add_items;\n\n            public void add (CompletionProposal prop) {\n                lock (queue) {\n                    queue.add (prop);\n                }\n                loop_thread.quit();\n            }\n            public void add_all (ProposalSet add_set) {\n                lock (queue) {\n                    foreach (var s in add_set.comp_sets)\n                        queue.add_all (s);\n                }\n                loop_thread.quit();\n            }\n            public TreeSet<CompletionProposal>[] comp_sets;\n        }\n\n        public class CompletionRun {\n            public CompletionRun(Project parent_project) {\n                this.parent_project = parent_project;\n                universal_parameter = new CallParameter();\n                universal_parameter.name = \"@\";\n            }\n            public Gee.LinkedList<Symbol> cur_stack = new Gee.LinkedList<Symbol>();\n            Project parent_project;\n            int rule_id_count = 0;\n            Symbol[] accessible;\n            bool abort_flag = false;\n\n            private class CallParameter {\n                public int for_rule_id;\n                public string name;\n\n                bool _resolve_array = false;\n                public bool resolve_array{\n                    get {return _resolve_array;}\n                    set {\n                        _resolve_array = value;\n                        if (return_to_param != null)\n                            return_to_param.resolve_array = value;\n                    }\n                }\n\n                Symbol _symbol = null;\n                public Symbol symbol{\n                    get {return _symbol;}\n                    set {\n                        _symbol = value;\n                        if (return_to_param != null)\n                            return_to_param.symbol = value;\n                    }\n                }\n\n                public CallParameter? return_to_param = null;\n            }\n            CallParameter universal_parameter;\n            /*\n            * Clones a list of CallParameter's, including return dependencies\n            */\n            Gee.LinkedList<CallParameter> clone_param_list (Gee.LinkedList<CallParameter> param) {\n                var ret = new Gee.LinkedList<CallParameter>();\n                foreach (CallParameter p in param) {\n                    var new_param = new CallParameter();\n                    new_param.for_rule_id = p.for_rule_id;\n                    new_param.symbol = p.symbol;\n                    new_param.name = p.name;\n                    new_param.resolve_array = p.resolve_array;\n                    new_param.return_to_param = p.return_to_param;\n                    ret.add (new_param);\n                }\n                foreach (CallParameter r in ret)\n                    if (r.return_to_param != null)\n                        r.return_to_param = find_param (ret, r.return_to_param.name, r.return_to_param.for_rule_id);\n                return ret;\n            }\n\n            private Gee.LinkedList<Symbol> clone_symbol_list (Gee.LinkedList<Symbol> list) {\n                var ret = new Gee.LinkedList<Symbol>();\n                ret.add_all(list);\n                return ret;\n            }\n\n            private RuleExpression[] clone_rules (RuleExpression[] rules) {\n                RuleExpression[] rule = new RuleExpression[rules.length];\n                for (int q = 0; q < rule.length; q++)\n                    rule[q] = rules[q].clone();\n                return rule;\n            }\n\n            private CallParameter? find_param (Gee.LinkedList<CallParameter> array,\n                                    string name,\n                                    int rule_id) {\n                if (name == \"@\")\n                    return universal_parameter;\n                foreach (CallParameter param in array)\n                    if (param.name == name && param.for_rule_id == rule_id)\n                        return param;\n                return null;\n            }\n\n            public void abort_run () {\n                abort_flag = true;\n            }\n\n            public TreeSet<CompletionProposal>[]? run (SourceFile file, int line, int col, string written) {\n                var inside_symbol = parent_project.get_symbol_at_pos (file, line, col);\n\n                string initial_rule_name = \"\";\n                if (inside_symbol == null)\n                    initial_rule_name = \"init_deep_space\";\n                else\n                    initial_rule_name = \"init_method\";\n                accessible = parent_project.get_accessible_symbols (file, line, col);\n\n                if (!parent_project.map_syntax.has_key (initial_rule_name)) {\n                    error_msg (_(\"Entry point '%s' not found in syntax file. Trying to segfault me, huh??\"), initial_rule_name);\n                    return null;\n                }\n                Gee.LinkedList<Symbol> init_private_cur_stack = new Gee.LinkedList<Symbol>();\n\n                var ret = new ProposalSet();\n                compare (parent_project.map_syntax[initial_rule_name].rule, written, new Gee.LinkedList<CallParameter>(), 0, ref ret, ref init_private_cur_stack);\n                ret.wait_for_finish();\n                if (abort_flag)\n                    return null;\n                return ret.comp_sets;\n            }\n            private void compare (RuleExpression[] compare_rule,\n                                string written2,\n                                Gee.LinkedList<CallParameter> call_params,\n                                int depth, ref ProposalSet ret,\n                                ref Gee.LinkedList<Symbol> private_cur_stack) {\n                if (abort_flag)\n                    return;\n                /*\n                * For some reason need to create a copy... otherwise assigning new\n                * values to written doesn't work\n                */\n                string written = written2;\n\n                RuleExpression[] rule = new RuleExpression[compare_rule.length];\n                for (int q = 0; q < rule.length; q++)\n                    rule[q] = compare_rule[q].clone();\n                RuleExpression current_rule = rule[0];\n\n                //Uncomment this to see every step the parser takes in a tree structure\n                /*string depth_string = \"\";\n                for (int q = 0; q < depth; q++)\n                    depth_string += \" \";\n                stdout.printf (\"\\n\" + depth_string + \"Current rule: \" + current_rule.expr + \"\\n\" +\n                            depth_string + \"Written: \" + written + \"\\n\");*/\n\n                if (current_rule.expr.contains (\"|\")) {\n                    var splt = current_rule.expr.split (\"|\");\n                    var thdlist = new Thread<void*>[0];\n\n                    foreach (string s in splt) {\n                        /*\n                        * Need create a separate set of parameters here, as each branch might\n                        * assign different values (resulting in scrambled eggs)\n                        */\n                        var r = clone_rules (rule);\n                        r[0].expr = s;\n\n                        var pass_private_cur_stack = clone_symbol_list(private_cur_stack);\n                        thdlist += compare_threaded (this, r, written, clone_param_list (call_params), depth, ref ret, ref pass_private_cur_stack);\n                    }\n                    foreach (Thread<void*> thd in thdlist)\n                        thd.join();\n                    return;\n                }\n\n                if (current_rule.expr.has_prefix (\"?\")) {\n                    var pass_private_cur_stack1 = clone_symbol_list(private_cur_stack);\n                    if (rule.length > 1)\n                        compare (rule[1:rule.length], written, clone_param_list (call_params), depth + 1, ref ret, ref pass_private_cur_stack1);\n                    rule[0].expr = rule[0].expr.substring (1);\n                    var pass_private_cur_stack2 = clone_symbol_list(private_cur_stack);\n                    compare (rule, written, call_params, depth + 1, ref ret, ref pass_private_cur_stack2);\n                    return;\n                }\n\n                if (current_rule.expr.has_prefix (\"*word\")) {\n                    Regex r = /^(?P<word>\\w*)(?P<rest>.*)$/;\n                    MatchInfo info;\n                    if (!r.match (written, 0, out info))\n                        return;\n                    if (info.fetch_named (\"word\") == \"\")\n                        return;\n                    if (rule.length == 1)\n                        return;\n                    compare (rule[1:rule.length], info.fetch_named (\"rest\"), call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return;\n                }\n\n                if (current_rule.expr.has_prefix (\"*number\")) {\n                    Regex r = /^(?P<number>\\d*)(?P<rest>.*)$/;\n                    MatchInfo info;\n                    if (!r.match (written, 0, out info))\n                        return;\n                    if (info.fetch_named (\"number\") == null)\n                        return;\n                    if (rule.length == 1)\n                        return;\n                    compare (rule[1:rule.length], info.fetch_named (\"rest\"), call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return;\n                }\n\n                if (current_rule.expr.has_prefix (\"*string\")) {\n                    Regex r = /^(?P<word>.*?)+(?=\\\")(?P<rest>.*)$/; //\"// (This extra \"// stuff is just to get gtksourceview's highlighting back on track...)\n                    MatchInfo info;\n                    if (!r.match (written, 0, out info))\n                        return;\n                    if (info.fetch_named (\"word\") == null)\n                        return;\n                    compare (rule[1:rule.length], info.fetch_named (\"rest\"), call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return;\n                }\n\n                if (current_rule.expr == \"_\") {\n                    if (!(written.has_prefix (\" \") || written.has_prefix (\"\\t\")))\n                        return;\n                    written = written.chug();\n                    compare (rule[1:rule.length], written, call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return;\n                }\n\n                if (current_rule.expr.has_prefix (\"push_cur\")) {\n                    Regex r = /^push_cur\\>\\{(?P<param>\\w*)\\}$/;\n                    MatchInfo info;\n                    if (!r.match (current_rule.expr, 0, out info)) {\n                        errmsg (_(\"Malformed rule: '%s'\\n\"), compare_rule[0].expr);\n                        return;\n                    }\n                    var push_param = find_param (call_params, info.fetch_named (\"param\"), current_rule.rule_id);\n                    private_cur_stack.add (push_param.symbol);\n                    compare (rule[1:rule.length], written, call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return;\n                }\n                if (current_rule.expr.has_prefix (\"pop_cur\")) {\n                    Regex r = /^pop_cur\\>\\{(?P<param>\\w*)\\}$/;\n                    MatchInfo info;\n                    if (!r.match (current_rule.expr, 0, out info)) {\n                        errmsg (_(\"Malformed rule: '%s'\\n\"), compare_rule[0].expr);\n                        return;\n                    }\n                    var pop_param = find_param (call_params, info.fetch_named (\"param\"), current_rule.rule_id);\n                    for (int q = private_cur_stack.size - 1; q >= 0; q--)\n                        if (private_cur_stack[q] == pop_param.symbol) {\n                            private_cur_stack.remove_at(q);\n                            compare (rule[1:rule.length], written, call_params, depth + 1, ref ret, ref private_cur_stack);\n                            return;\n                        }\n                    warning_msg (_(\"pop_cur symbol not found! '%s'\\n\"), compare_rule[0].expr);\n                    return;\n                }\n\n                if (current_rule.expr.has_prefix (\"{\")) {\n                    Regex r = /^\\{(?P<parent>.*)\\}\\>(?P<child>\\w*)(\\<(?P<binding>.*)\\>)?(\\{(?P<write_to>\\w*)\\})?$/;\n                    MatchInfo info;\n                    if (!r.match (current_rule.expr, 0, out info)) {\n                        errmsg (_(\"Malformed rule: '%s'\\n\"), compare_rule[0].expr);\n                        return;\n                    }\n\n                    var parent_param_name = info.fetch_named (\"parent\");\n                    var child_type = info.fetch_named (\"child\");\n                    var binding = info.fetch_named (\"binding\");\n                    var write_to_param = info.fetch_named (\"write_to\");\n\n                    var parent_param = find_param (call_params, parent_param_name, current_rule.rule_id);\n                    if (parent_param == null) {\n                        errmsg (_(\"Variable '%s' not found! >%s<\\n\"), parent_param_name, compare_rule[0].expr);\n                        return;\n                    }\n                    Vala.List<Symbol>[] children;\n                    if (parent_param.symbol == null) {\n                        children = new Vala.List<Symbol>[1];\n                        children[0] = new Vala.ArrayList<Symbol>();\n                        foreach (Symbol child in accessible)\n                            if (symbol_is_type (child, child_type))\n                                children[0].add(child);\n                    } else {\n                        children = get_child_symbols_of_type (get_type_of_symbol (parent_param.symbol, parent_param.resolve_array), child_type);\n                    }\n\n                    Regex r2 = /^(?P<word>\\w*)(?P<rest>.*)$/;\n                    MatchInfo info2;\n                    if (!r2.match (written, 0, out info2))\n                        return;\n                    var word = info2.fetch_named (\"word\");\n                    var rest = info2.fetch_named (\"rest\");\n\n                    var thdlist = new Thread<void*>[0];\n                    bool match_found = false;\n                    foreach (Vala.List<Symbol> list in children)\n                        foreach (Symbol child in list) {\n                            if (binding != null)\n                                if (!symbol_has_binding (child, binding))\n                                    continue;\n                            if (word == child.name) {\n                                if (write_to_param != null) {\n                                    var target_param = find_param (call_params, write_to_param, current_rule.rule_id);\n                                    if (target_param == null) {\n                                        target_param = new CallParameter();\n                                        target_param.name = write_to_param;\n                                        target_param.for_rule_id = current_rule.rule_id;\n                                        call_params.add (target_param);\n                                    }\n                                    target_param.symbol = child;\n                                    target_param.resolve_array = binding != null && binding.contains (\"arr_el\");\n                                }\n                                thdlist += compare_threaded (this, rule[1:rule.length], rest, call_params, depth + 1, ref ret, ref private_cur_stack);\n                            }\n                            if (rest == \"\" && child.name.has_prefix (word) && child.name.length > word.length) {\n                                match_found = true;\n                                ret.add (new CompletionProposal (child, word.length));\n                            }\n                        }\n                    foreach (Thread<void*> thd in thdlist)\n                        thd.join();\n                    if (match_found) {\n                        if (private_cur_stack.size > 0)\n                            cur_stack = private_cur_stack;\n                    }\n                    return;\n                }\n                if (current_rule.expr.has_prefix (\"$\")) {\n                    Regex r = /^\\$(?P<call>\\w*)(\\{(?P<pass>(\\w*|\\@))\\})?(\\>\\{(?P<ret>.*)\\})?$/;\n                    MatchInfo info;\n                    if (!r.match (current_rule.expr, 0, out info)) {\n                        errmsg (_(\"Malformed rule: '%s'\\n\"), compare_rule[0].expr);\n                        return;\n                    }\n                    var call = info.fetch_named (\"call\");\n                    var pass_param = info.fetch_named (\"pass\");\n                    var ret_param = info.fetch_named (\"ret\");\n\n                    if (!parent_project.map_syntax.has_key (call)) {\n                        errmsg (_(\"Call '%s' not found in '%s'\\n\"), call, compare_rule[0].expr);\n                        return;\n                    }\n\n                    RuleExpression[] composit_rule = parent_project.map_syntax[call].rule;\n                    int local_rule_id_count;\n                    lock (rule_id_count) {\n                        rule_id_count ++;\n                        local_rule_id_count = rule_id_count;\n                    }\n                    foreach (RuleExpression subexp in composit_rule)\n                        subexp.rule_id = local_rule_id_count;\n\n                    foreach (RuleExpression exp in rule[1:rule.length])\n                        composit_rule += exp;\n\n                    if (pass_param != null && pass_param != \"\") {\n\n                        var child_param = new CallParameter();\n                        child_param.name = parent_project.map_syntax[call].parameters[0];\n                        child_param.for_rule_id = local_rule_id_count;\n                        var param = find_param (call_params, pass_param, current_rule.rule_id);\n                        if (param == null) {\n                            errmsg (_(\"Parameter '%s' not found in '%s'\\n\"), pass_param, compare_rule[0].expr);\n                            return;\n                        }\n                        child_param.symbol = param.symbol;\n                        child_param.resolve_array = param.resolve_array;\n                        call_params.add (child_param);\n\n                    }\n                    if (ret_param != null) {\n                        var ret_p = find_param (call_params, ret_param, current_rule.rule_id);\n                        if (ret_p == null) {\n                            ret_p = new CallParameter();\n                            ret_p.name = ret_param;\n                            ret_p.for_rule_id = current_rule.rule_id;\n                            call_params.add (ret_p);\n                        }\n                        var child_ret_p = new CallParameter();\n                        child_ret_p.name = \"ret\";\n                        child_ret_p.for_rule_id = local_rule_id_count;\n                        child_ret_p.return_to_param = ret_p;\n                        call_params.add (child_ret_p);\n                    }\n\n                    compare (composit_rule, written, call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return;\n                }\n\n                var matchstr = current_rule.expr;\n                if (matchstr.has_prefix(\"~\"))\n                    matchstr = matchstr.substring(1);\n                var mres = match (written, matchstr);\n\n                if (mres == MatchRes.COMPLETE) {\n                    written = written.substring (matchstr.length);\n                    if (rule.length == 1)\n                        return;\n                    compare (rule[1:rule.length], written, call_params, depth + 1, ref ret, ref private_cur_stack);\n                }\n                else if (mres == MatchRes.STARTED) {\n                    if (private_cur_stack.size > 0)\n                        cur_stack = private_cur_stack;\n                    ret.add (new CompletionProposal (new Struct (matchstr, null, null), written.length));\n                }\n                return;\n            }\n\n            static Symbol? get_type_of_symbol (Symbol smb, bool resolve_array) {\n                if (smb is Class || smb is Namespace || smb is Struct || smb is Enum)\n                    return smb;\n\n                DataType type = null;\n                if (smb is Property)\n                    type = ((Property) smb).property_type;\n                else if (smb is Variable)\n                    type = ((Variable) smb).variable_type;\n                else if (smb is Method)\n                    type = ((Method) smb).return_type;\n                else\n                    return null;\n\n                if (type is ArrayType) {\n                    if (resolve_array)\n                        return ((ArrayType)type).element_type.data_type;\n                    else\n                        return new Class (\"Array\");\n                }\n                return type.data_type;\n            }\n\n            static bool symbol_is_type (Symbol smb, string type) {\n                if (type == \"Parameter\" && smb is Vala.Parameter)\n                    return true;\n                // Simply treat LocalVariables as fields\n                if (type == \"Field\" && (smb is Field || smb is LocalVariable || smb is Vala.Parameter))\n                    return true;\n                if (type == \"Method\" && smb is Method)\n                    return true;\n                if (type == \"Class\" && smb is Class)\n                    return true;\n                if (type == \"Namespace\" && smb is Namespace)\n                    return true;\n                if (type == \"Enum\" && smb is Enum)\n                    return true;\n                if (type == \"Constant\" && smb is Constant)\n                    return true;\n                if (type == \"Property\" && smb is Property)\n                    return true;\n                if (type == \"Signal\" && smb is Vala.Signal)\n                    return true;\n                if (type == \"Struct\" && smb is Struct)\n                    return true;\n                return false;\n            }\n\n            static bool symbol_has_binding (Symbol smb, string? binding) {\n                if (binding == null)\n                    return true;\n\n                bool stat = binding.contains (\"static\");\n                bool inst = binding.contains (\"instance\");\n                bool arr = binding.contains (\"array\") || binding.contains (\"arr_el\");\n                bool sng = binding.contains (\"single\");\n\n                MemberBinding smb_binding = 0;\n                if (smb is Method)\n                    smb_binding = ((Method)smb).binding;\n                else if (smb is Field)\n                    smb_binding = ((Field)smb).binding;\n                else if (smb is Property)\n                    smb_binding = ((Property)smb).binding;\n\n                if (inst && smb_binding == MemberBinding.STATIC)\n                    return false;\n                if (stat && smb_binding == MemberBinding.INSTANCE)\n                    return false;\n\n                DataType type = null;\n                if (smb is Property)\n                    type = ((Property) smb).property_type;\n                else if (smb is Variable)\n                    type = ((Variable) smb).variable_type;\n                else if (smb is Method)\n                    type = ((Method) smb).return_type;\n                if (type != null) {\n                    if (!type.is_array() && arr)\n                        return false;\n                    if (type.is_array() && sng)\n                        return false;\n                }\n                return true;\n            }\n            enum MatchRes {\n                UNEQUAL,\n                STARTED,\n                COMPLETE\n            }\n\n            MatchRes match (string written, string target) {\n                if (written.length >= target.length)\n                    if (written.has_prefix (target))\n                        return MatchRes.COMPLETE;\n                if (target.length > written.length && target.has_prefix (written))\n                    return MatchRes.STARTED;\n                return MatchRes.UNEQUAL;\n            }\n\n            Thread<void*> compare_threaded (CompletionRun comp_run,\n                                            RuleExpression[] compare_rule,\n                                            string written,\n                                            Gee.LinkedList<CallParameter> call_params,\n                                            int depth,\n                                            ref ProposalSet ret, ref Gee.LinkedList<Symbol> private_cur_stack) {\n                var compare_thd = new CompareThread (comp_run, compare_rule, written, call_params, depth, ref ret, ref private_cur_stack);\n                return new Thread<void*> (_(\"Guanako Completion\"), compare_thd.run);\n            }\n\n            class CompareThread {\n                public CompareThread (CompletionRun comp_run,\n                                    RuleExpression[] compare_rule,\n                                    string written,\n                                    Gee.LinkedList<CallParameter> call_params,\n                                    int depth,\n                                    ref ProposalSet ret, ref Gee.LinkedList<Symbol> private_cur_stack) {\n                    this.comp_run = comp_run;\n                    this.compare_rule = compare_rule;\n                    this.call_params = call_params;\n                    this.depth = depth;\n                    this.written = written;\n                    this.private_cur_stack = private_cur_stack;\n                    this.ret = ret;\n                }\n                CompletionRun comp_run;\n                RuleExpression[] compare_rule;\n                Gee.LinkedList<CallParameter> call_params;\n                ProposalSet ret;\n                int depth;\n                string written;\n                Gee.LinkedList<Symbol> private_cur_stack;\n                public void* run() {\n                    comp_run.compare (compare_rule, written, call_params, depth + 1, ref ret, ref private_cur_stack);\n                    return null;\n                }\n            }\n        }\n\n        public Symbol[] get_accessible_symbols (SourceFile file, int line, int col) {\n            Symbol [] ret = new Symbol[0];\n            var current_symbol = get_symbol_at_pos (file, line, col);\n\n            if (current_symbol == null)\n                current_symbol = context.root;\n\n            foreach (UsingDirective directive in file.current_using_directives) {\n                var children = get_child_symbols (directive.namespace_symbol);\n                foreach (Symbol s in children)\n                    ret += s;\n            }\n\n            for (Scope scope = current_symbol.scope; scope != null; scope = scope.parent_scope)\n                foreach (Symbol s in scope.get_symbol_table().get_values())\n                    ret += s;\n\n            /*\n             * If we are inside a subroutine, propose all previously defined\n             * local variables.\n             */\n            if (current_symbol is Subroutine) {\n                var sr = (Subroutine) current_symbol;\n\n                Statement[] candidates = new Statement[0];\n                int[] depths = new int[0];\n\n                int last_depth = -1;\n                /* Add all statements before selected one to candidates. */\n\n                iter_subroutine (sr, (statement, depth) => {\n                    if (inside_source_ref (file, line, col, statement.source_reference)) {\n                        if (depth > last_depth)\n                            last_depth = depth;\n                        return IterCallbackReturns.CONTINUE;\n                    }\n                    if (before_source_ref (file, line, col, statement.source_reference)) {\n                        if (depth > last_depth)\n                            last_depth = depth;\n                        return IterCallbackReturns.ABORT_TREE;\n                    }\n                    if (statement is DeclarationStatement || statement is ForeachStatement) {\n                        candidates += statement;\n                        depths += depth;\n                    }\n                    return IterCallbackReturns.CONTINUE;\n                });\n\n                /*\n                 * Return all candidates with a lower or equal depth.\n                 */\n                for (int q = candidates.length - 1; q >= 0; q--) {\n                    if (depths[q] <= last_depth || last_depth == -1) {\n                        /*if (candidates[q] is ForStatement) {\n                            var expressions = ((ForStatement) candidates[q]).get_initializer();\n                            foreach (Expression expr in expressions) {\n                                stdout.printf (expr.symbol_reference.name + \"!!\\n\");\n                            }\n                            //if (fst.type_reference != null)\n                            //    ret += new Variable (fst.type_reference, fst.variable_name);\n                        }*/\n                        if (candidates[q] is ForeachStatement && depths[q] + 1 <= last_depth) {  //depth + 1, as iterator variable is only available inside the loop\n                            var fst = (ForeachStatement) candidates[q];\n                            if (fst.type_reference != null)\n                                ret += new Variable (fst.type_reference, fst.variable_name);\n                        }\n                        if (candidates[q] is DeclarationStatement) {\n                            var dsc = (DeclarationStatement) candidates[q];\n                            if (dsc.declaration != null)\n                                ret += dsc.declaration;\n                        }\n                        last_depth = depths[q];\n                    }\n                }\n\n            }\n\n            return ret;\n        }\n\n        public Symbol? get_symbol_at_pos (SourceFile source_file, int line, int col) {\n            Symbol ret = null;\n            int last_depth = -1;\n            lock (context)\n                iter_symbol (context.root,\n                             (smb, depth) => {\n                                if (smb.name != null) {\n                                    SourceReference sref = smb.source_reference;\n                                    if (sref == null)\n                                        return IterCallbackReturns.CONTINUE;\n\n                                    /*\n                                     * If the symbol is a subroutine, check its body's source\n                                     * reference.\n                                     */\n                                    if (smb is Subroutine) {\n                                        var sr = (Subroutine) smb;\n                                        if (sr.body != null)\n                                            sref = sr.body.source_reference;\n                                    }\n\n                                    /*\n                                     * Check source reference, do not check its children if outside\n                                     */\n                                    if (inside_source_ref (source_file, line, col, sref)) {\n                                        if (depth > last_depth) {  //Get symbol deepest in the tree\n                                            ret = smb;\n                                            last_depth = depth;\n                                        }\n                                    } else if (smb is Subroutine)\n                                        return IterCallbackReturns.ABORT_BRANCH;\n\n                                }\n                                return IterCallbackReturns.CONTINUE;\n                             });\n            return ret;\n        }\n\n        public string[] get_package_dependencies (string[] package_names) {\n            lock (context)\n                return get_package_dependencies_int (context, package_names);\n        }\n\n        private string[] get_package_dependencies_int (CodeContext context, string[] package_names) {\n            var deps = new ArrayQueue<string>();\n            var skip_pkgs = new string[0];  // circular dependencies\n\n            foreach (var package_name in package_names) {\n                if (package_name in skip_pkgs)\n                    continue;\n\n                var vapi_path = context.get_vapi_path (package_name);\n                if (vapi_path == null)\n                    continue;\n\n                var deps_file = File.new_for_path (vapi_path.substring (0, vapi_path.length - 5) + \".deps\");\n                if (deps_file.query_exists()) {\n                    try {\n                        var dis = new DataInputStream (deps_file.read());\n                        string dep;\n                        var start = true;\n                        while ((dep = dis.read_line (null)) != null) {\n                            if (!(dep in deps)) {\n                                deps.offer_head (dep);\n                                if (start) {\n                                    start = false;\n                                    // TRANSLATORS:\n                                    // There will be a list appended:\n                                    // Dependencies of 'package': dep1, dep2, dep3...\n                                    debug_msg (_(\"Dependencies of '%s': %s\"), package_name, dep);\n                                } else if (debug)\n                                    stdout.printf (\", %s\", dep);\n                            }\n                        }\n                        if (!start && debug)\n                            stdout.printf (\"\\n\");\n                    } catch (IOError e) {\n                        errmsg (_(\"Could not read line: %s\\n\"), e.message);\n                    } catch (Error e) {\n                        errmsg (_(\"Could not read file: %s\\n\"), e.message);\n                    }\n                }\n            }\n\n            var new_deps = new string[0];\n            foreach (var dep in deps)\n                if (dep in package_names)\n                    skip_pkgs += dep;\n                else if (!(dep in new_deps))\n                    new_deps += dep;\n            if (new_deps.length > 0)\n                foreach (var dep in get_package_dependencies_int (context, new_deps))\n                    deps.offer_head (dep);\n\n            return deps.to_array();\n        }\n\n        /**\n         * Wrap {@link CodeContext.get_packages} method.\n         */\n        //NOTE: \"get_packages\" name causes compiler error so change the name.\n        public inline Vala.List<string> get_context_packages() {\n            lock (context)\n                return context.get_packages();\n        }\n\n        /**\n         * Wrap {@link CodeContext.get_vapi_path} method.\n         */\n        public inline string? get_context_vapi_path (string package) {\n            lock (context)\n                return context.get_vapi_path (package);\n        }\n\n        public inline Vala.Map<string, Vala.Set<string>> get_defines_used() {\n            return parser.used_defines;\n        }\n     }\n\n    /**\n     * Print debug information if {@link debug} is `true`.\n     *\n     * @param format Format string.\n     * @param ... Arguments for format string.\n     */\n    private inline void debug_msg (string format, ...) {\n        if (debug)\n            stdout.printf (_(\"Guanako: \") + format.vprintf (va_list()));\n\n    }\n\n    public inline void warning_msg (string format, ...) {\n        stdout.printf (_(\"Guanako: \") + _(\"Warning: \") + format.vprintf (va_list()));\n    }\n\n    public inline void error_msg (string format, ...) {\n        stderr.printf (_(\"Guanako: \") + _(\"Error: \") + format.vprintf (va_list()));\n    }\n\n    public inline void msg (string format, ...) {\n        stdout.printf (_(\"Guanako: \") + format.vprintf (va_list()));\n    }\n\n    public inline void errmsg (string format, ...) {\n        stderr.printf (_(\"Guanako: \") + format.vprintf (va_list()));\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/guanako_auto_indent.vala",
    "content": "/*\n * guanako/guanako_auto_indent.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Vala;\n\nnamespace Guanako {\n    public static string auto_indent_buffer (Project project, SourceFile file) {\n        string[] lines = file.content.split (\"\\n\");\n        for (int q = 0; q < lines.length; q++)\n            lines[q] = lines[q].strip();\n\n        foreach (var node in file.get_nodes()) {\n            if (node is Symbol) {\n                var cls = node as Symbol;\n                iter_symbol (cls, (smb, depth) => {\n                    if (smb is Subroutine) {\n                        var sr = smb as Subroutine;\n                        iter_subroutine (sr, (s, depth2) => {\n                            for (int q = s.source_reference.begin.line - 1; q <= s.source_reference.end.line - 1; q++)\n                                for (int i = 0; i < 1 + depth2; i++)\n                                    lines[q] = \"    \" + lines[q];\n                            return IterCallbackReturns.CONTINUE;\n                        });\n                    }\n                    return IterCallbackReturns.CONTINUE;\n                });\n            }\n        }\n\n        string new_content = \"\";\n        for (int q = 0; q < lines.length; q++) {\n            new_content += lines[q];\n            if (q < lines.length - 1)\n                new_content += \"\\n\";\n        }\n        return new_content;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/guanako_frankenstein.vala",
    "content": "/*\n * guanako/guanako_frankenstein.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\nusing Vala;\n\nnamespace Guanako {\n    public class FrankenStein {\n        public FrankenStein() {\n            var pid = ((int)Posix.getpid()).to_string();\n            dbus_name = \"apps.valama.frankenstein\" + pid;\n            dbus_path = \"/apps/valama/frankenstein\";\n            build_frankenstein_mainblock();\n            owner_id = Bus.own_name (BusType.SESSION, dbus_name, BusNameOwnerFlags.NONE,\n                  on_bus_aquired,\n                  () => {},\n                  () => errmsg (_(\"Could not acquire name.\\n\")));\n        }\n        string dbus_name;\n        string dbus_path;\n        uint owner_id;\n\n        ~FrankenStein() {\n            Bus.unown_name (owner_id);\n        }\n\n        void on_bus_aquired (DBusConnection conn) {\n            try {\n                conn.register_object (dbus_path, new FrankenDBUS (this));\n            } catch (IOError e) {\n                errmsg (_(\"Could not register service.\\n\"));\n            }\n        }\n\n        [DBus (name = \"app.valama.frankenstein\")]\n        class FrankenDBUS : Object {\n            public FrankenDBUS (FrankenStein parent) {\n                this.parent = parent;\n            }\n            FrankenStein parent;\n            public void timer_finished (int timer_id, double time) {\n                if (timer_id >= parent.frankentimers.size)\n                    parent.received_invalid_id();\n                else\n                    parent.timer_finished (parent.frankentimers[timer_id], timer_id, time);\n            }\n            public void stop_reached (int stop_id) {\n                if (stop_id >= parent.frankenstops.size)\n                    parent.received_invalid_id();\n                else\n                    parent.stop_reached (parent.frankenstops[stop_id], stop_id);\n            }\n            public void line_reached (int line, string filename) {\n                parent.line_reached (line, filename);\n            }\n        }\n\n        public class FrankenTimer {\n            public FrankenTimer(SourceFile file, int start_line, int end_line, bool active) {\n                this.file = file;\n                this.start_line = start_line;\n                this.end_line = end_line;\n                this.active = active;\n            }\n            public SourceFile file;\n            public int start_line;\n            public int end_line;\n            public bool active;\n        }\n\n        public class FrankenStop {\n            public FrankenStop(SourceFile file, int line, bool active) {\n                this.file = file;\n                this.line = line;\n                this.active = active;\n            }\n            public SourceFile file;\n            public int line;\n            public bool active;\n        }\n\n        public Gee.ArrayList<FrankenTimer?> frankentimers = new Gee.ArrayList<FrankenTimer?>();\n        public Gee.ArrayList<FrankenStop?> frankenstops = new Gee.ArrayList<FrankenStop?>();\n        public signal void timer_finished (FrankenTimer timer, int timer_id, double time);\n        public signal void stop_reached (FrankenStop stop, int stop_id);\n        public signal void line_reached (int line, string filename);\n        public signal void received_invalid_id ();\n        public bool activate_frankenline = false;\n        public Guanako.Project project = null;\n\n        public string frankensteinify_sourcefile (SourceFile file) {\n            //FIXME: Don't read entire file into memory.\n            string[] lines = file.content.split (\"\\n\");\n            int cnt = 0;\n\n            if (activate_frankenline) {\n\n                foreach (CodeNode node in file.get_nodes()) {\n                    if (node is Subroutine) {\n                        var sr = (Subroutine)node;\n                        iter_subroutine (sr, (stmt, depth) => {\n                            var line = stmt.source_reference.begin.line;\n                            lines[line-1] = @\"frankenline ($line, \" + \"\"\"\"\"\"\" + file.filename + \"\"\"\"\"\"\" + \");\" + lines[line-1];\n                            return Guanako.IterCallbackReturns.CONTINUE;\n                        });\n                    }\n                    Guanako.iter_symbol ((Symbol)node, (smb, depth) => {\n                        if (smb is Subroutine) {\n                            var sr = (Subroutine)smb;\n                            iter_subroutine (sr, (stmt, depth) => {\n                                var line = stmt.source_reference.begin.line;\n                                lines[line-1] = @\"frankenline ($line, $(file.filename))\" + lines[line];\n                                return Guanako.IterCallbackReturns.CONTINUE;\n                            });\n                        }\n                        return Guanako.IterCallbackReturns.CONTINUE;\n                    });\n                }\n\n            }\n\n            foreach (FrankenTimer ftime in frankentimers) {\n                lines[ftime.start_line - 1] = @\"var frankentimer_$cnt = new GLib.Timer();\\n\"\n                                                + @\"frankentimer_$cnt.start();\\n\"\n                                                + lines[ftime.start_line - 1];\n                lines[ftime.end_line - 1] = @\"frankentimer_callback ($cnt, frankentimer_$cnt.elapsed());\\n\"\n                                            + lines[ftime.end_line - 1];\n                cnt++;\n            }\n            cnt = 0;\n            foreach (FrankenStop fstop in frankenstops) {\n                lines[fstop.line - 1] = @\"frankenstop_callback($cnt);\\n\" + lines[fstop.line - 1];\n                cnt++;\n            }\n            StringBuilder ret = new StringBuilder();\n            foreach (string line in lines)\n                ret.append (line + \"\\n\");\n            return ret.str;\n        }\n\n        public string frankenstein_mainblock { public get; private set; default = \"\";}\n\n        private void build_frankenstein_mainblock () {\n            frankenstein_mainblock = \"\"\"\n[DBus (name = \"app.valama.frankenstein\")]\ninterface FrankenDBUS : Object {\n    public abstract void timer_finished (int timer_id, double time) throws IOError;\n    public abstract void stop_reached (int stop_id) throws IOError;\n    public abstract void line_reached (int line, string filename) throws IOError;\n}\n\nstatic FrankenDBUS frankenstein_client = null;\nstatic void frankentimer_callback (int timer_id, double time) {\n    if (frankenstein_client == null) {\n        try {\n            frankenstein_client = Bus.get_proxy_sync (BusType.SESSION,\n                                                      \"\"\"\" + dbus_name + \"\"\"\", \"\"\"\" + dbus_path + \"\"\"\");\n        } catch (GLib.IOError e) {\n            stderr.printf (\"Failed to connect to DBus server: %s\\n\", e.message);\n        }\n    }\n    try {\n        frankenstein_client.timer_finished (timer_id, time);\n    } catch (GLib.IOError e) {\n        stderr.printf (\"Failed to send Frankentimer finished signal: %s\\n\", e.message);\n    }\n}\n\nstatic void frankenline (int line, string filename) {\n    if (frankenstein_client == null) {\n        try {\n            frankenstein_client = Bus.get_proxy_sync (BusType.SESSION,\n                                                      \"\"\"\" + dbus_name + \"\"\"\", \"\"\"\" + dbus_path + \"\"\"\");\n        } catch (GLib.IOError e) {\n            stderr.printf (\"Failed to connect to DBus server: %s\\n\", e.message);\n        }\n    }\n    try {\n        frankenstein_client.line_reached (line, filename);\n    } catch (GLib.IOError e) {\n        stderr.printf (\"Failed to send Frankenline reached signal: %s\\n\", e.message);\n    }\n}\n\nstatic void frankenstop_callback (int stop_id) {\n    if (frankenstein_client == null) {\n        try {\n            frankenstein_client = Bus.get_proxy_sync (BusType.SESSION,\n                                                      \"\"\"\" + dbus_name + \"\"\"\", \"\"\"\" + dbus_path + \"\"\"\");\n        } catch (GLib.IOError e) {\n            stderr.printf (\"Failed to connect to DBus server: %s\\n\", e.message);\n        }\n    }\n    try {\n        frankenstein_client.stop_reached (stop_id);\n    } catch (GLib.IOError e) {\n        stderr.printf (\"Failed to send Frankenstop reached signal: %s\\n\", e.message);\n    }\n}\"\"\";\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/guanako_helpers.vala",
    "content": "/*\n * guanako/guanako_helpers.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Vala;\n\nnamespace Guanako {\n    static Gee.ArrayList<string>? vapi_dirs = null;\n    public static Gee.BidirList<string> get_vapi_dirs() {\n        if (vapi_dirs == null)\n            return new Gee.ArrayList<string>().read_only_view;\n        return vapi_dirs.read_only_view;\n    }\n\n    static Gee.TreeMultiMap<string, string>? available_packages = null;\n    public static Gee.MultiMap<string, string> get_available_packages() {\n        if (available_packages == null)\n            return new Gee.TreeMultiMap<string, string>().read_only_view;\n        return available_packages.read_only_view;\n    }\n\n    public static inline string? get_vapi_path (string pkg, string[]? directories = null) {\n        return get_file_path (pkg, \".vapi\", directories);\n    }\n\n    public static inline string? get_deps_path (string pkg, string[]? directories = null) {\n        return get_file_path (pkg, \".deps\", directories);\n    }\n\n    private static string? get_file_path (string pkg, string ext, string[]? directories) {\n        if  (directories != null)\n            //TRANSLATORS: E.g.: Checking .vapi directory: /usr/share/vala/vapi\n            foreach (var dir in directories) {\n                debug_msg (\"Checking %s directory: %s\\n\", ext, dir);\n                var filename = Path.build_path (Path.DIR_SEPARATOR_S, dir, pkg + ext);\n                if (FileUtils.test (filename, FileTest.EXISTS))\n                    return filename;\n            }\n        foreach (var dir in get_vapi_dirs()) {\n            debug_msg (\"Checking %s directory: %s\\n\", ext, dir);\n            var filename = Path.build_path (Path.DIR_SEPARATOR_S, dir, pkg + ext);\n            if (FileUtils.test (filename, FileTest.EXISTS))\n                return filename;\n        }\n        return null;\n    }\n\n    public static bool load_vapi_dirs (bool reload = false) {\n        if (vapi_dirs == null)\n            vapi_dirs = new Gee.ArrayList<string>();\n        else if (reload)\n            vapi_dirs.clear();\n        else\n            return false;\n\n        /* Same order as in Vala.CodeContext.get_file_path . */\n        foreach (var dir in Environment.get_system_data_dirs())\n            vapi_dirs.add (Path.build_path (Path.DIR_SEPARATOR_S, dir, \"vala/vapi\"));\n        foreach (var dir in Environment.get_system_data_dirs())\n            vapi_dirs.add (Path.build_path (Path.DIR_SEPARATOR_S,\n                                            dir,\n                                            \"vala-\" + Config.VALA_VERSION,\n                                            \"vapi\"));\n\n        return true;\n    }\n\n    public inline static int compare_string_case_insensitive (string a, string b) {\n        return strcmp (a.down(), b.down());\n    }\n\n    /**\n     * Load Vala packages from filenames and sort them.\n     *\n     * @return `true` if actually (re)load packages else `false`.\n     */\n    public static bool load_available_packages (bool reload = false) {\n        if (available_packages == null)\n            available_packages = new Gee.TreeMultiMap<string, string> (compare_string_case_insensitive);\n        else if (reload)\n            available_packages.clear();\n        else\n            return false;\n\n        foreach (var path in get_vapi_dirs()) {\n            if (!FileUtils.test (path, FileTest.IS_DIR))\n                continue;\n            debug_msg (\"Checking %s directory: %s\\n\", \".vapi\", path);\n            try {\n                var enumerator = File.new_for_path (path).enumerate_children (FileAttribute.STANDARD_NAME, 0);\n                FileInfo file_info;\n                while ((file_info = enumerator.next_file()) != null) {\n                    var filename = file_info.get_name();\n                    if (filename.has_suffix (\".vapi\"))\n                        available_packages[filename.substring (0, filename.length - 5)] = filename;\n                }\n            } catch (GLib.Error e) {\n                msg (_(\"Could not update vapi files: %s\\n\"), e.message);\n            }\n        }\n\n        return true;\n    }\n\n     //Helper function for checking whether a given source location is inside a SourceReference\n    public static bool before_source_ref (SourceFile source_file,\n                                          int source_line,\n                                          int source_col,\n                                          SourceReference? reference) {\n        if (reference == null)\n            return false;\n\n        if (reference.file != source_file)\n            return false;\n        if (reference.begin.line > source_line)\n            return true;\n        if (reference.begin.line == source_line && reference.begin.column > source_col)\n            return true;\n        return false;\n    }\n\n    public static bool after_source_ref (SourceFile source_file,\n                                         int source_line,\n                                         int source_col,\n                                         SourceReference? reference) {\n        if (reference == null)\n            return false;\n\n        if (reference.file != source_file)\n            return false;\n        if (reference.end.line < source_line)\n            return true;\n        if (reference.end.line == source_line && reference.end.column < source_col)\n            return true;\n        return false;\n    }\n\n    public static bool inside_source_ref (SourceFile source_file,\n                                          int source_line,\n                                          int source_col,\n                                          SourceReference? reference) {\n        if (reference == null)\n            return false;\n\n        if (reference.file != source_file)\n            return false;\n        if (reference.begin.line > source_line || reference.end.line < source_line)\n            return false;\n        if (reference.begin.line == source_line && reference.begin.column > source_col)\n            return false;\n        if (reference.end.line == source_line && reference.end.column < source_col)\n            return false;\n        return true;\n    }\n\n    public static string symbolsig_to_string (Symbol smb, bool? fullsig = false,\n                                            bool? fullname = false, string format = \" \",\n                                            string formatfst = \"\", string formatlst = \"\") {\n        var lblstr = new StringBuilder();\n        if (smb is Method) {\n            var mth = (Method) smb;\n            var relname = mth.get_full_name();\n\n            if (fullsig != null && fullsig) {\n                switch (mth.access) {\n                    case SymbolAccessibility.INTERNAL:\n                        lblstr.append (\"internal \");\n                        break;\n                    case SymbolAccessibility.PRIVATE:\n                        lblstr.append (\"private \");\n                        break;\n                    case SymbolAccessibility.PROTECTED:\n                        lblstr.append (\"protected \");\n                        break;\n                    case SymbolAccessibility.PUBLIC:\n                        lblstr.append (\"public \");\n                        break;\n                    default:\n                        errmsg (_(\"No valid %s type: %u - %s\\n\"),\n                                \"SymbolAccessibility\", mth.access,\n                                \"CompletionProposal.proposal\");\n                        errmsg (_(\"Please report a bug!\\n\"));\n                        break;\n                }\n                if (mth.binding == MemberBinding.STATIC)\n                    lblstr.append (\"static \");\n\n                if (mth.is_async_callback)\n                    lblstr.append (\"async \");\n                if (mth.is_inline)\n                    lblstr.append (\"inline \");\n\n                if (mth.is_abstract)\n                    lblstr.append (\"abstract \");\n                else if (mth.overrides)\n                    lblstr.append (\"override \");\n                else if (mth.is_virtual)\n                    lblstr.append (\"virtual \");\n            }\n\n            if (mth.has_result) {\n                if (!mth.return_type.value_owned)\n                    lblstr.append (\"unowned \");\n                if (fullname == null)\n                    lblstr.append (datatype_to_string (mth.return_type, relname) + \" \");\n                else if (fullname)\n                    lblstr.append (datatype_to_string (mth.return_type, \"\") + \" \");\n                else\n                    lblstr.append (datatype_to_string (mth.return_type, null) + \" \");\n            } else if (!(smb is CreationMethod))\n                lblstr.append (\"void \");\n\n            if (fullname == null) {\n                lblstr.append (mth.get_full_name() + \" (\" + formatfst);\n                if (fullsig == null && mth.get_parameters().size > 0)\n                    lblstr.append (\"..\");\n                else\n                    lblstr.append (parameters_to_string (mth.get_parameters(), relname, format));\n            } else if (fullname) {\n                lblstr.append (relname + \" (\" + formatfst);\n                if (fullsig == null && mth.get_parameters().size > 0)\n                    lblstr.append (\"..\");\n                else\n                    lblstr.append (parameters_to_string (mth.get_parameters(), \"\", format));\n            } else {\n                lblstr.append (mth.name + \" (\" + formatfst);\n                if (fullsig == null && mth.get_parameters().size > 0)\n                    lblstr.append (\"..\");\n                else\n                    lblstr.append (parameters_to_string (mth.get_parameters(), null, format));\n            }\n            lblstr.append (formatlst + \")\");\n\n            if (fullsig != null && fullsig) {\n                foreach (var precond in mth.get_preconditions())\n                    lblstr.append (\"\\nrequires (\" + expression_to_string (precond) + \")\");\n                foreach (var postcond in mth.get_postconditions())\n                    lblstr.append (\"\\nensures (\" + expression_to_string (postcond) + \")\");\n            }\n            //TODO: deprecated and experimental\n        } else if (smb is Class) {\n            //TODO: base types\n            if (fullsig != null) {\n                var mth = ((Class) smb).default_construction_method;\n                if (mth != null) {\n                    var relname = mth.get_full_name();\n\n                    if (fullname == null) {\n                        lblstr.append (smb.get_full_name() + \" (\" + formatfst);\n                        lblstr.append (parameters_to_string (mth.get_parameters(), relname, format));\n                    } else if (fullname) {\n                        lblstr.append (smb.get_full_name() + \" (\" + formatfst);\n                        lblstr.append (parameters_to_string (mth.get_parameters(), \"\", format));\n                    } else {\n                        lblstr.append (smb.name + \" (\" + formatfst);\n                        lblstr.append (parameters_to_string (mth.get_parameters(), null, format));\n                    }\n                    lblstr.append (formatlst + \")\");\n                } else\n                    lblstr.append (smb.name);\n            } else\n                lblstr.append (smb.name);\n        } else {\n            //TODO: All other possible types.\n            if (fullname == null || fullname)\n                lblstr.append (smb.get_full_name());\n            else\n                lblstr.append (smb.name);\n        }\n        return lblstr.str;\n    }\n\n    private static string get_symbol_rel_name (Symbol smb, string? relsmb) {\n        if (relsmb == null)\n            return smb.name;\n        else if (relsmb == \"\")\n            return smb.get_full_name();\n        else {\n            var s = smb.get_full_name();\n            if (s.has_prefix (relsmb)) {\n                if (s[relsmb.length + 1] == '.')\n                    return s[relsmb.length:s.length];\n                else\n                    return s[relsmb.length + 1:s.length];\n            } else\n                return s;\n        }\n    }\n\n    private static string parameters_to_string (Vala.List<Vala.Parameter>? prms, string? relname, string format) {\n        var lblstr = new StringBuilder();\n        for (int q = 0; q < prms.size; q++) {\n            if (prms[q].ellipsis) {\n                lblstr.append (\"...\");\n                break;\n            }\n\n            switch (prms[q].direction) {\n                case ParameterDirection.OUT:\n                    lblstr.append (\"out \");\n                    break;\n                case ParameterDirection.REF:\n                    lblstr.append (\"ref \");\n                    break;\n                default:\n                    // if (prms[q].variable_type.is_weak())\n                    //     lblstr.append (\"weak \");\n                    if (prms[q].variable_type.value_owned)  //TODO: possible?\n                        lblstr.append (\"owned \");\n                    break;\n            }\n\n            lblstr.append (datatype_to_string (prms[q].variable_type, relname));\n            lblstr.append (\" \" + get_symbol_rel_name (prms[q], relname));\n\n            if (prms[q].initializer != null)\n                lblstr.append (\" = \" + expression_to_string (prms[q].initializer));\n\n            if (q < prms.size - 1)\n                lblstr.append (\",\" + format);\n\n        }\n        return lblstr.str;\n    }\n\n    private static string expression_to_string (Expression e) {\n        if (e is BinaryExpression) {\n            var be = (BinaryExpression) e;\n            return \"%s %s %s\".printf (expression_to_string (be.left),\n                                      binary_operator_to_string (be.operator),\n                                      expression_to_string (be.right));\n        }\n        if (e is UnaryExpression) {\n            var ue = (UnaryExpression) e;\n            return \"%s%s\".printf (unary_operator_to_string (ue.operator),\n                                  expression_to_string (ue.inner));\n        }\n        if (e is ArrayCreationExpression) {\n            var ace = (ArrayCreationExpression) e;\n            var str = datatype_to_string (ace.element_type, null);\n            if (ace.initializer_list != null) {\n                var initializer_list = ace.initializer_list.get_initializers();\n                if (initializer_list.size > 0) {\n                    var lblstr = new StringBuilder (\"{\" + expression_to_string (initializer_list[0]));\n                    for (int i = 1; i < ace.initializer_list.size; ++i)\n                        lblstr.append (\", \" + expression_to_string (initializer_list[i]));\n                    lblstr.append (\"}\");\n                    return lblstr.str;\n                }\n            }\n            if (ace.rank == 1 && str == \"string\")\n                return \"{}\";\n            else\n                return \"new %s[%d]\".printf (str, ace.rank-1);\n        }\n        /*\n         *NOTE:\n         *  Best for: Literal, MemberAccess\n         *\n         * Others not verified.\n         */\n        return e.to_string();\n    }\n\n    private static string binary_operator_to_string (BinaryOperator op) {\n        switch (op) {\n            case BinaryOperator.NONE:\n                return \"\";\n            case BinaryOperator.PLUS:\n                return \"+\";\n            case BinaryOperator.MINUS:\n                return \"-\";\n            case BinaryOperator.MUL:\n                return \"*\";\n            case BinaryOperator.DIV:\n                return \"/\";\n            case BinaryOperator.MOD:\n                return \"%\";\n            case BinaryOperator.SHIFT_LEFT:\n                return \"<<\";\n            case BinaryOperator.SHIFT_RIGHT:\n                return \">>\";\n            case BinaryOperator.LESS_THAN:\n                return \"<\";\n            case BinaryOperator.GREATER_THAN:\n                return \">\";\n            case BinaryOperator.LESS_THAN_OR_EQUAL:\n                return \"<=\";\n            case BinaryOperator.GREATER_THAN_OR_EQUAL:\n                return \">=\";\n            case BinaryOperator.EQUALITY:\n                return \"==\";\n            case BinaryOperator.INEQUALITY:\n                return \"!=\";\n            case BinaryOperator.BITWISE_AND:\n                return \"&\";\n            case BinaryOperator.BITWISE_OR:\n                return \"|\";\n            case BinaryOperator.BITWISE_XOR:\n                return \"^\";\n            case BinaryOperator.AND:\n                return \"&&\";\n            case BinaryOperator.OR:\n                return \"||\";\n            case BinaryOperator.IN:\n                return \"in\";\n            case BinaryOperator.COALESCE:\n                return \"??\";\n            default:\n                EnumClass cl = (EnumClass) typeof (BinaryOperator).class_ref ();\n                return cl.get_value (op).value_nick;\n        }\n    }\n\n    private static string unary_operator_to_string (UnaryOperator op) {\n        switch (op) {\n            case UnaryOperator.NONE:\n                return \"\";\n            case UnaryOperator.PLUS:\n                return \"+\";\n            case UnaryOperator.MINUS:\n                return \"-\";\n            case UnaryOperator.LOGICAL_NEGATION:\n                return \"^\";\n            case UnaryOperator.BITWISE_COMPLEMENT:\n                return \"~\";\n            case UnaryOperator.INCREMENT:\n                return \"++\";\n            case UnaryOperator.DECREMENT:\n                return \"--\";\n            case UnaryOperator.REF:\n                return \"ref\";\n            case UnaryOperator.OUT:\n                return \"out\";\n            default:\n                EnumClass cl = (EnumClass) typeof (UnaryOperator).class_ref ();\n                return cl.get_value (op).value_nick;\n        }\n    }\n\n    private static string datatype_to_string (DataType? vt, string? relname) {\n        if (vt == null) {\n            errmsg (_(\"DataType is null: %s\\n\"), relname);\n            errmsg (_(\"Please report a bug!\\n\"));\n            return \"UNKNOWN\";\n        }\n\n        var lblstr = new StringBuilder();\n        var shownull = true;\n        if (vt.is_array()) {\n            var arr = (vt as ArrayType).element_type;\n            if (arr is GenericType)\n                lblstr.append (((GenericType) arr).to_qualified_string());\n            else if (arr is PointerType) {\n                uint i = 0;\n                lblstr.append (pointertype_to_string ((PointerType) arr, relname, ref i));\n                lblstr.append (type_arguments_to_string (vt.get_type_arguments(), relname));\n                while (i-- != 0)\n                    lblstr.append (\"*\");\n            } else\n                lblstr.append (get_symbol_rel_name (arr.data_type, relname));\n            lblstr.append (type_arguments_to_string (vt.get_type_arguments(), relname));\n            if (arr.nullable)\n                lblstr.append (\"?\");\n            lblstr.append (\"[]\");\n        } else {\n            uint i = 0;\n            if (vt.data_type != null)\n                lblstr.append (get_symbol_rel_name (vt.data_type, relname));\n            else if (vt is DelegateType)\n                lblstr.append (get_symbol_rel_name (((DelegateType) vt).delegate_symbol, relname));\n            else if (vt is PointerType) {\n                lblstr.append (pointertype_to_string ((PointerType) vt, relname, ref i));\n                shownull = false;\n            } else if (vt is GenericType) {\n                lblstr.append (((GenericType) vt).to_qualified_string());\n                shownull = false;\n            } else if (vt is Vala.ErrorType) {\n                var et = (Vala.ErrorType) vt;\n                if (et.error_domain != null)\n                    lblstr.append (get_symbol_rel_name (et.error_domain, relname));\n                else {\n                    if (relname == null)\n                        lblstr.append (\"Error\");\n                    else\n                        lblstr.append (\"GLib.Error\");\n                }\n            } else if (vt is InvalidType) {  // happens if some vapi conflicts\n                lblstr.append (\"INVALID\");\n                //TODO; Communicate to UI.\n                errmsg (_(\"Should not happen, you might have problems with conflicting vapis: %s\\n\"),\n                        \"InvalidType\");\n            // } else if (vt is FieldPrototype) {\n            //     stdout.printf (\"FieldPrototype\\n\");\n            // } else if (vt is MethodType) {\n            //     stdout.printf (\"MethodType\\n\");\n            // } else if (vt is ReferenceType) {\n            //     stdout.printf (\"ReferenceType\\n\");\n            // } else if (vt is SignalType) {\n            //     stdout.printf (\"SignalType\\n\");\n            // } else if (vt is UnresolvedType) {\n            //     stdout.printf (\"UnresolvedType\\n\");\n            // } else if (vt is ValueType) {\n            //     stdout.printf (\"ValueType\\n\");\n            // } else if (vt is VoidType) {\n            //     stdout.printf (\"VoidType\\n\");\n            // } else if (vt is CType) {\n            //     stdout.printf (\"CType\\n\");\n            } else {\n                errmsg (_(\"Unknown type: %s (%s)\\n\"), vt.to_qualified_string(), relname);\n                errmsg (_(\"Please report a bug!\\n\"));\n                lblstr.append (\"UNKNOWN\");\n            }\n\n            lblstr.append (type_arguments_to_string (vt.get_type_arguments(), relname));\n\n            while (i-- != 0)\n                lblstr.append (\"*\");\n        }\n        if (shownull && vt.nullable)\n            lblstr.append (\"?\");\n        return lblstr.str;\n    }\n\n    private static string pointertype_to_string (PointerType vt, string? relname, ref uint i) {\n        var lblstr = new StringBuilder();\n        DataType vt_tmp = vt;\n        while (true) {\n            ++i;\n            vt_tmp = (vt_tmp as PointerType).base_type;\n            if (vt_tmp is VoidType) {\n                lblstr.append (\"void\");\n                break;\n            } else if (vt_tmp.data_type != null) {\n                lblstr.append (get_symbol_rel_name (vt_tmp.data_type, relname));\n                break;\n            } else if (vt_tmp is DelegateType) {\n                lblstr.append (get_symbol_rel_name (((DelegateType) vt_tmp).delegate_symbol, relname));\n                break;\n            } else if (vt_tmp is GenericType) {\n                lblstr.append (((GenericType) vt_tmp).to_qualified_string());\n                break;\n            }\n        }\n        return lblstr.str;\n    }\n\n    private static string type_arguments_to_string (Vala.List<DataType> typeargs, string? relname) {\n        var lblstr = new StringBuilder();\n        if (typeargs.size > 0) {\n            lblstr.append (\"<\");\n            for (int j = 0; j < typeargs.size - 1; ++j) {\n                lblstr.append (datatype_to_string (typeargs[j], relname));\n                lblstr.append (\", \");\n            }\n            lblstr.append (datatype_to_string (typeargs[typeargs.size - 1], relname));\n            lblstr.append (\">\");\n        }\n        return lblstr.str;\n    }\n\n    public static string symboltype_to_string (Symbol smb) {\n        //NOTE: Order of checks should represent frequency of occurrence.\n        if (smb is Subroutine) {\n            if (smb is Method) {\n                if (smb is CreationMethod)\n                    return _(\"Creation method\");\n                if (smb is DynamicMethod)\n                    return _(\"Dynamic method\");\n                if (smb is ArrayMoveMethod)\n                    return _(\"Array move method\");\n                if (smb is ArrayResizeMethod)\n                    return _(\"Array resize method\");\n                return _(\"Method\");\n            }\n            if (smb is Constructor)\n                return _(\"Constructor\");\n            if (smb is Destructor)\n                return _(\"Destructor\");\n            if (smb is PropertyAccessor)\n                return _(\"Property accessor\");\n            return _(\"Subroutine\");\n        }\n\n        if (smb is TypeSymbol) {\n            if (smb is ObjectTypeSymbol) {\n                if (smb is Class)\n                    return _(\"Class\");\n                if (smb is Enum)\n                    return _(\"Enum\");\n                if (smb is Interface)\n                    return _(\"Interface\");\n                if (smb is Delegate)\n                    return _(\"Delegate\");\n                if (smb is ErrorCode)\n                    return _(\"Error code\");\n                if (smb is ErrorDomain)\n                    return _(\"Error domain\");\n                return _(\"Object type symbol\");\n            }\n            if (smb is Struct)\n                return _(\"Struct\");\n            return _(\"Type symbol\");\n        }\n\n        if (smb is Variable) {\n            if (smb is LocalVariable)\n                return _(\"Local variable\");\n            if (smb is Vala.Parameter)\n                return _(\"Parameter\");\n            if (smb is Field)\n                return _(\"Field\");\n            if (smb is ArrayLengthField)\n                return _(\"Array length field\");\n            return _(\"Variable\");\n        }\n\n        if (smb is Block) {\n            if (smb is ForeachStatement)\n                return _(\"Foreach statement\");\n            if (smb is SwitchSection)\n                return _(\"Switch section\");\n            return _(\"Block\");\n        }\n\n        if (smb is Constant) {\n            if (smb is Vala.EnumValue)\n                return _(\"Enum value\");\n            return _(\"Constant\");\n        }\n\n        if (smb is Namespace)\n            return _(\"Namespace\");\n\n        if (smb is Property) {\n            if (smb is DynamicProperty)\n                return _(\"Dynamic property\");\n            return _(\"Property\");\n        }\n\n        if (smb is Vala.Signal) {\n            if (smb is DynamicSignal)\n                return _(\"Dynamic signal\");\n            return _(\"Signal\");\n        }\n\n        if (smb is TypeParameter)\n            return _(\"Type parameter\");\n\n        if (smb is UnresolvedSymbol)\n            return _(\"Unresolved symbol\");\n\n        errmsg (_(\"Could not get type name of: %s\\n\"), smb.name);\n        return \"\";\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/guanako_iterators.vala",
    "content": "/*\n * guanako/guanako_iterators.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Vala;\n\nnamespace Guanako {\n\n    private Vala.List<Symbol>[] get_child_symbols_of_type (Symbol smb, string type) {\n        var ret = new Vala.List<Symbol>[0];\n\n        if (smb is Class) {\n            //If parent is a Class, add its base class and types (i.e. interfaces it implements etc)\n            var p = (Class) smb;\n            if (p.base_class != null) {\n                var base_ret = get_child_symbols_of_type (p.base_class, type);\n                foreach (Vala.List<Symbol> list in base_ret)\n                    ret += list;\n            }\n            foreach (DataType p_type in p.get_base_types()) {\n                var base_ret = get_child_symbols_of_type (p_type.data_type, type);\n                foreach (Vala.List<Symbol> list in base_ret)\n                    ret += list;\n            }\n        }\n        var main_res = get_child_symbols_of_type_simple (smb, type);\n        if (main_res != null)\n            ret += main_res;\n        return ret;\n    }\n\n    private Vala.List<Symbol>? get_child_symbols_of_type_simple (Symbol smb, string type) {\n        if (smb is Namespace) {\n            var cv = (Namespace) smb;\n            if (type == \"Namespace\")\n                return cv.get_namespaces();\n            if (type == \"Constant\")\n                return cv.get_constants();\n            if (type == \"Enum\")\n                return cv.get_enums();\n            if (type == \"ErrorDomain\")\n                return cv.get_error_domains();\n            if (type == \"Struct\")\n                return cv.get_structs();\n            if (type == \"Interface\")\n                return cv.get_interfaces();\n            if (type == \"Class\")\n                return cv.get_classes();\n            if (type == \"Field\")\n                return cv.get_fields();\n            if (type == \"Delegate\")\n                return cv.get_delegates();\n            if (type == \"Method\")\n                return cv.get_methods();\n        }\n        if (smb is Class) {\n            var cv = (Class) smb;\n            if (type == \"Constant\")\n                return cv.get_constants();\n            if (type == \"Enum\")\n                return cv.get_enums();\n            if (type == \"Struct\")\n                return cv.get_structs();\n            if (type == \"Class\")\n                return cv.get_classes();\n            if (type == \"Field\")\n                return cv.get_fields();\n            if (type == \"Delegate\")\n                return cv.get_delegates();\n        }\n        if (smb is Enum) {\n            var cv = (Enum) smb;\n            if (type == \"Constant\")\n                return cv.get_constants();\n            if (type == \"Method\")\n                return cv.get_methods();\n        }\n        if (smb is ErrorDomain) {\n            var cv = (ErrorDomain) smb;\n            if (type == \"ErrorCode\")\n                return cv.get_codes();\n            if (type == \"Method\")\n                return cv.get_methods();\n        }\n        if (smb is Interface) {\n            var cv = (Interface) smb;\n            if (type == \"Constant\")\n                return cv.get_constants();\n            if (type == \"Enum\")\n                return cv.get_enums();\n            if (type == \"Struct\")\n                return cv.get_structs();\n            if (type == \"Class\")\n                return cv.get_classes();\n            if (type == \"Field\")\n                return cv.get_fields();\n            if (type == \"Delegate\")\n                return cv.get_delegates();\n        }\n        if (smb is Struct) {\n            var cv = (Struct) smb;\n            if (type == \"Constant\")\n                return cv.get_constants();\n            if (type == \"Property\")\n                return cv.get_properties();\n            if (type == \"Field\")\n                return cv.get_fields();\n            if (type == \"Method\")\n                return cv.get_methods();\n        }\n        if (smb is ObjectTypeSymbol) {\n            var cv = (ObjectTypeSymbol) smb;\n            if (type == \"Property\")\n                return cv.get_properties();\n            if (type == \"Method\")\n                return cv.get_methods();\n            if (type == \"Signal\")\n                return cv.get_signals();\n            if (type == \"CreationMethod\") {\n                var ret = new Vala.ArrayList<Symbol>();\n                foreach (Symbol m in cv.get_methods())\n                    if (m is CreationMethod)\n                        ret.add (m);\n                return ret;\n            }\n        }\n        return null;\n    }\n\n    /*\n     * Get parent's children.\n     */\n    Gee.LinkedList<Symbol> get_child_symbols (Symbol parent) {\n        var ret = new Gee.LinkedList<Symbol>();\n        if (parent is Class) {\n            //If parent is a Class, add its base class and types (i.e. interfaces it implements etc)\n            var p = (Class) parent;\n            if (p.base_class != null)\n                ret = get_child_symbols (p.base_class);\n            foreach (DataType type in p.get_base_types()) {\n                iter_symbol (type.data_type, (s, depth) => {\n                    if (depth == 0)\n                        return IterCallbackReturns.CONTINUE;\n                    ret.add(s);\n                    return IterCallbackReturns.ABORT_BRANCH;\n                });\n            }\n        }\n\n        iter_symbol (parent, (s, depth) => {\n            if (depth == 0)\n                return IterCallbackReturns.CONTINUE;\n            ret.add(s);\n            return IterCallbackReturns.ABORT_BRANCH;\n        });\n        return ret;\n    }\n\n    /**\n     * Find {@link Vala.Symbol}'s {@link Vala.Namespace}.\n     */\n    public Namespace? get_parent_namespace (Symbol smb) {\n        for (var iter = smb; iter != null; iter = iter.parent_symbol)\n            if (iter is Namespace)\n                return (Namespace) iter;\n        return null;\n    }\n\n    public class SymbolVisitor : CodeVisitor {\n        public SymbolVisitor (iter_callback callback) {\n            this.callback = callback;\n        }\n        iter_callback callback;\n        bool abort_tree = false;\n        public override void visit_source_file (SourceFile source_file) {\n            source_file.accept_children (this);\n        }\n        public override void visit_namespace  (Vala.Namespace ns) {\n            if (abort_tree)\n                return;\n            var ret = callback (ns, 0);\n            if (ret == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n            else if (ret == IterCallbackReturns.CONTINUE)\n                ns.accept_children(this);\n        }\n        public override void visit_class (Class cl) {\n            if (abort_tree)\n                return;\n            var ret = callback (cl, 0);\n            if (ret == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n            else if (ret == IterCallbackReturns.CONTINUE)\n                cl.accept_children(this);\n        }\n        public override void visit_struct (Struct st) {\n            if (abort_tree)\n                return;\n            var ret = callback (st, 0);\n            if (ret == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n            else if (ret == IterCallbackReturns.CONTINUE)\n                st.accept_children(this);\n        }\n        public override void visit_interface (Interface iface) {\n            if (abort_tree)\n                return;\n            var ret = callback (iface, 0);\n            if (ret == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n            else if (ret == IterCallbackReturns.CONTINUE)\n                iface.accept_children(this);\n        }\n        public override void visit_enum (Vala.Enum en) {\n            if (abort_tree)\n                return;\n            var ret = callback (en, 0);\n            if (ret == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n            else if (ret == IterCallbackReturns.CONTINUE)\n                en.accept_children(this);\n        }\n        public override void visit_error_domain (ErrorDomain edomain) {\n            if (abort_tree)\n                return;\n            var ret = callback (edomain, 0);\n            if (ret == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n            else if (ret == IterCallbackReturns.CONTINUE)\n                edomain.accept_children(this);\n        }\n        public override void visit_enum_value (Vala.EnumValue ev) {\n            if (abort_tree)\n                return;\n            if (callback (ev, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_error_code (ErrorCode ecode) {\n            if (abort_tree)\n                return;\n            if (callback (ecode, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_delegate (Delegate d) {\n            if (abort_tree)\n                return;\n            if (callback (d, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_signal (Vala.Signal sig) {\n            if (abort_tree)\n                return;\n            if (callback (sig, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_field (Field f) {\n            if (abort_tree)\n                return;\n            if (callback (f, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_constant (Constant c) {\n            if (abort_tree)\n                return;\n            if (callback (c, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_property (Property prop) {\n            if (abort_tree)\n                return;\n            if (callback (prop, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_method (Method m) {\n            if (abort_tree)\n                return;\n            if (callback (m, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n        public override void visit_local_variable (LocalVariable local) {\n            if (abort_tree)\n                return;\n            if (callback (local, 0) == IterCallbackReturns.ABORT_TREE)\n                abort_tree = true;\n        }\n    }\n\n    /*\n     * Generic callback for iteration functions.\n     */\n    public delegate IterCallbackReturns iter_callback (Symbol symbol, int depth);\n    public enum IterCallbackReturns {\n        CONTINUE,\n        ABORT_BRANCH,\n        ABORT_TREE\n    }\n\n    /*\n     * Iterate through a symbol and its children.\n     */\n    public static bool iter_symbol (Symbol smb,\n                                    iter_callback callback,\n                                    int depth = 0) {\n\n        if (smb.name != null)  //TODO: This is a part of a nasty workaround to ignore old symbols left after re-parsing.\n            if (smb.name == \"\")\n                return true;\n\n        var ret = callback (smb, depth);\n        if (ret == IterCallbackReturns.ABORT_BRANCH)\n            return true;\n        else if (ret == IterCallbackReturns.ABORT_TREE)\n            return false;\n\n        if (smb is Namespace) {\n            var cv = (Namespace) smb;\n            var nam = cv.get_namespaces();\n            foreach (Symbol s in nam)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var cst = cv.get_constants();\n            foreach (Symbol s in cst)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var enm = cv.get_enums();\n            foreach (Symbol s in enm)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var err = cv.get_error_domains();\n            foreach (Symbol s in err)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var str = cv.get_structs();\n            foreach (Symbol s in str)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var inf = cv.get_interfaces();\n            foreach (Interface s in inf)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var cls = cv.get_classes();\n            foreach (Symbol s in cls)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var fld = cv.get_fields();\n            foreach (Symbol s in fld)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var del = cv.get_delegates();\n            foreach (Symbol s in del)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var mth = cv.get_methods();\n            foreach (Symbol s in mth)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        if (smb is Class) {\n            var cv = (Class) smb;\n            var cst = cv.get_constants();\n            foreach (Symbol s in cst)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var enm = cv.get_enums();\n            foreach (Symbol s in enm)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var str = cv.get_structs();\n            foreach (Symbol s in str)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var cls = cv.get_classes();\n            foreach (Symbol s in cls)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var fld = cv.get_fields();\n            foreach (Symbol s in fld)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var del = cv.get_delegates();\n            foreach (Symbol s in del)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        if (smb is Enum) {\n            var cv = (Enum) smb;\n            var val = cv.get_values();\n            foreach (Symbol s in val)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var cst = cv.get_constants();\n            foreach (Symbol s in cst)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var mth = cv.get_methods();\n            foreach (Symbol s in mth)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        if (smb is ErrorDomain) {\n            var cv = (ErrorDomain) smb;\n            var erc = cv.get_codes();\n            foreach (Symbol s in erc)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var mth = cv.get_methods();\n            foreach (Symbol s in mth)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        if (smb is Interface) {\n            var cv = (Interface) smb;\n            var cst = cv.get_constants();\n            foreach (Symbol s in cst)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var enm = cv.get_enums();\n            foreach (Symbol s in enm)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var str = cv.get_structs();\n            foreach (Symbol s in str)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var cls = cv.get_classes();\n            foreach (Symbol s in cls)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var fld = cv.get_fields();\n            foreach (Symbol s in fld)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var del = cv.get_delegates();\n            foreach (Symbol s in del)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        if (smb is Struct) {\n            var cv = (Struct) smb;\n            var cst = cv.get_constants();\n            foreach (Symbol s in cst)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var prp = cv.get_properties();\n            foreach (Symbol s in prp)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var fld = cv.get_fields();\n            foreach (Symbol s in fld)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var mth = cv.get_methods();\n            foreach (Symbol s in mth)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        if (smb is ObjectTypeSymbol) {\n            var cv = (ObjectTypeSymbol) smb;\n            var prp = cv.get_properties();\n            foreach (Symbol s in prp)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var mth = cv.get_methods();\n            foreach (Symbol s in mth)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n            var sgn = cv.get_signals();\n            foreach (Symbol s in sgn)\n                if (!iter_symbol (s, callback, depth + 1))\n                    return false;\n        }\n        return true;\n    }\n\n\n    public delegate IterCallbackReturns iter_statement_callback (Statement statement,\n                                                                 int depth);\n\n    /*\n     * Iterate through a subroutine's body's statements.\n     */\n    public static void iter_subroutine (Subroutine subroutine, iter_statement_callback callback) {\n        var statements = subroutine.body.get_statements();\n        foreach (Statement st in statements)\n            iter_statement (st, callback, 0);\n    }\n\n    /*\n     * Iterate through a statement.\n     */\n    public static bool iter_statement (Statement statement,\n                                       iter_statement_callback callback,\n                                       int depth = 0,\n                                       string typename = \"\") {\n        var ret = callback (statement, depth);\n        if (ret == IterCallbackReturns.ABORT_BRANCH)\n            return true;\n        else if (ret == IterCallbackReturns.ABORT_TREE)\n            return false;\n\n        if (statement is Loop) {\n            var st = (Loop) statement;\n            if (!iter_statement (st.body, callback, depth + 1, \"loop\"))\n                return false;\n        }\n        if (statement is DoStatement) {\n            var st = (DoStatement) statement;\n            if (!iter_statement (st.body, callback, depth + 1, \"do_statement\"))\n                return false;\n        }\n        if (statement is ForStatement) {\n            var st = (ForStatement) statement;\n            if (!iter_statement (st.body, callback, depth + 1, \"for_statement\"))\n                return false;\n        }\n        if (statement is ForeachStatement) {\n            var st = (ForeachStatement) statement;\n            if (!iter_statement (st.body, callback, depth + 1, \"foreach_statement\"))\n                return false;\n        }\n        if (statement is DoStatement) {\n            var st = (DoStatement) statement;\n            if (!iter_statement (st.body, callback, depth + 1, \"do_statement\"))\n                return false;\n        }\n        if (statement is WhileStatement) {\n            var st = (WhileStatement) statement;\n            if (!iter_statement (st.body, callback, depth + 1, \"while_statement\"))\n                return false;\n        }\n        if (statement is SwitchStatement) {\n            var st = (SwitchStatement) statement;\n            foreach (SwitchSection section in st.get_sections())\n                if (!iter_statement (section, callback, depth + 1, \"switch_statement\"))\n                    return false;\n        }\n        if (statement is IfStatement) {\n            var st = (IfStatement) statement;\n            if (!iter_statement (st.true_statement, callback, depth + 1, \"if_true_statement\"))\n                return false;\n            if (st.false_statement != null)\n                if (!iter_statement (st.false_statement, callback, depth + 1, \"if_false_statement\"))\n                    return false;\n        }\n        if (statement is LockStatement) {\n            var st = (LockStatement) statement;\n            if (st.body != null)\n                if (!iter_statement (st.body, callback, depth + 1, \"lock_statement\"))\n                    return false;\n        }\n        if (statement is TryStatement) {\n            var st = (TryStatement) statement;\n            if (st.body != null)\n                if (!iter_statement (st.body, callback, depth + 1, \"try_statement\"))\n                    return false;\n            if (st.finally_body != null)\n                if (!iter_statement (st.finally_body, callback, depth + 1, \"try_statement\"))\n                    return false;\n            foreach (CatchClause cl in st.get_catch_clauses ())\n                if (!iter_statement (cl.body, callback, depth + 1, \"try_statement\"))\n                    return false;\n        }\n        if (statement is Block) {\n            var st = (Block) statement;\n            foreach (Statement ch in st.get_statements())\n                if (!iter_statement (ch, callback, depth + 1, \"block\"))\n                    return false;\n        }\n\n        return true;\n    }\n\n    public delegate IterCallbackReturns iter_expression_callback (Expression expression,\n                                                                 int depth);\n\n    public static bool iter_expressions (Statement statement,\n                                       iter_expression_callback callback,\n                                       int depth = 0) {\n        if (statement is SwitchSection) {\n            var st = (SwitchSection) statement;\n            foreach (SwitchLabel lbl in st.get_labels())\n                return iter_expressions_int (lbl.expression, callback, depth + 1);\n        }\n        if (statement is Vala.ExpressionStatement) {\n            var cv = statement as Vala.ExpressionStatement;\n            return iter_expressions_int (cv.expression, callback, depth + 1);\n        }\n        if (statement is Vala.DeleteStatement) {\n            var cv = statement as Vala.DeleteStatement;\n            return iter_expressions_int (cv.expression, callback, depth + 1);\n        }\n        if (statement is Vala.SwitchStatement) {\n            var cv = statement as Vala.SwitchStatement;\n            return iter_expressions_int (cv.expression, callback, depth + 1);\n        }\n        if (statement is Vala.WhileStatement) {\n            var cv = statement as Vala.WhileStatement;\n            return iter_expressions_int (cv.condition, callback, depth + 1);\n        }\n        if (statement is Vala.ThrowStatement) {\n            var cv = statement as Vala.ThrowStatement;\n            return iter_expressions_int (cv.error_expression, callback, depth + 1);\n        }\n        if (statement is Vala.DoStatement) {\n            var cv = statement as Vala.DoStatement;\n            return iter_expressions_int (cv.condition, callback, depth + 1);\n        }\n        if (statement is Vala.IfStatement) {\n            var cv = statement as Vala.IfStatement;\n            return iter_expressions_int (cv.condition, callback, depth + 1);\n        }\n        if (statement is Vala.LockStatement) {\n            var cv = statement as Vala.LockStatement;\n            return iter_expressions_int (cv.resource, callback, depth + 1);\n        }\n        if (statement is Vala.UnlockStatement) {\n            var cv = statement as Vala.UnlockStatement;\n            return iter_expressions_int (cv.resource, callback, depth + 1);\n        }\n        if (statement is Vala.YieldStatement) {\n            var cv = statement as Vala.YieldStatement;\n            if (cv.yield_expression != null)\n                return iter_expressions_int (cv.yield_expression, callback, depth + 1);\n        }\n        if (statement is Vala.ForStatement) {\n            var cv = statement as Vala.ForStatement;\n            foreach (Expression expr in cv.get_initializer())\n                return iter_expressions_int (expr, callback, depth + 1);\n            foreach (Expression expr in cv.get_iterator())\n                return iter_expressions_int (expr, callback, depth + 1);\n            if (cv.condition != null)\n                return iter_expressions_int (cv.condition, callback, depth + 1);\n        }\n        if (statement is Vala.ForeachStatement) {\n            var cv = statement as Vala.ForeachStatement;\n            return iter_expressions_int (cv.collection, callback, depth + 1);\n        }\n        if (statement is Vala.ReturnStatement) {\n            var cv = statement as Vala.ReturnStatement;\n            if (cv.return_expression != null)\n                return iter_expressions_int (cv.return_expression, callback, depth + 1);\n        }\n        return true;\n    }\n    private static bool iter_expressions_int (Expression expression,\n                                       iter_expression_callback callback,\n                                       int depth) {\n        var ret = callback (expression, depth);\n        if (ret == IterCallbackReturns.ABORT_BRANCH)\n            return true;\n        else if (ret == IterCallbackReturns.ABORT_TREE)\n            return false;\n\n        // TODO: InitializerList?\n        if (expression is Assignment) {\n            var cv = expression as Assignment;\n            if (!iter_expressions_int (cv.left, callback, depth + 1))\n                return false;\n            if (!iter_expressions_int (cv.right, callback, depth + 1))\n                return false;\n        }\n        if (expression is BinaryExpression) {\n            var cv = expression as BinaryExpression;\n            if (!iter_expressions_int (cv.left, callback, depth + 1))\n                return false;\n            if (!iter_expressions_int (cv.right, callback, depth + 1))\n                return false;\n        }\n        if (expression is MemberAccess) {\n            var cv = expression as MemberAccess;\n            if (cv.inner != null)\n                if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                    return false;\n        }\n        if (expression is AddressofExpression) {\n            var cv = expression as AddressofExpression;\n            if (cv.inner != null)\n                if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                    return false;\n        }\n        if (expression is CastExpression) {\n            var cv = expression as AddressofExpression;\n            if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                return false;\n        }\n        if (expression is ConditionalExpression) {\n            var cv = expression as ConditionalExpression;\n            if (!iter_expressions_int (cv.condition, callback, depth + 1))\n                return false;\n            if (!iter_expressions_int (cv.true_expression, callback, depth + 1))\n                return false;\n            if (!iter_expressions_int (cv.false_expression, callback, depth + 1))\n                return false;\n        }\n        if (expression is ElementAccess) {\n            var cv = expression as ElementAccess;\n            if (!iter_expressions_int (cv.container, callback, depth + 1))\n                return false;\n        }\n        if (expression is LambdaExpression) {\n            var cv = expression as LambdaExpression;\n            if (!iter_expressions (cv.statement_body, callback, depth + 1))\n                return false;\n        }\n        if (expression is MethodCall) {\n            var cv = expression as MethodCall;\n            if (!iter_expressions_int (cv.call, callback, depth + 1))\n                return false;\n            foreach (Expression e in cv.get_argument_list())\n                if (!iter_expressions_int (e, callback, depth + 1))\n                    return false;\n        }\n        if (expression is NamedArgument) {\n            var cv = expression as NamedArgument;\n            if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                return false;\n        }\n        if (expression is ObjectCreationExpression) {\n            var cv = expression as ObjectCreationExpression;\n            foreach (Expression e in cv.get_argument_list())\n                if (!iter_expressions_int (e, callback, depth + 1))\n                    return false;\n        }\n        if (expression is PointerIndirection) {\n            var cv = expression as PointerIndirection;\n            if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                return false;\n        }\n        if (expression is PostfixExpression) {\n            var cv = expression as PostfixExpression;\n            if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                return false;\n        }\n        if (expression is ReferenceTransferExpression) {\n            var cv = expression as ReferenceTransferExpression;\n            if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                return false;\n        }\n        if (expression is UnaryExpression) {\n            var cv = expression as UnaryExpression;\n            if (!iter_expressions_int (cv.inner, callback, depth + 1))\n                return false;\n        }\n        if (expression is SliceExpression) {\n            var cv = expression as SliceExpression;\n            if (!iter_expressions_int (cv.container, callback, depth + 1))\n                return false;\n            if (!iter_expressions_int (cv.start, callback, depth + 1))\n                return false;\n            if (!iter_expressions_int (cv.stop, callback, depth + 1))\n                return false;\n        }\n        if (expression is Template) {\n            var cv = expression as Template;\n            foreach (Expression e in cv.get_expressions())\n                if (!iter_expressions_int (e, callback, depth + 1))\n                    return false;\n        }\n        if (expression is Tuple) {\n            var cv = expression as Tuple;\n            foreach (Expression e in cv.get_expressions())\n                if (!iter_expressions_int (e, callback, depth + 1))\n                    return false;\n        }\n        if (expression is TypeCheck) {\n            var cv = expression as TypeCheck;\n            if (!iter_expressions_int (cv.expression, callback, depth + 1))\n                return false;\n        }\n        return true;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/guanako_refactoring.vala",
    "content": "/*\n * guanako/guanako_refactoring.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\nusing Vala;\n\nnamespace Guanako.Refactoring {\n    public static Symbol? find_declaration (Project project, SourceFile sf, int line, int col) {\n\n        var smb = project.get_symbol_at_pos(sf, line, col);\n        if (smb is Vala.Subroutine) {\n            var sr = smb as Vala.Subroutine;\n            Vala.Statement st = null;\n            int old_depth = -1;\n            Guanako.iter_subroutine (sr, (stmt, depth)=>{\n                if (!Guanako.inside_source_ref (sf, line, col, stmt.source_reference))\n                    return Guanako.IterCallbackReturns.CONTINUE; //TODO: abort here?\n                if (depth > old_depth) {\n                    old_depth = depth;\n                    st = stmt;\n                }\n                return Guanako.IterCallbackReturns.CONTINUE;\n            });\n            if (st != null) {\n                Vala.Expression expression = null;\n                old_depth = 0;\n                Guanako.iter_expressions (st, (expr, depth)=>{\n                    if (!Guanako.inside_source_ref (sf, line, col, expr.source_reference))\n                        return Guanako.IterCallbackReturns.CONTINUE;\n                    if (depth >= old_depth) {\n                        old_depth = depth;\n                        expression = expr;\n                    }\n                    return Guanako.IterCallbackReturns.CONTINUE;\n                });\n                if (expression != null)\n                    return expression.symbol_reference;\n            }\n        }\n        return null;\n    }\n    public static SourceReference[] find_references (Project project, SourceFile sf, Symbol symbol) {\n        var ret = new SourceReference[0];\n        foreach (SourceFile file in project.sourcefiles)\n            foreach (CodeNode node in file.get_nodes())\n                Guanako.iter_symbol ((Symbol)node, (smb, depth) => {\n                    if (smb is Subroutine) {\n                        //stdout.printf(\"Checking subroutine:\" + smb.name + \"\\n\");\n                        Guanako.iter_subroutine ((Subroutine)smb, (stmt, depth)=>{\n\n                            Guanako.iter_expressions (stmt, (expr, depth)=>{\n                                if (expr.symbol_reference == symbol)\n                                    if (expr.source_reference != null)\n                                        ret += expr.source_reference;\n                                return Guanako.IterCallbackReturns.CONTINUE;\n                            });\n\n                            return Guanako.IterCallbackReturns.CONTINUE;\n                        });\n                    }\n                    return Guanako.IterCallbackReturns.CONTINUE;\n                });\n\n        return ret;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/guanako_vapi_discoverer.vala",
    "content": "/*\n * guanako/guanako_vapi_discoverer.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\nnamespace Guanako {\n    public static string? discover_vapi_file (string needle_namespace) {\n        foreach (string vapipath in get_vapi_dirs()) {\n            var directory = File.new_for_path (vapipath);\n\n            try {\n                var enumerator = directory.enumerate_children (FileAttribute.STANDARD_NAME, 0);\n\n                FileInfo file_info;\n                while ((file_info = enumerator.next_file()) != null) {\n                    if (file_info.get_name().has_suffix (\".vapi\")) {\n                        var file = File.new_for_path (vapipath + file_info.get_name());\n                        var dis = new DataInputStream (file.read());\n                        string line;\n                        /*\n                         * Read lines until end of file (null) is reached.\n                         */\n                        while ((line = dis.read_line (null)) != null)\n                            if (line.contains (\"namespace \" + needle_namespace + \" \"))\n                                return file_info.get_name().substring (0, file_info.get_name().length - 5);\n                    }\n                }\n            } catch (GLib.IOError e) {\n                errmsg (_(\"Could not read file: %s\"), e.message);\n            } catch (GLib.Error e) {\n                errmsg (_(\"Could not operate on directory: %s\"), e.message);\n            }\n        }\n        return null;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/reporter.vala",
    "content": "/*\n * guanako/reporter.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Vala;\n\nnamespace Guanako {\n    [Flags]\n    public enum ReportType {\n        ERROR,\n        WARNING,\n        DEPRECATED,\n        EXPERIMENTAL,\n        NOTE;\n\n        public const ReportType ALL = ERROR | WARNING | DEPRECATED | EXPERIMENTAL | NOTE;\n\n        public string? to_string() {\n            switch (this) {\n                case ERROR:\n                    return _(\"Error\");\n                case WARNING:\n                    return _(\"Warning\");\n                case DEPRECATED:\n                    return _(\"Deprecated\");\n                case EXPERIMENTAL:\n                    return _(\"Experimental\");\n                case NOTE:\n                    return _(\"Note\");\n                default:\n                    assert_not_reached();\n            }\n        }\n    }\n\n    public class Reporter : Report {\n        public virtual Gee.ArrayList<Error> errlist { get; protected set; }\n        private bool general_error = false;\n\n        public class Error : Object {\n            public SourceReference source;\n            public string message;\n            public ReportType type;\n\n            public Error (SourceReference source, string message, ReportType type) {\n                this.source = source;\n                this.message = message;\n                this.type = type;\n            }\n        }\n\n        construct {\n            errlist = new Gee.ArrayList<Error>();\n            errors = 0;\n            warnings = 0;\n        }\n\n        public void reset_file (string filename) {\n            var errlist_new = new Gee.ArrayList<Error>();;\n            foreach (var err in errlist)\n                if (err.source.file.filename == filename) {\n                    switch (err.type) {\n                        case ReportType.DEPRECATED:\n                        case ReportType.EXPERIMENTAL:\n                        case ReportType.WARNING:\n                            --warnings;\n                            break;\n                        case ReportType.ERROR:\n                            --errors;\n                            break;\n                        case ReportType.NOTE:\n                            break;\n                        default:\n                            assert_not_reached();\n                    }\n                } else\n                    errlist_new.add (err);\n            errlist = errlist_new;\n        }\n\n        protected virtual inline void show_note (SourceReference? source, string message) {}\n        protected override void note (SourceReference? source, string message) {\n            show_note (source, message);\n            if (source == null)\n                return;\n            errlist.add (new Error (source, message, ReportType.NOTE));\n        }\n\n        protected virtual inline void show_deprecated (SourceReference? source, string message) {}\n        protected override void depr (SourceReference? source, string message) {\n            show_deprecated (source, message);\n            if (source == null)\n                return;\n            ++warnings;\n            errlist.add (new Error (source, message, ReportType.DEPRECATED));\n        }\n\n        protected virtual inline void show_experimental (SourceReference? source, string message) {}\n        protected virtual inline void show_warning (SourceReference? source, string message) {}\n        protected override void warn (SourceReference? source, string message) {\n            ReportType type;\n            if (message.has_suffix (\"are experimental\")) {\n                show_experimental (source, message);\n                type = ReportType.EXPERIMENTAL;\n            } else {\n                show_warning (source, message);\n                type = ReportType.WARNING;\n            }\n            if (source == null)\n                return;\n            ++warnings;\n            errlist.add (new Error (source, message, type));\n        }\n\n        protected virtual inline void show_error (SourceReference? source, string message) {}\n        protected override void err (SourceReference? source, string message) {\n            show_error (source, message);\n            if (source == null) {\n                general_error = true;\n                return;\n            }\n            ++errors;\n            errlist.add (new Error (source, message, ReportType.ERROR));\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "guanako/scanner/valaparser.vala",
    "content": "/* valaparser.vala\n *\n * Copyright (C) 2006-2013  Jürg Billeter\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n *\n * Author:\n * \tJürg Billeter <j@bitron.ch>\n */\n\nusing GLib;\n\n/**\n * Code visitor parsing all Vala source files.\n */\npublic class Vala.ParserExt : CodeVisitor {\n\tScannerExt scanner;\n\n\tCodeContext context;\n\n\t// token buffer\n\tTokenInfo[] tokens;\n\t// index of current token in buffer\n\tint index;\n\t// number of tokens in buffer\n\tint size;\n\n\tComment comment;\n\n\t/*GUANAKO_EXT_START*/\n\tpublic HashMap<string, HashSet<string>> used_defines { get; private set; }\n\t/*GUANAKO_EXT_END*/\n\n\tconst int BUFFER_SIZE = 32;\n\n\tstatic List<TypeParameter> _empty_type_parameter_list;\n\n\tstruct TokenInfo {\n\t\tpublic TokenType type;\n\t\tpublic SourceLocation begin;\n\t\tpublic SourceLocation end;\n\t}\n\n\tenum ModifierFlags {\n\t\tNONE,\n\t\tABSTRACT = 1 << 0,\n\t\tCLASS = 1 << 1,\n\t\tEXTERN = 1 << 2,\n\t\tINLINE = 1 << 3,\n\t\tNEW = 1 << 4,\n\t\tOVERRIDE = 1 << 5,\n\t\tSTATIC = 1 << 6,\n\t\tVIRTUAL = 1 << 7,\n\t\tASYNC = 1 << 8,\n\t\tSEALED = 1 << 9\n\t}\n\n\tpublic ParserExt () {\n\t\ttokens = new TokenInfo[BUFFER_SIZE];\n\t\t/*GUANAKO_EXT_START*/\n\t\tused_defines = new HashMap <string, HashSet<string>> (str_hash, str_equal);\n\t\t/*GUANAKO_EXT_END*/\n\t}\n\n\t/**\n\t * Parses all .vala and .vapi source files in the specified code\n\t * context and builds a code tree.\n\t *\n\t * @param context a code context\n\t */\n\tpublic void parse (CodeContext context) {\n\t\tthis.context = context;\n\t\tcontext.accept (this);\n\t}\n\n\tpublic override void visit_source_file (SourceFile source_file) {\n\t\tif (context.run_output || source_file.filename.has_suffix (\".vala\") || source_file.filename.has_suffix (\".vapi\")) {\n\t\t\tparse_file (source_file);\n\t\t}\n\t}\n\n\tinline bool next () {\n\t\tindex = (index + 1) % BUFFER_SIZE;\n\t\tsize--;\n\t\tif (size <= 0) {\n\t\t\tSourceLocation begin, end;\n\t\t\tTokenType type = scanner.read_token (out begin, out end);\n\t\t\ttokens[index].type = type;\n\t\t\ttokens[index].begin = begin;\n\t\t\ttokens[index].end = end;\n\t\t\tsize = 1;\n\t\t}\n\t\treturn (tokens[index].type != TokenType.EOF);\n\t}\n\n\tinline void prev () {\n\t\tindex = (index - 1 + BUFFER_SIZE) % BUFFER_SIZE;\n\t\tsize++;\n\t\tassert (size <= BUFFER_SIZE);\n\t}\n\n\tinline TokenType current () {\n\t\treturn tokens[index].type;\n\t}\n\n\tinline bool accept (TokenType type) {\n\t\tif (current () == type) {\n\t\t\tnext ();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tstring get_error (string msg) {\n\t\tvar begin = get_location ();\n\t\tnext ();\n\t\tReport.error (get_src (begin), \"syntax error, \" + msg);\n\t\treturn msg;\n\t}\n\n\tinline bool expect (TokenType type) throws ParseError {\n\t\tif (accept (type)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthrow new ParseError.SYNTAX (get_error (\"expected %s\".printf (type.to_string ())));\n\t}\n\n\tinline SourceLocation get_location () {\n\t\treturn tokens[index].begin;\n\t}\n\n\tstring get_current_string () {\n\t\treturn ((string) tokens[index].begin.pos).substring (0, (int) (tokens[index].end.pos - tokens[index].begin.pos));\n\t}\n\n\tstring get_last_string () {\n\t\tint last_index = (index + BUFFER_SIZE - 1) % BUFFER_SIZE;\n\t\treturn ((string) tokens[last_index].begin.pos).substring (0, (int) (tokens[last_index].end.pos - tokens[last_index].begin.pos));\n\t}\n\n\tSourceReference get_src (SourceLocation begin) {\n\t\tint last_index = (index + BUFFER_SIZE - 1) % BUFFER_SIZE;\n\n\t\treturn new SourceReference (scanner.source_file, begin, tokens[last_index].end);\n\t}\n\n\tSourceReference get_current_src () {\n\t\treturn new SourceReference (scanner.source_file, tokens[index].begin, tokens[index].end);\n\t}\n\n\tSourceReference get_last_src () {\n\t\tint last_index = (index + BUFFER_SIZE - 1) % BUFFER_SIZE;\n\n\t\treturn new SourceReference (scanner.source_file, tokens[last_index].begin, tokens[last_index].end);\n\t}\n\n\tvoid rollback (SourceLocation location) {\n\t\twhile (tokens[index].begin.pos != location.pos) {\n\t\t\tindex = (index - 1 + BUFFER_SIZE) % BUFFER_SIZE;\n\t\t\tsize++;\n\t\t\tif (size > BUFFER_SIZE) {\n\t\t\t\tscanner.seek (location);\n\t\t\t\tsize = 0;\n\t\t\t\tindex = 0;\n\n\t\t\t\tnext ();\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid skip_identifier () throws ParseError {\n\t\t// also accept keywords as identifiers where there is no conflict\n\t\tswitch (current ()) {\n\t\tcase TokenType.ABSTRACT:\n\t\tcase TokenType.AS:\n\t\tcase TokenType.ASYNC:\n\t\tcase TokenType.BASE:\n\t\tcase TokenType.BREAK:\n\t\tcase TokenType.CASE:\n\t\tcase TokenType.CATCH:\n\t\tcase TokenType.CLASS:\n\t\tcase TokenType.CONST:\n\t\tcase TokenType.CONSTRUCT:\n\t\tcase TokenType.CONTINUE:\n\t\tcase TokenType.DEFAULT:\n\t\tcase TokenType.DELEGATE:\n\t\tcase TokenType.DELETE:\n\t\tcase TokenType.DO:\n\t\tcase TokenType.DYNAMIC:\n\t\tcase TokenType.ELSE:\n\t\tcase TokenType.ENUM:\n\t\tcase TokenType.ENSURES:\n\t\tcase TokenType.ERRORDOMAIN:\n\t\tcase TokenType.EXTERN:\n\t\tcase TokenType.FALSE:\n\t\tcase TokenType.FINALLY:\n\t\tcase TokenType.FOR:\n\t\tcase TokenType.FOREACH:\n\t\tcase TokenType.GET:\n\t\tcase TokenType.IDENTIFIER:\n\t\tcase TokenType.IF:\n\t\tcase TokenType.IN:\n\t\tcase TokenType.INLINE:\n\t\tcase TokenType.INTERFACE:\n\t\tcase TokenType.INTERNAL:\n\t\tcase TokenType.IS:\n\t\tcase TokenType.LOCK:\n\t\tcase TokenType.NAMESPACE:\n\t\tcase TokenType.NEW:\n\t\tcase TokenType.NULL:\n\t\tcase TokenType.OUT:\n\t\tcase TokenType.OVERRIDE:\n\t\tcase TokenType.OWNED:\n\t\tcase TokenType.PARAMS:\n\t\tcase TokenType.PRIVATE:\n\t\tcase TokenType.PROTECTED:\n\t\tcase TokenType.PUBLIC:\n\t\tcase TokenType.REF:\n\t\tcase TokenType.REQUIRES:\n\t\tcase TokenType.RETURN:\n\t\tcase TokenType.SEALED:\n\t\tcase TokenType.SET:\n\t\tcase TokenType.SIGNAL:\n\t\tcase TokenType.SIZEOF:\n\t\tcase TokenType.STATIC:\n\t\tcase TokenType.STRUCT:\n\t\tcase TokenType.SWITCH:\n\t\tcase TokenType.THIS:\n\t\tcase TokenType.THROW:\n\t\tcase TokenType.THROWS:\n\t\tcase TokenType.TRUE:\n\t\tcase TokenType.TRY:\n\t\tcase TokenType.TYPEOF:\n\t\tcase TokenType.UNOWNED:\n\t\tcase TokenType.USING:\n\t\tcase TokenType.VAR:\n\t\tcase TokenType.VIRTUAL:\n\t\tcase TokenType.VOID:\n\t\tcase TokenType.VOLATILE:\n\t\tcase TokenType.WEAK:\n\t\tcase TokenType.WHILE:\n\t\tcase TokenType.YIELD:\n\t\t\tnext ();\n\t\t\treturn;\n\t\tcase TokenType.INTEGER_LITERAL:\n\t\tcase TokenType.REAL_LITERAL:\n\t\t\t// also accept integer and real literals\n\t\t\t// as long as they contain at least one character\n\t\t\t// and no decimal point\n\t\t\t// for example, 2D and 3D\n\t\t\tstring id = get_current_string ();\n\t\t\tif (id[id.length - 1].isalpha () && !(\".\" in id)) {\n\t\t\t\tnext ();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected identifier\"));\n\t\t}\n\t}\n\n\tstring parse_identifier () throws ParseError {\n\t\tskip_identifier ();\n\t\treturn get_last_string ();\n\t}\n\n\tExpression parse_literal () throws ParseError {\n\t\tvar begin = get_location ();\n\n\t\tswitch (current ()) {\n\t\tcase TokenType.TRUE:\n\t\t\tnext ();\n\t\t\treturn new BooleanLiteral (true, get_src (begin));\n\t\tcase TokenType.FALSE:\n\t\t\tnext ();\n\t\t\treturn new BooleanLiteral (false, get_src (begin));\n\t\tcase TokenType.INTEGER_LITERAL:\n\t\t\tnext ();\n\t\t\treturn new IntegerLiteral (get_last_string (), get_src (begin));\n\t\tcase TokenType.REAL_LITERAL:\n\t\t\tnext ();\n\t\t\treturn new RealLiteral (get_last_string (), get_src (begin));\n\t\tcase TokenType.CHARACTER_LITERAL:\n\t\t\tnext ();\n\t\t\t// FIXME validate and unescape here and just pass unichar to CharacterLiteral\n\t\t\tvar lit = new CharacterLiteral (get_last_string (), get_src (begin));\n\t\t\tif (lit.error) {\n\t\t\t\tReport.error (lit.source_reference, \"invalid character literal\");\n\t\t\t}\n\t\t\treturn lit;\n\t\tcase TokenType.REGEX_LITERAL:\n\t\t\tnext ();\n\t\t\tstring match_part = get_last_string ();\n\t\t\tSourceReference src_begin = get_src (begin);\n\t\t\texpect (TokenType.CLOSE_REGEX_LITERAL);\n\t\t\tstring close_token = get_last_string ();\n\t\t\treturn new RegexLiteral (\"%s/%s\".printf (close_token, match_part), src_begin);\n\t\tcase TokenType.STRING_LITERAL:\n\t\t\tnext ();\n\t\t\treturn new StringLiteral (get_last_string (), get_src (begin));\n\t\tcase TokenType.TEMPLATE_STRING_LITERAL:\n\t\t\tnext ();\n\t\t\treturn new StringLiteral (\"\\\"%s\\\"\".printf (get_last_string ()), get_src (begin));\n\t\tcase TokenType.VERBATIM_STRING_LITERAL:\n\t\t\tnext ();\n\t\t\tstring raw_string = get_last_string ();\n\t\t\tstring escaped_string = raw_string.substring (3, raw_string.length - 6).escape (\"\");\n\t\t\treturn new StringLiteral (\"\\\"%s\\\"\".printf (escaped_string), get_src (begin));\n\t\tcase TokenType.NULL:\n\t\t\tnext ();\n\t\t\treturn new NullLiteral (get_src (begin));\n\t\tdefault:\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected literal\"));\n\t\t}\n\t}\n\n\tpublic void parse_file (SourceFile source_file) {\n\t\tscanner = new ScannerExt (source_file);\n\t\tparse_file_comments ();\n\n\t\tindex = -1;\n\t\tsize = 0;\n\t\t\n\t\tnext ();\n\n\n\t\ttry {\n\t\t\tparse_using_directives (context.root);\n\t\t\tparse_declarations (context.root, true);\n\t\t\tif (accept (TokenType.CLOSE_BRACE)) {\n\t\t\t\t// only report error if it's not a secondary error\n\t\t\t\tif (context.report.get_errors () == 0) {\n\t\t\t\t\tReport.error (get_last_src (), \"unexpected `}'\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (ParseError e) {\n\t\t\t// already reported\n\t\t}\n\t\t\n\t\t/*GUANAKO_EXT_START*/\n\t\tHashSet<string> used_defines_file = new HashSet<string>();\n\t\tforeach (string define in scanner.used_defines)\n\t\t\tused_defines_file.add (define);\n\t\tused_defines.set (source_file.filename, used_defines_file);\n\t\t/*GUANAKO_EXT_END*/\n\t\tscanner = null;\n\t}\n\n\tvoid parse_file_comments () {\n\t\tscanner.parse_file_comments ();\n\t}\n\n\tvoid skip_symbol_name () throws ParseError {\n\t\tdo {\n\t\t\tskip_identifier ();\n\t\t} while (accept (TokenType.DOT) || accept (TokenType.DOUBLE_COLON));\n\t}\n\n\tUnresolvedSymbol parse_symbol_name () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tUnresolvedSymbol sym = null;\n\t\tdo {\n\t\t\tstring name = parse_identifier ();\n\t\t\tif (name == \"global\" && accept (TokenType.DOUBLE_COLON)) {\n\t\t\t\t// global::Name\n\t\t\t\t// qualified access to global symbol\n\t\t\t\tname = parse_identifier ();\n\t\t\t\tsym = new UnresolvedSymbol (sym, name, get_src (begin));\n\t\t\t\tsym.qualified = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsym = new UnresolvedSymbol (sym, name, get_src (begin));\n\t\t} while (accept (TokenType.DOT));\n\t\treturn sym;\n\t}\n\n\tvoid skip_type () throws ParseError {\n\t\taccept (TokenType.DYNAMIC);\n\t\taccept (TokenType.OWNED);\n\t\taccept (TokenType.UNOWNED);\n\t\taccept (TokenType.WEAK);\n#if VALAC_0_26\n\n\t\tif (is_inner_array_type ()) {\n\t\t\texpect (TokenType.OPEN_PARENS);\n\t\t\texpect (TokenType.UNOWNED);\n\t\t\tskip_type ();\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t\texpect (TokenType.OPEN_BRACKET);\n\t\t\tprev ();\n\t\t} else {\n#endif\n\t\t\tif (accept (TokenType.VOID)) {\n\t\t\t} else {\n\t\t\t\tskip_symbol_name ();\n\t\t\t\tskip_type_argument_list ();\n\t\t\t}\n\t\t\twhile (accept (TokenType.STAR)) {\n\t\t\t}\n\t\t\taccept (TokenType.INTERR);\n#if VALAC_0_26\n\t\t}\n#endif\n\t\t\n\t\twhile (accept (TokenType.OPEN_BRACKET)) {\n\t\t\tdo {\n\t\t\t\t// required for decision between expression and declaration statement\n\t\t\t\tif (current () != TokenType.COMMA && current () != TokenType.CLOSE_BRACKET) {\n\t\t\t\t\tparse_expression ();\n\t\t\t\t}\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.CLOSE_BRACKET);\n\t\t\taccept (TokenType.INTERR);\n\t\t}\n\t\taccept (TokenType.OP_NEG);\n\t\taccept (TokenType.HASH);\n\t}\n\n#if VALAC_0_26\n\tbool is_inner_array_type () {\n\t\tvar begin = get_location ();\n\t\t\n\t\tvar result = accept (TokenType.OPEN_PARENS) && accept (TokenType.UNOWNED) && current() != TokenType.CLOSE_PARENS;\n\t\trollback (begin);\n\t\treturn result;\n\t}\n\t\n\tDataType parse_type (bool owned_by_default, bool can_weak_ref, bool require_unowned = false) throws ParseError {\n#else\n\tDataType parse_type (bool owned_by_default, bool can_weak_ref) throws ParseError {\n#endif\n\t\tvar begin = get_location ();\n\n\t\tbool is_dynamic = accept (TokenType.DYNAMIC);\n\n\t\tbool value_owned = owned_by_default;\n\n#if VALAC_0_26\n\t\tif (require_unowned) {\n\t\t\texpect (TokenType.UNOWNED);\n\t\t} else {\n#endif\n\t\t\tif (owned_by_default) {\n\t\t\t\tif (accept (TokenType.UNOWNED)) {\n\t\t\t\t\tvalue_owned = false;\n\t\t\t\t} else if (accept (TokenType.WEAK)) {\n\t\t\t\t\tif (!can_weak_ref && !context.deprecated) {\n\t\t\t\t\t\tReport.warning (get_last_src (), \"deprecated syntax, use `unowned` modifier\");\n\t\t\t\t\t}\n\t\t\t\t\tvalue_owned = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvalue_owned = accept (TokenType.OWNED);\n\t\t\t}\n#if VALAC_0_26\n\t\t}\n#endif\n\n\t\tDataType type;\n\n#if VALAC_0_26\n\t\tbool inner_type_owned = true;\n\t\tif (accept (TokenType.OPEN_PARENS)) {\n\t\t\ttype = parse_type (false, false, true);\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t\t\n\t\t\tinner_type_owned = false;\n\n\t\t\texpect (TokenType.OPEN_BRACKET);\n\t\t\tprev ();\n\t\t} else {\n#endif\n\t\t\tif (!is_dynamic && value_owned == owned_by_default && accept (TokenType.VOID)) {\n\t\t\t\ttype = new VoidType (get_src (begin));\n\t\t\t} else {\n\t\t\t\tvar sym = parse_symbol_name ();\n\t\t\t\tList<DataType> type_arg_list = parse_type_argument_list (false);\n\t\t\t\t\n\t\t\t\ttype = new UnresolvedType.from_symbol (sym, get_src (begin));\n\t\t\t\tif (type_arg_list != null) {\n\t\t\t\t\tforeach (DataType type_arg in type_arg_list) {\n\t\t\t\t\t\ttype.add_type_argument (type_arg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\twhile (accept (TokenType.STAR)) {\n\t\t\t\ttype = new PointerType (type, get_src (begin));\n\t\t\t}\n\n\t\t\tif (!(type is PointerType)) {\n\t\t\t\ttype.nullable = accept (TokenType.INTERR);\n\t\t\t}\n#if VALAC_0_26\n\t\t}\n#endif\n\t\t\t\n\t\t// array brackets in types are read from right to left,\n\t\t// this is more logical, especially when nullable arrays\n\t\t// or pointers are involved\n\t\twhile (accept (TokenType.OPEN_BRACKET)) {\n\t\t\tbool invalid_array = false;\n\t\t\tint array_rank = 0;\n\t\t\tdo {\n\t\t\t\tarray_rank++;\n\t\t\t\t// required for decision between expression and declaration statement\n\t\t\t\tif (current () != TokenType.COMMA && current () != TokenType.CLOSE_BRACKET) {\n\t\t\t\t\tparse_expression ();\n\t\t\t\t\t// only used for parsing, reject use as real type\n\t\t\t\t\tinvalid_array = true;\n\t\t\t\t}\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.CLOSE_BRACKET);\n\n#if VALAC_0_26\n\t\t\ttype.value_owned = inner_type_owned;\n#else\n\t\t\t// arrays contain strong references by default\n\t\t\ttype.value_owned = true;\n#endif\n\n\t\t\tvar array_type = new ArrayType (type, array_rank, get_src (begin));\n\t\t\tarray_type.nullable = accept (TokenType.INTERR);\n\t\t\tarray_type.invalid_syntax = invalid_array;\n\n\t\t\ttype = array_type;\n\t\t}\n\n\t\tif (accept (TokenType.OP_NEG)) {\n\t\t\tReport.warning (get_last_src (), \"obsolete syntax, types are non-null by default\");\n\t\t}\n\n\t\tif (!owned_by_default) {\n\t\t\tif (accept (TokenType.HASH)) {\n\t\t\t\tif (!context.deprecated) {\n\t\t\t\t\tReport.warning (get_last_src (), \"deprecated syntax, use `owned` modifier\");\n\t\t\t\t}\n\t\t\t\tvalue_owned = true;\n\t\t\t}\n\t\t}\n\n\t\tif (type is PointerType) {\n\t\t\tvalue_owned = false;\n\t\t}\n\n\t\ttype.is_dynamic = is_dynamic;\n\t\ttype.value_owned = value_owned;\n\t\treturn type;\n\t}\n\n\tDataType? parse_inline_array_type (DataType? type) throws ParseError {\n\t\tvar begin = get_location ();\n\n\t\t// inline-allocated array\n\t\tif (type != null && accept (TokenType.OPEN_BRACKET)) {\n#if VALAC_0_26\n\t\t\tExpression array_length = null;\n#else\n\t\t\tint array_length = -1;\n#endif\n\n\t\t\tif (current () != TokenType.CLOSE_BRACKET) {\n#if VALAC_0_26\n\t\t\t\tarray_length = parse_expression ();\n#else\n\t\t\t\tif (current () != TokenType.INTEGER_LITERAL) {\n\t\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected `]' or integer literal\"));\n\t\t\t\t}\n\n\t\t\t\tvar length_literal = (IntegerLiteral) parse_literal ();\n\t\t\t\tarray_length = int.parse (length_literal.value);\n#endif\n\t\t\t}\n\t\t\texpect (TokenType.CLOSE_BRACKET);\n\n\t\t\tvar array_type = new ArrayType (type, 1, get_src (begin));\n\t\t\tarray_type.inline_allocated = true;\n#if VALAC_0_26\n\t\t\tif (array_length != null) {\n#else\n\t\t\tif (array_length > 0) {\n#endif\n\t\t\t\tarray_type.fixed_length = true;\n\t\t\t\tarray_type.length = array_length;\n\t\t\t}\n\t\t\tarray_type.value_owned = type.value_owned;\n\n\t\t\treturn array_type;\n\t\t}\n\t\treturn type;\n\t}\n\n\tList<Expression> parse_argument_list () throws ParseError {\n\t\tvar list = new ArrayList<Expression> ();\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\tlist.add (parse_argument ());\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\treturn list;\n\t}\n\n\tExpression parse_argument () throws ParseError {\n\t\tvar begin = get_location ();\n\n\t\tif (accept (TokenType.REF)) {\n\t\t\tvar inner = parse_expression ();\n\t\t\treturn new UnaryExpression (UnaryOperator.REF, inner, get_src (begin));\n\t\t} else if (accept (TokenType.OUT)) {\n\t\t\tvar inner = parse_expression ();\n\t\t\treturn new UnaryExpression (UnaryOperator.OUT, inner, get_src (begin));\n\t\t} else {\n\t\t\tvar expr = parse_expression ();\n\t\t\tvar ma = expr as MemberAccess;\n\t\t\tif (ma != null && ma.inner == null && accept (TokenType.COLON)) {\n\t\t\t\t// named argument\n\t\t\t\texpr = parse_expression ();\n\t\t\t\treturn new NamedArgument (ma.member_name, expr, get_src (begin));\n\t\t\t} else {\n\t\t\t\treturn expr;\n\t\t\t}\n\t\t}\n\t}\n\n\tExpression parse_primary_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\n\t\tExpression expr;\n\n\t\tswitch (current ()) {\n\t\tcase TokenType.TRUE:\n\t\tcase TokenType.FALSE:\n\t\tcase TokenType.INTEGER_LITERAL:\n\t\tcase TokenType.REAL_LITERAL:\n\t\tcase TokenType.CHARACTER_LITERAL:\n\t\tcase TokenType.STRING_LITERAL:\n\t\tcase TokenType.REGEX_LITERAL:\n\t\tcase TokenType.TEMPLATE_STRING_LITERAL:\n\t\tcase TokenType.VERBATIM_STRING_LITERAL:\n\t\tcase TokenType.NULL:\n\t\t\texpr = parse_literal ();\n\t\t\tbreak;\n\t\tcase TokenType.OPEN_BRACE:\n\t\t\texpr = parse_initializer ();\n\t\t\tbreak;\n\t\tcase TokenType.OPEN_BRACKET:\n\t\t\texpr = parse_simple_name ();\n\t\t\tbreak;\n\t\tcase TokenType.OPEN_PARENS:\n\t\t\texpr = parse_tuple ();\n\t\t\tbreak;\n\t\tcase TokenType.OPEN_TEMPLATE:\n\t\t\texpr = parse_template ();\n\t\t\tbreak;\n\t\tcase TokenType.OPEN_REGEX_LITERAL:\n\t\t\texpr = parse_regex_literal ();\n\t\t\tbreak;\n\t\tcase TokenType.THIS:\n\t\t\texpr = parse_this_access ();\n\t\t\tbreak;\n\t\tcase TokenType.BASE:\n\t\t\texpr = parse_base_access ();\n\t\t\tbreak;\n\t\tcase TokenType.NEW:\n\t\t\texpr = parse_object_or_array_creation_expression ();\n\t\t\tbreak;\n\t\tcase TokenType.YIELD:\n\t\t\texpr = parse_yield_expression ();\n\t\t\tbreak;\n\t\tcase TokenType.SIZEOF:\n\t\t\texpr = parse_sizeof_expression ();\n\t\t\tbreak;\n\t\tcase TokenType.TYPEOF:\n\t\t\texpr = parse_typeof_expression ();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\texpr = parse_simple_name ();\n\t\t\tbreak;\n\t\t}\n\n\t\t// process primary expressions that start with an inner primary expression\n\t\tbool found = true;\n\t\twhile (found) {\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.DOT:\n\t\t\t\texpr = parse_member_access (begin, expr);\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OP_PTR:\n\t\t\t\texpr = parse_pointer_member_access (begin, expr);\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OPEN_PARENS:\n\t\t\t\texpr = parse_method_call (begin, expr);\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OPEN_BRACKET:\n\t\t\t\texpr = parse_element_access (begin, expr);\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OP_INC:\n\t\t\t\texpr = parse_post_increment_expression (begin, expr);\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OP_DEC:\n\t\t\t\texpr = parse_post_decrement_expression (begin, expr);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfound = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn expr;\n\t}\n\n\tExpression parse_simple_name () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tstring id = parse_identifier ();\n\t\tbool qualified = false;\n\t\tif (id == \"global\" && accept (TokenType.DOUBLE_COLON)) {\n\t\t\tid = parse_identifier ();\n\t\t\tqualified = true;\n\t\t}\n\t\tList<DataType> type_arg_list = parse_type_argument_list (true);\n\t\tvar expr = new MemberAccess (null, id, get_src (begin));\n\t\texpr.qualified = qualified;\n\t\tif (type_arg_list != null) {\n\t\t\tforeach (DataType type_arg in type_arg_list) {\n\t\t\t\texpr.add_type_argument (type_arg);\n\t\t\t}\n\t\t}\n\t\treturn expr;\n\t}\n\n\tExpression parse_tuple () throws ParseError {\n\t\tvar begin = get_location ();\n\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar expr_list = new ArrayList<Expression> ();\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\texpr_list.add (parse_expression ());\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tif (expr_list.size != 1) {\n\t\t\tvar tuple = new Tuple (get_src (begin));\n\t\t\tforeach (Expression expr in expr_list) {\n\t\t\t\ttuple.add_expression (expr);\n\t\t\t}\n\t\t\treturn tuple;\n\t\t}\n\t\treturn expr_list.get (0);\n\t}\n\n\tExpression parse_template () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar template = new Template ();\n\n\t\texpect (TokenType.OPEN_TEMPLATE);\n\t\twhile (current () != TokenType.CLOSE_TEMPLATE) {\n\t\t\ttemplate.add_expression (parse_expression ());\n\t\t\texpect (TokenType.COMMA);\n\t\t}\n\t\texpect (TokenType.CLOSE_TEMPLATE);\n\n\t\ttemplate.source_reference = get_src (begin);\n\t\treturn template;\n\t}\n\n\tExpression parse_regex_literal () throws ParseError {\n\t\texpect (TokenType.OPEN_REGEX_LITERAL);\n\n\t\tvar expr = parse_literal ();\n\n\t\treturn expr;\n\t}\n\n\tExpression parse_member_access (SourceLocation begin, Expression inner) throws ParseError {\n\t\texpect (TokenType.DOT);\n\t\tstring id = parse_identifier ();\n\t\tList<DataType> type_arg_list = parse_type_argument_list (true);\n\t\tvar expr = new MemberAccess (inner, id, get_src (begin));\n\t\tif (type_arg_list != null) {\n\t\t\tforeach (DataType type_arg in type_arg_list) {\n\t\t\t\texpr.add_type_argument (type_arg);\n\t\t\t}\n\t\t}\n\t\treturn expr;\n\t}\n\n\tExpression parse_pointer_member_access (SourceLocation begin, Expression inner) throws ParseError {\n\t\texpect (TokenType.OP_PTR);\n\t\tstring id = parse_identifier ();\n\t\tList<DataType> type_arg_list = parse_type_argument_list (true);\n\t\tvar expr = new MemberAccess.pointer (inner, id, get_src (begin));\n\t\tif (type_arg_list != null) {\n\t\t\tforeach (DataType type_arg in type_arg_list) {\n\t\t\t\texpr.add_type_argument (type_arg);\n\t\t\t}\n\t\t}\n\t\treturn expr;\n\t}\n\n\tExpression parse_method_call (SourceLocation begin, Expression inner) throws ParseError {\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar arg_list = parse_argument_list ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar init_list = parse_object_initializer ();\n\n\t\tif (init_list.size > 0 && inner is MemberAccess) {\n\t\t\t// struct creation expression\n\t\t\tvar member = (MemberAccess) inner;\n\t\t\tmember.creation_member = true;\n\n\t\t\tvar expr = new ObjectCreationExpression (member, get_src (begin));\n\t\t\texpr.struct_creation = true;\n\t\t\tforeach (Expression arg in arg_list) {\n\t\t\t\texpr.add_argument (arg);\n\t\t\t}\n\t\t\tforeach (MemberInitializer initializer in init_list) {\n\t\t\t\texpr.add_member_initializer (initializer);\n\t\t\t}\n\t\t\treturn expr;\n\t\t} else {\n\t\t\tvar expr = new MethodCall (inner, get_src (begin));\n\t\t\tforeach (Expression arg in arg_list) {\n\t\t\t\texpr.add_argument (arg);\n\t\t\t}\n\t\t\treturn expr;\n\t\t}\n\t}\n\n\tExpression parse_element_access (SourceLocation begin, Expression inner) throws ParseError {\n\t\texpect (TokenType.OPEN_BRACKET);\n\t\tvar index_list = parse_expression_list ();\n\t\tExpression? stop = null;\n\t\tif (index_list.size == 1 && accept (TokenType.COLON)) {\n\t\t\t// slice expression\n\t\t\tstop = parse_expression ();\n\t\t}\n\t\texpect (TokenType.CLOSE_BRACKET);\n\n\t\tif (stop == null) {\n\t\t\tvar expr = new ElementAccess (inner, get_src (begin));\n\t\t\tforeach (Expression index in index_list) {\n\t\t\t\texpr.append_index (index);\n\t\t\t}\n\t\t\treturn expr;\n\t\t} else {\n\t\t\treturn new SliceExpression (inner, index_list[0], stop, get_src (begin));\n\t\t}\n\t}\n\n\tList<Expression> parse_expression_list () throws ParseError {\n\t\tvar list = new ArrayList<Expression> ();\n\t\tdo {\n\t\t\tlist.add (parse_expression ());\n\t\t} while (accept (TokenType.COMMA));\n\t\treturn list;\n\t}\n\n\tExpression parse_this_access () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.THIS);\n\t\treturn new MemberAccess (null, \"this\", get_src (begin));\n\t}\n\n\tExpression parse_base_access () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.BASE);\n\t\treturn new BaseAccess (get_src (begin));\n\t}\n\n\tExpression parse_post_increment_expression (SourceLocation begin, Expression inner) throws ParseError {\n\t\texpect (TokenType.OP_INC);\n\t\treturn new PostfixExpression (inner, true, get_src (begin));\n\t}\n\n\tExpression parse_post_decrement_expression (SourceLocation begin, Expression inner) throws ParseError {\n\t\texpect (TokenType.OP_DEC);\n\t\treturn new PostfixExpression (inner, false, get_src (begin));\n\t}\n\n\tExpression parse_object_or_array_creation_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.NEW);\n\n#if VALAC_0_26\n\t\tif (is_inner_array_type ()) {\n\t\t\trollback (begin);\n\t\t\treturn parse_array_creation_expression ();\n\t\t}\n#endif\n\n\t\tvar member = parse_member_name ();\n\t\tif (accept (TokenType.OPEN_PARENS)) {\n\t\t\tvar expr = parse_object_creation_expression (begin, member);\n\t\t\treturn expr;\n\t\t} else {\n\t\t\tbool is_pointer_type = false;\n\t\t\twhile (accept (TokenType.STAR)) {\n\t\t\t\tis_pointer_type = true;\n\t\t\t}\n\t\t\tif (!is_pointer_type) {\n\t\t\t\taccept (TokenType.INTERR);\n\t\t\t}\n\t\t\tif (accept (TokenType.OPEN_BRACKET)) {\n\t\t\t\trollback (begin);\n\t\t\t\tvar expr = parse_array_creation_expression ();\n\t\t\t\treturn expr;\n\t\t\t} else {\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected ( or [\"));\n\t\t\t}\n\t\t}\n\t}\n\n\tExpression parse_object_creation_expression (SourceLocation begin, MemberAccess member) throws ParseError {\n\t\tmember.creation_member = true;\n\t\tvar arg_list = parse_argument_list ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar init_list = parse_object_initializer ();\n\n\t\tvar expr = new ObjectCreationExpression (member, get_src (begin));\n\t\tforeach (Expression arg in arg_list) {\n\t\t\texpr.add_argument (arg);\n\t\t}\n\t\tforeach (MemberInitializer initializer in init_list) {\n\t\t\texpr.add_member_initializer (initializer);\n\t\t}\n\t\treturn expr;\n\t}\n\n\tExpression parse_array_creation_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.NEW);\n\n#if VALAC_0_26\n\t\tbool inner_array_type = is_inner_array_type ();\n\t\tif (inner_array_type) {\n\t\t\texpect (TokenType.OPEN_PARENS);\n\t\t\texpect (TokenType.UNOWNED);\n\t\t}\n#endif\n\t\t\n\t\tvar member = parse_member_name ();\n\t\tDataType element_type = UnresolvedType.new_from_expression (member);\n\t\tbool is_pointer_type = false;\n\t\twhile (accept (TokenType.STAR)) {\n\t\t\telement_type = new PointerType (element_type, get_src (begin));\n\t\t\tis_pointer_type = true;\n\t\t}\n\t\tif (!is_pointer_type) {\n\t\t\tif (accept (TokenType.INTERR)) {\n\t\t\t\telement_type.nullable = true;\n\t\t\t}\n\t\t}\n\t\t\n#if VALAC_0_26\n\t\tif (inner_array_type) {\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t\telement_type.value_owned = false;\n\t\t} else {\n\t\t\telement_type.value_owned = true;\n\t\t}\n#endif\n\t\t\n\t\texpect (TokenType.OPEN_BRACKET);\n\n\t\tbool size_specified = false;\n\t\tList<Expression> size_specifier_list = null;\n\t\tbool first = true;\n\t\tdo {\n\t\t\tif (!first) {\n\t\t\t\t// array of arrays: new T[][42]\n\n\t\t\t\tif (size_specified) {\n\t\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"size of inner arrays must not be specified in array creation expression\"));\n\t\t\t\t}\n\n\t\t\t\telement_type = new ArrayType (element_type, size_specifier_list.size, element_type.source_reference);\n\t\t\t} else {\n\t\t\t\tfirst = false;\n\t\t\t}\n\n\t\t\tsize_specifier_list = new ArrayList<Expression> ();\n\t\t\tdo {\n\t\t\t\tExpression size = null;\n\t\t\t\tif (current () != TokenType.CLOSE_BRACKET && current () != TokenType.COMMA) {\n\t\t\t\t\tsize = parse_expression ();\n\t\t\t\t\tsize_specified = true;\n\t\t\t\t}\n\t\t\t\tsize_specifier_list.add (size);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.CLOSE_BRACKET);\n\t\t} while (accept (TokenType.OPEN_BRACKET));\n\n\t\tInitializerList initializer = null;\n\t\tif (current () == TokenType.OPEN_BRACE) {\n\t\t\tinitializer = parse_initializer ();\n\t\t}\n\t\tvar expr = new ArrayCreationExpression (element_type, size_specifier_list.size, initializer, get_src (begin));\n\t\tif (size_specified) {\n\t\t\tforeach (Expression size in size_specifier_list) {\n\t\t\t\texpr.append_size (size);\n\t\t\t}\n\t\t}\n\t\treturn expr;\n\t}\n\n\tList<MemberInitializer> parse_object_initializer () throws ParseError {\n\t\tvar list = new ArrayList<MemberInitializer> ();\n\t\tif (accept (TokenType.OPEN_BRACE)) {\n\t\t\tdo {\n\t\t\t\tlist.add (parse_member_initializer ());\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.CLOSE_BRACE);\n\t\t}\n\t\treturn list;\n\t}\n\n\tMemberInitializer parse_member_initializer () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tstring id = parse_identifier ();\n\t\texpect (TokenType.ASSIGN);\n\t\tvar expr = parse_expression ();\n\n\t\treturn new MemberInitializer (id, expr, get_src (begin));\n\t}\n\n\tExpression parse_yield_expression () throws ParseError {\n\t\texpect (TokenType.YIELD);\n\n\t\tvar expr = parse_expression ();\n\n\t\tvar call = expr as MethodCall;\n\t\tvar object_creation = expr as ObjectCreationExpression;\n\t\tif (call == null && object_creation == null) {\n\t\t\tReport.error (expr.source_reference, \"syntax error, expected method call\");\n\t\t\tthrow new ParseError.SYNTAX (\"expected method call\");\n\t\t}\n\n\t\tif (call != null) {\n\t\t\tcall.is_yield_expression = true;\n\t\t} else if (object_creation != null) {\n\t\t\tobject_creation.is_yield_expression = true;\n\t\t}\n\n\t\treturn expr;\n\t}\n\n\tExpression parse_sizeof_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.SIZEOF);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar type = parse_type (true, false);\n\t\texpect (TokenType.CLOSE_PARENS);\n\n\t\treturn new SizeofExpression (type, get_src (begin));\n\t}\n\n\tExpression parse_typeof_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.TYPEOF);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar type = parse_type (true, false);\n\t\texpect (TokenType.CLOSE_PARENS);\n\n\t\treturn new TypeofExpression (type, get_src (begin));\n\t}\n\n\tUnaryOperator get_unary_operator (TokenType token_type) {\n\t\tswitch (token_type) {\n\t\tcase TokenType.PLUS:   return UnaryOperator.PLUS;\n\t\tcase TokenType.MINUS:  return UnaryOperator.MINUS;\n\t\tcase TokenType.OP_NEG: return UnaryOperator.LOGICAL_NEGATION;\n\t\tcase TokenType.TILDE:  return UnaryOperator.BITWISE_COMPLEMENT;\n\t\tcase TokenType.OP_INC: return UnaryOperator.INCREMENT;\n\t\tcase TokenType.OP_DEC: return UnaryOperator.DECREMENT;\n\t\tdefault:               return UnaryOperator.NONE;\n\t\t}\n\t}\n\n\tExpression parse_unary_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar operator = get_unary_operator (current ());\n\t\tif (operator != UnaryOperator.NONE) {\n\t\t\tnext ();\n\t\t\tvar op = parse_unary_expression ();\n\t\t\treturn new UnaryExpression (operator, op, get_src (begin));\n\t\t}\n\t\tswitch (current ()) {\n\t\tcase TokenType.HASH:\n\t\t\tif (!context.deprecated) {\n\t\t\t\tReport.warning (get_last_src (), \"deprecated syntax, use `(owned)` cast\");\n\t\t\t}\n\t\t\tnext ();\n\t\t\tvar op = parse_unary_expression ();\n\t\t\treturn new ReferenceTransferExpression (op, get_src (begin));\n\t\tcase TokenType.OPEN_PARENS:\n\t\t\tnext ();\n\t\t\tswitch (current ()) {\n#if VALAC_0_26\n\t\t\tcase TokenType.UNOWNED:\n\t\t\t\t// inner array type\n\t\t\t\tbreak;\n#endif\n\t\t\tcase TokenType.OWNED:\n\t\t\t\t// (owned) foo\n\t\t\t\tnext ();\n\t\t\t\tif (accept (TokenType.CLOSE_PARENS)) {\n\t\t\t\t\tvar op = parse_unary_expression ();\n\t\t\t\t\treturn new ReferenceTransferExpression (op, get_src (begin));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TokenType.VOID:\n\t\t\tcase TokenType.DYNAMIC:\n#if VALAC_0_26\n\t\t\tcase TokenType.OPEN_PARENS:\n#endif\n\t\t\tcase TokenType.IDENTIFIER:\n#if VALAC_0_26\n\t\t\t\tif (current () != TokenType.OPEN_PARENS || is_inner_array_type ()) {\n#endif\n\t\t\t\t\tvar type = parse_type (true, false);\n\t\t\t\t\tif (accept (TokenType.CLOSE_PARENS)) {\n\t\t\t\t\t\t// check follower to decide whether to create cast expression\n\t\t\t\t\t\tswitch (current ()) {\n\t\t\t\t\t\tcase TokenType.OP_NEG:\n\t\t\t\t\t\tcase TokenType.TILDE:\n\t\t\t\t\t\tcase TokenType.OPEN_PARENS:\n\t\t\t\t\t\tcase TokenType.TRUE:\n\t\t\t\t\t\tcase TokenType.FALSE:\n\t\t\t\t\t\tcase TokenType.INTEGER_LITERAL:\n\t\t\t\t\t\tcase TokenType.REAL_LITERAL:\n\t\t\t\t\t\tcase TokenType.CHARACTER_LITERAL:\n\t\t\t\t\t\tcase TokenType.STRING_LITERAL:\n\t\t\t\t\t\tcase TokenType.TEMPLATE_STRING_LITERAL:\n\t\t\t\t\t\tcase TokenType.VERBATIM_STRING_LITERAL:\n\t\t\t\t\t\tcase TokenType.REGEX_LITERAL:\n\t\t\t\t\t\tcase TokenType.NULL:\n\t\t\t\t\t\tcase TokenType.THIS:\n\t\t\t\t\t\tcase TokenType.BASE:\n\t\t\t\t\t\tcase TokenType.NEW:\n\t\t\t\t\t\tcase TokenType.YIELD:\n\t\t\t\t\t\tcase TokenType.SIZEOF:\n\t\t\t\t\t\tcase TokenType.TYPEOF:\n\t\t\t\t\t\tcase TokenType.IDENTIFIER:\n\t\t\t\t\t\tcase TokenType.PARAMS:\n\t\t\t\t\t\t\tvar inner = parse_unary_expression ();\n\t\t\t\t\t\t\treturn new CastExpression (inner, type, get_src (begin), false);\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#if VALAC_0_26\n\t\t\t\t}\n#endif\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OP_NEG:\n\t\t\t\tnext ();\n\t\t\t\tif (accept (TokenType.CLOSE_PARENS)) {\n\t\t\t\t\t// (!) non-null cast\n\t\t\t\t\tvar inner = parse_unary_expression ();\n\t\t\t\t\treturn new CastExpression.non_null (inner, get_src (begin));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// no cast expression\n\t\t\trollback (begin);\n\t\t\tbreak;\n\t\tcase TokenType.STAR:\n\t\t\tnext ();\n\t\t\tvar op = parse_unary_expression ();\n\t\t\treturn new PointerIndirection (op, get_src (begin));\n\t\tcase TokenType.BITWISE_AND:\n\t\t\tnext ();\n\t\t\tvar op = parse_unary_expression ();\n\t\t\treturn new AddressofExpression (op, get_src (begin));\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\tvar expr = parse_primary_expression ();\n\t\treturn expr;\n\t}\n\n\tBinaryOperator get_binary_operator (TokenType token_type) {\n\t\tswitch (token_type) {\n\t\tcase TokenType.STAR:    return BinaryOperator.MUL;\n\t\tcase TokenType.DIV:     return BinaryOperator.DIV;\n\t\tcase TokenType.PERCENT: return BinaryOperator.MOD;\n\t\tcase TokenType.PLUS:    return BinaryOperator.PLUS;\n\t\tcase TokenType.MINUS:   return BinaryOperator.MINUS;\n\t\tcase TokenType.OP_LT:   return BinaryOperator.LESS_THAN;\n\t\tcase TokenType.OP_GT:   return BinaryOperator.GREATER_THAN;\n\t\tcase TokenType.OP_LE:   return BinaryOperator.LESS_THAN_OR_EQUAL;\n\t\tcase TokenType.OP_GE:   return BinaryOperator.GREATER_THAN_OR_EQUAL;\n\t\tcase TokenType.OP_EQ:   return BinaryOperator.EQUALITY;\n\t\tcase TokenType.OP_NE:   return BinaryOperator.INEQUALITY;\n\t\tdefault:                return BinaryOperator.NONE;\n\t\t}\n\t}\n\n\tExpression parse_multiplicative_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_unary_expression ();\n\t\tbool found = true;\n\t\twhile (found) {\n\t\t\tvar operator = get_binary_operator (current ());\n\t\t\tswitch (operator) {\n\t\t\tcase BinaryOperator.MUL:\n\t\t\tcase BinaryOperator.DIV:\n\t\t\tcase BinaryOperator.MOD:\n\t\t\t\tnext ();\n\t\t\t\tvar right = parse_unary_expression ();\n\t\t\t\tleft = new BinaryExpression (operator, left, right, get_src (begin));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfound = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_additive_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_multiplicative_expression ();\n\t\tbool found = true;\n\t\twhile (found) {\n\t\t\tvar operator = get_binary_operator (current ());\n\t\t\tswitch (operator) {\n\t\t\tcase BinaryOperator.PLUS:\n\t\t\tcase BinaryOperator.MINUS:\n\t\t\t\tnext ();\n\t\t\t\tvar right = parse_multiplicative_expression ();\n\t\t\t\tleft = new BinaryExpression (operator, left, right, get_src (begin));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfound = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_shift_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_additive_expression ();\n\t\tbool found = true;\n\t\twhile (found) {\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.OP_SHIFT_LEFT:\n\t\t\t\tnext ();\n\t\t\t\tvar right = parse_additive_expression ();\n\t\t\t\tleft = new BinaryExpression (BinaryOperator.SHIFT_LEFT, left, right, get_src (begin));\n\t\t\t\tbreak;\n\t\t\t// don't use OP_SHIFT_RIGHT to support >> for nested generics\n\t\t\tcase TokenType.OP_GT:\n\t\t\t\tchar* first_gt_pos = tokens[index].begin.pos;\n\t\t\t\tnext ();\n\t\t\t\t// only accept >> when there is no space between the two > signs\n\t\t\t\tif (current () == TokenType.OP_GT && tokens[index].begin.pos == first_gt_pos + 1) {\n\t\t\t\t\tnext ();\n\t\t\t\t\tvar right = parse_additive_expression ();\n\t\t\t\t\tleft = new BinaryExpression (BinaryOperator.SHIFT_RIGHT, left, right, get_src (begin));\n\t\t\t\t} else {\n\t\t\t\t\tprev ();\n\t\t\t\t\tfound = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfound = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_relational_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_shift_expression ();\n\n\t\tbool first = true;\n\t\tbool found = true;\n\t\twhile (found) {\n\t\t\tvar operator = get_binary_operator (current ());\n\t\t\tswitch (operator) {\n\t\t\tcase BinaryOperator.LESS_THAN:\n\t\t\tcase BinaryOperator.LESS_THAN_OR_EQUAL:\n\t\t\tcase BinaryOperator.GREATER_THAN_OR_EQUAL:\n\t\t\t\tnext ();\n\t\t\t\tvar right = parse_shift_expression ();\n\t\t\t\tleft = new BinaryExpression (operator, left, right, get_src (begin));\n\t\t\t\tif (!first) {\n\t\t\t\t\tvar be = (BinaryExpression) left;\n\t\t\t\t\tbe.chained = true;\n\t\t\t\t\tif (!context.experimental) {\n\t\t\t\t\t\tReport.warning (left.source_reference, \"chained relational expressions are experimental\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfirst = false;\n\t\t\t\tbreak;\n\t\t\tcase BinaryOperator.GREATER_THAN:\n\t\t\t\tnext ();\n\t\t\t\t// ignore >> and >>= (two tokens due to generics)\n\t\t\t\tif (current () != TokenType.OP_GT && current () != TokenType.OP_GE) {\n\t\t\t\t\tvar right = parse_shift_expression ();\n\t\t\t\t\tleft = new BinaryExpression (operator, left, right, get_src (begin));\n\t\t\t\t\tif (!first) {\n\t\t\t\t\t\tvar be = (BinaryExpression) left;\n\t\t\t\t\t\tbe.chained = true;\n\t\t\t\t\t\tif (!context.experimental) {\n\t\t\t\t\t\t\tReport.warning (left.source_reference, \"chained relational expressions are experimental\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfirst = false;\n\t\t\t\t} else {\n\t\t\t\t\tprev ();\n\t\t\t\t\tfound = false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tswitch (current ()) {\n\t\t\t\tcase TokenType.IS:\n\t\t\t\t\tnext ();\n\t\t\t\t\tvar type = parse_type (true, false);\n\t\t\t\t\tleft = new TypeCheck (left, type, get_src (begin));\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.AS:\n\t\t\t\t\tnext ();\n\t\t\t\t\tvar type = parse_type (true, false);\n\t\t\t\t\tleft = new CastExpression (left, type, get_src (begin), true);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tfound = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_equality_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_relational_expression ();\n\t\tbool found = true;\n\t\twhile (found) {\n\t\t\tvar operator = get_binary_operator (current ());\n\t\t\tswitch (operator) {\n\t\t\tcase BinaryOperator.EQUALITY:\n\t\t\tcase BinaryOperator.INEQUALITY:\n\t\t\t\tnext ();\n\t\t\t\tvar right = parse_relational_expression ();\n\t\t\t\tleft = new BinaryExpression (operator, left, right, get_src (begin));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tfound = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_and_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_equality_expression ();\n\t\twhile (accept (TokenType.BITWISE_AND)) {\n\t\t\tvar right = parse_equality_expression ();\n\t\t\tleft = new BinaryExpression (BinaryOperator.BITWISE_AND, left, right, get_src (begin));\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_exclusive_or_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_and_expression ();\n\t\twhile (accept (TokenType.CARRET)) {\n\t\t\tvar right = parse_and_expression ();\n\t\t\tleft = new BinaryExpression (BinaryOperator.BITWISE_XOR, left, right, get_src (begin));\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_inclusive_or_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_exclusive_or_expression ();\n\t\twhile (accept (TokenType.BITWISE_OR)) {\n\t\t\tvar right = parse_exclusive_or_expression ();\n\t\t\tleft = new BinaryExpression (BinaryOperator.BITWISE_OR, left, right, get_src (begin));\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_in_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_inclusive_or_expression ();\n\t\twhile (accept (TokenType.IN)) {\n\t\t\tvar right = parse_inclusive_or_expression ();\n\t\t\tleft = new BinaryExpression (BinaryOperator.IN, left, right, get_src (begin));\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_conditional_and_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_in_expression ();\n\t\twhile (accept (TokenType.OP_AND)) {\n\t\t\tvar right = parse_in_expression ();\n\t\t\tleft = new BinaryExpression (BinaryOperator.AND, left, right, get_src (begin));\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_conditional_or_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_conditional_and_expression ();\n\t\twhile (accept (TokenType.OP_OR)) {\n\t\t\tvar right = parse_conditional_and_expression ();\n\t\t\tleft = new BinaryExpression (BinaryOperator.OR, left, right, get_src (begin));\n\t\t}\n\t\treturn left;\n\t}\n\n\tExpression parse_coalescing_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar left = parse_conditional_or_expression ();\n\t\tif (accept (TokenType.OP_COALESCING)) {\n\t\t\tvar right = parse_coalescing_expression ();\n\t\t\treturn new BinaryExpression (BinaryOperator.COALESCE, left, right, get_src (begin));\n\t\t} else {\n\t\t\treturn left;\n\t\t}\n\t}\n\n\tExpression parse_conditional_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar condition = parse_coalescing_expression ();\n\t\tif (accept (TokenType.INTERR)) {\n\t\t\tvar true_expr = parse_expression ();\n\t\t\texpect (TokenType.COLON);\n\t\t\tvar false_expr = parse_expression ();\n\t\t\treturn new ConditionalExpression (condition, true_expr, false_expr, get_src (begin));\n\t\t} else {\n\t\t\treturn condition;\n\t\t}\n\t}\n\n\tParameter parse_lambda_parameter () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar direction = ParameterDirection.IN;\n\t\tif (accept (TokenType.OUT)) {\n\t\t\tdirection = ParameterDirection.OUT;\n\t\t} else if (accept (TokenType.REF)) {\n\t\t\tdirection = ParameterDirection.REF;\n\t\t}\n\n\t\tstring id = parse_identifier ();\n\n\t\tvar param = new Parameter (id, null, get_src (begin));\n\t\tparam.direction = direction;\n\t\treturn param;\n\t}\n\n\tExpression parse_lambda_expression () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tList<Parameter> params = new ArrayList<Parameter> ();\n\t\tif (accept (TokenType.OPEN_PARENS)) {\n\t\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\t\tdo {\n\t\t\t\t\tparams.add (parse_lambda_parameter ());\n\t\t\t\t} while (accept (TokenType.COMMA));\n\t\t\t}\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t} else {\n\t\t\tparams.add (parse_lambda_parameter ());\n\t\t}\n\t\texpect (TokenType.LAMBDA);\n\n\t\tLambdaExpression lambda;\n\t\tif (current () == TokenType.OPEN_BRACE) {\n\t\t\tvar block = parse_block ();\n\t\t\tlambda = new LambdaExpression.with_statement_body (block, get_src (begin));\n\t\t} else {\n\t\t\tvar expr = parse_expression ();\n\t\t\tlambda = new LambdaExpression (expr, get_src (begin));\n\t\t}\n\t\tforeach (var param in params) {\n\t\t\tlambda.add_parameter (param);\n\t\t}\n\t\treturn lambda;\n\t}\n\n\tAssignmentOperator get_assignment_operator (TokenType token_type) {\n\t\tswitch (token_type) {\n\t\tcase TokenType.ASSIGN:             return AssignmentOperator.SIMPLE;\n\t\tcase TokenType.ASSIGN_ADD:         return AssignmentOperator.ADD;\n\t\tcase TokenType.ASSIGN_SUB:         return AssignmentOperator.SUB;\n\t\tcase TokenType.ASSIGN_BITWISE_OR:  return AssignmentOperator.BITWISE_OR;\n\t\tcase TokenType.ASSIGN_BITWISE_AND: return AssignmentOperator.BITWISE_AND;\n\t\tcase TokenType.ASSIGN_BITWISE_XOR: return AssignmentOperator.BITWISE_XOR;\n\t\tcase TokenType.ASSIGN_DIV:         return AssignmentOperator.DIV;\n\t\tcase TokenType.ASSIGN_MUL:         return AssignmentOperator.MUL;\n\t\tcase TokenType.ASSIGN_PERCENT:     return AssignmentOperator.PERCENT;\n\t\tcase TokenType.ASSIGN_SHIFT_LEFT:  return AssignmentOperator.SHIFT_LEFT;\n\t\tdefault:                           return AssignmentOperator.NONE;\n\t\t}\n\t}\n\n\tExpression parse_expression () throws ParseError {\n\t\tif (is_lambda_expression ()) {\n\t\t\treturn parse_lambda_expression ();\n\t\t}\n\n\t\tvar begin = get_location ();\n\n\t\tExpression expr = parse_conditional_expression ();\n\n\t\twhile (true) {\n\t\t\tvar operator = get_assignment_operator (current ());\n\t\t\tif (operator != AssignmentOperator.NONE) {\n\t\t\t\tnext ();\n\t\t\t\tvar rhs = parse_expression ();\n\t\t\t\texpr = new Assignment (expr, rhs, operator, get_src (begin));\n\t\t\t} else if (current () == TokenType.OP_GT) { // >>=\n\t\t\t\tchar* first_gt_pos = tokens[index].begin.pos;\n\t\t\t\tnext ();\n\t\t\t\t// only accept >>= when there is no space between the two > signs\n\t\t\t\tif (current () == TokenType.OP_GE && tokens[index].begin.pos == first_gt_pos + 1) {\n\t\t\t\t\tnext ();\n\t\t\t\t\tvar rhs = parse_expression ();\n\t\t\t\t\texpr = new Assignment (expr, rhs, AssignmentOperator.SHIFT_RIGHT, get_src (begin));\n\t\t\t\t} else {\n\t\t\t\t\tprev ();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn expr;\n\t}\n\n\tvoid parse_statements (Block block) throws ParseError {\n\t\twhile (current () != TokenType.CLOSE_BRACE\n\t\t       && current () != TokenType.CASE\n\t\t       && current () != TokenType.DEFAULT\n\t\t       && current () != TokenType.EOF) {\n\t\t\ttry {\n\t\t\t\tStatement stmt = null;\n\t\t\t\tbool is_decl = false;\n\n\t\t\t\tcomment = scanner.pop_comment ();\n\t\t\t\tswitch (current ()) {\n\t\t\t\tcase TokenType.OPEN_BRACE:\n\t\t\t\t\tstmt = parse_block ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.SEMICOLON:\n\t\t\t\t\tstmt = parse_empty_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.IF:\n\t\t\t\t\tstmt = parse_if_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.SWITCH:\n\t\t\t\t\tstmt = parse_switch_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.WHILE:\n\t\t\t\t\tstmt = parse_while_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.DO:\n\t\t\t\t\tstmt = parse_do_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.FOR:\n\t\t\t\t\tstmt = parse_for_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.FOREACH:\n\t\t\t\t\tstmt = parse_foreach_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.BREAK:\n\t\t\t\t\tstmt = parse_break_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.CONTINUE:\n\t\t\t\t\tstmt = parse_continue_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.RETURN:\n\t\t\t\t\tstmt = parse_return_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.YIELD:\n\t\t\t\t\tstmt = parse_yield_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.THROW:\n\t\t\t\t\tstmt = parse_throw_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.TRY:\n\t\t\t\t\tstmt = parse_try_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.LOCK:\n\t\t\t\t\tstmt = parse_lock_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.DELETE:\n\t\t\t\t\tstmt = parse_delete_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.VAR:\n\t\t\t\t\tis_decl = true;\n\t\t\t\t\tparse_local_variable_declarations (block);\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.CONST:\n\t\t\t\t\tis_decl = true;\n\t\t\t\t\tparse_local_constant_declarations (block);\n\t\t\t\t\tbreak;\n\t\t\t\tcase TokenType.OP_INC:\n\t\t\t\tcase TokenType.OP_DEC:\n\t\t\t\tcase TokenType.BASE:\n\t\t\t\tcase TokenType.THIS:\n#if !VALAC_0_26\n\t\t\t\tcase TokenType.OPEN_PARENS:\n#endif\n\t\t\t\tcase TokenType.STAR:\n\t\t\t\tcase TokenType.NEW:\n\t\t\t\t\tstmt = parse_expression_statement ();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbool is_expr = is_expression ();\n\t\t\t\t\tif (is_expr) {\n\t\t\t\t\t\tstmt = parse_expression_statement ();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tis_decl = true;\n\t\t\t\t\t\tparse_local_variable_declarations (block);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (!is_decl) {\n\t\t\t\t\tblock.add_statement (stmt);\n\t\t\t\t}\n\t\t\t} catch (ParseError e) {\n\t\t\t\tif (recover () != RecoveryState.STATEMENT_BEGIN) {\n\t\t\t\t\t// beginning of next declaration or end of file reached\n\t\t\t\t\t// return what we have so far\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbool is_expression () throws ParseError {\n#if VALAC_0_26\n\t\tif (current () == TokenType.OPEN_PARENS) {\n\t\t\treturn !is_inner_array_type ();\n\t\t}\n#endif\n\t\t\n\t\tvar begin = get_location ();\n\n\t\t// decide between declaration and expression statement\n\t\tskip_type ();\n\t\tswitch (current ()) {\n\t\t// invocation expression\n\t\tcase TokenType.OPEN_PARENS:\n\t\t// postfix increment\n\t\tcase TokenType.OP_INC:\n\t\t// postfix decrement\n\t\tcase TokenType.OP_DEC:\n\t\t// assignments\n\t\tcase TokenType.ASSIGN:\n\t\tcase TokenType.ASSIGN_ADD:\n\t\tcase TokenType.ASSIGN_BITWISE_AND:\n\t\tcase TokenType.ASSIGN_BITWISE_OR:\n\t\tcase TokenType.ASSIGN_BITWISE_XOR:\n\t\tcase TokenType.ASSIGN_DIV:\n\t\tcase TokenType.ASSIGN_MUL:\n\t\tcase TokenType.ASSIGN_PERCENT:\n\t\tcase TokenType.ASSIGN_SHIFT_LEFT:\n\t\tcase TokenType.ASSIGN_SUB:\n\t\tcase TokenType.OP_GT: // >>=\n\t\t// member access\n\t\tcase TokenType.DOT:\n\t\t// pointer member access\n\t\tcase TokenType.OP_PTR:\n\t\t\trollback (begin);\n\t\t\treturn true;\n\t\tdefault:\n\t\t\trollback (begin);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tbool is_lambda_expression () {\n\t\tvar begin = get_location ();\n\n\t\tswitch (current ()) {\n\t\tcase TokenType.OUT:\n\t\tcase TokenType.REF:\n\t\t\tnext ();\n\t\t\tif (accept (TokenType.IDENTIFIER) && accept (TokenType.LAMBDA)) {\n\t\t\t\trollback (begin);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TokenType.IDENTIFIER:\n\t\t\tnext ();\n\t\t\tif (accept (TokenType.LAMBDA)) {\n\t\t\t\trollback (begin);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TokenType.OPEN_PARENS:\n\t\t\tnext ();\n\t\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\t\tdo {\n\t\t\t\t\tif (current () == TokenType.OUT || current () == TokenType.REF) {\n\t\t\t\t\t\tnext ();\n\t\t\t\t\t}\n\t\t\t\t\tif (!accept (TokenType.IDENTIFIER)) {\n\t\t\t\t\t\trollback (begin);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} while (accept (TokenType.COMMA));\n\t\t\t}\n\t\t\tif (accept (TokenType.CLOSE_PARENS) && accept (TokenType.LAMBDA)) {\n\t\t\t\trollback (begin);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\trollback (begin);\n\t\treturn false;\n\t}\n\n\tBlock parse_embedded_statement () throws ParseError {\n\t\tif (current () == TokenType.OPEN_BRACE) {\n\t\t\tvar block = parse_block ();\n\t\t\treturn block;\n\t\t}\n\n\t\tcomment = scanner.pop_comment ();\n\n\t\tvar block = new Block (get_src (get_location ()));\n\n\t\tvar stmt = parse_embedded_statement_without_block ();\n\t\tblock.add_statement (stmt);\n\n\t\treturn block;\n\n\t}\n\n\tStatement parse_embedded_statement_without_block () throws ParseError {\n\t\tswitch (current ()) {\n\t\tcase TokenType.SEMICOLON: return parse_empty_statement ();\n\t\tcase TokenType.IF:        return parse_if_statement ();\n\t\tcase TokenType.SWITCH:    return parse_switch_statement ();\n\t\tcase TokenType.WHILE:     return parse_while_statement ();\n\t\tcase TokenType.DO:        return parse_do_statement ();\n\t\tcase TokenType.FOR:       return parse_for_statement ();\n\t\tcase TokenType.FOREACH:   return parse_foreach_statement ();\n\t\tcase TokenType.BREAK:     return parse_break_statement ();\n\t\tcase TokenType.CONTINUE:  return parse_continue_statement ();\n\t\tcase TokenType.RETURN:    return parse_return_statement ();\n\t\tcase TokenType.YIELD:     return parse_yield_statement ();\n\t\tcase TokenType.THROW:     return parse_throw_statement ();\n\t\tcase TokenType.TRY:       return parse_try_statement ();\n\t\tcase TokenType.LOCK:      return parse_lock_statement ();\n\t\tcase TokenType.DELETE:    return parse_delete_statement ();\n\t\tcase TokenType.VAR:\n\t\tcase TokenType.CONST:\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"embedded statement cannot be declaration \"));\n\t\tcase TokenType.OP_INC:\n\t\tcase TokenType.OP_DEC:\n\t\tcase TokenType.BASE:\n\t\tcase TokenType.THIS:\n\t\tcase TokenType.OPEN_PARENS:\n\t\tcase TokenType.STAR:\n\t\tcase TokenType.NEW:\n\t\t\treturn parse_expression_statement ();\n\t\tdefault:\n\t\t\tif (is_expression ()) {\n\t\t\t\treturn parse_expression_statement ();\n\t\t\t} else {\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"embedded statement cannot be declaration\"));\n\t\t\t}\n\t\t}\n\t}\n\n\tBlock parse_block () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.OPEN_BRACE);\n\t\tvar block = new Block (get_src (begin));\n\t\tparse_statements (block);\n\t\tif (!accept (TokenType.CLOSE_BRACE)) {\n\t\t\t// only report error if it's not a secondary error\n\t\t\tif (context.report.get_errors () == 0) {\n\t\t\t\tReport.error (get_current_src (), \"expected `}'\");\n\t\t\t}\n\t\t}\n\n\t\tblock.source_reference.end = get_current_src ().end;\n\n\t\treturn block;\n\t}\n\n\tStatement parse_empty_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new EmptyStatement (get_src (begin));\n\t}\n\n\tvoid parse_local_variable_declarations (Block block) throws ParseError {\n\t\tDataType variable_type;\n\t\tif (accept (TokenType.VAR)) {\n\t\t\tvariable_type = null;\n\t\t} else {\n\t\t\tvariable_type = parse_type (true, true);\n\t\t}\n\t\tdo {\n\t\t\tif (variable_type == null && accept (TokenType.OPEN_PARENS)) {\n\t\t\t\t// tuple\n\t\t\t\tvar begin = get_location ();\n\n\t\t\t\tstring[] identifiers = {};\n\t\t\t\tdo {\n\t\t\t\t\tidentifiers += parse_identifier ();\n\t\t\t\t} while (accept (TokenType.COMMA));\n\t\t\t\texpect (TokenType.CLOSE_PARENS);\n\n\t\t\t\texpect (TokenType.ASSIGN);\n\t\t\t\tvar tuple = parse_expression ();\n\t\t\t\tvar tuple_local = new LocalVariable (null, CodeNode.get_temp_name (), tuple, get_src (begin));\n\t\t\t\tblock.add_statement (new DeclarationStatement (tuple_local, tuple_local.source_reference));\n\n\t\t\t\tfor (int i = 0; i < identifiers.length; i++) {\n\t\t\t\t\tvar temp_access = new MemberAccess.simple (tuple_local.name, tuple_local.source_reference);\n\t\t\t\t\tvar ea = new ElementAccess (temp_access, tuple_local.source_reference);\n\t\t\t\t\tea.append_index (new IntegerLiteral (i.to_string ()));\n\t\t\t\t\tvar local = new LocalVariable (null, identifiers[i], ea, tuple_local.source_reference);\n\t\t\t\t\tblock.add_statement (new DeclarationStatement (local, local.source_reference));\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tDataType type_copy = null;\n\t\t\tif (variable_type != null) {\n\t\t\t\ttype_copy = variable_type.copy ();\n\t\t\t}\n\t\t\tvar local = parse_local_variable (type_copy);\n\t\t\tblock.add_statement (new DeclarationStatement (local, local.source_reference));\n\t\t} while (accept (TokenType.COMMA));\n\t\texpect (TokenType.SEMICOLON);\n\t}\n\n\tLocalVariable parse_local_variable (DataType? variable_type) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tstring id = parse_identifier ();\n\n\t\tvar type = parse_inline_array_type (variable_type);\n\n\t\tExpression initializer = null;\n\t\tif (accept (TokenType.ASSIGN)) {\n\t\t\tinitializer = parse_expression ();\n\t\t}\n\t\treturn new LocalVariable (type, id, initializer, get_src (begin));\n\t}\n\n\tvoid parse_local_constant_declarations (Block block) throws ParseError {\n\t\texpect (TokenType.CONST);\n\t\tvar constant_type = parse_type (false, false);\n\n\t\t// constant arrays don't own their element\n\t\tvar array_type = constant_type as ArrayType;\n\t\tif (array_type != null) {\n\t\t\tarray_type.element_type.value_owned = false;\n\t\t}\n\n\t\tdo {\n\t\t\tDataType type_copy = constant_type.copy ();\n\t\t\tvar local = parse_local_constant (type_copy);\n\t\t\tblock.add_statement (new DeclarationStatement (local, local.source_reference));\n\t\t\tblock.add_local_constant (local);\n\t\t\tlocal.active = false;\n\t\t} while (accept (TokenType.COMMA));\n\t\texpect (TokenType.SEMICOLON);\n\t}\n\n\tConstant parse_local_constant (DataType constant_type) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tstring id = parse_identifier ();\n\n\t\tvar type = parse_inline_array_type (constant_type);\n\n\t\texpect (TokenType.ASSIGN);\n\t\tvar initializer = parse_expression ();\n\n\t\treturn new Constant (id, type, initializer, get_src (begin));\n\t}\n\n\tStatement parse_expression_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar expr = parse_statement_expression ();\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new ExpressionStatement (expr, get_src (begin));\n\t}\n\n\tExpression parse_statement_expression () throws ParseError {\n\t\t// invocation expression, assignment,\n\t\t// or pre/post increment/decrement expression\n\t\tvar expr = parse_expression ();\n\t\treturn expr;\n\t}\n\n\tStatement parse_if_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.IF);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar condition = parse_expression ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar src = get_src (begin);\n\t\tvar true_stmt = parse_embedded_statement ();\n\t\tBlock false_stmt = null;\n\t\tif (accept (TokenType.ELSE)) {\n\t\t\tfalse_stmt = parse_embedded_statement ();\n\t\t}\n\t\treturn new IfStatement (condition, true_stmt, false_stmt, src);\n\t}\n\n\tStatement parse_switch_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.SWITCH);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar condition = parse_expression ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar stmt = new SwitchStatement (condition, get_src (begin));\n\t\texpect (TokenType.OPEN_BRACE);\n\t\twhile (current () != TokenType.CLOSE_BRACE) {\n\t\t\tbegin = get_location ();\n\t\t\tvar section = new SwitchSection (get_src (begin));\n\t\t\tdo {\n\t\t\t\tif (accept (TokenType.CASE)) {\n\t\t\t\t\tsection.add_label (new SwitchLabel (parse_expression (), get_src (begin)));\n\t\t\t\t} else {\n\t\t\t\t\texpect (TokenType.DEFAULT);\n\t\t\t\t\tsection.add_label (new SwitchLabel.with_default (get_src (begin)));\n\t\t\t\t}\n\t\t\t\texpect (TokenType.COLON);\n\t\t\t} while (current () == TokenType.CASE || current () == TokenType.DEFAULT);\n\t\t\tparse_statements (section);\n\t\t\tstmt.add_section (section);\n\t\t}\n\t\texpect (TokenType.CLOSE_BRACE);\n\t\treturn stmt;\n\t}\n\n\tStatement parse_while_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.WHILE);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar condition = parse_expression ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar body = parse_embedded_statement ();\n\t\treturn new WhileStatement (condition, body, get_src (begin));\n\t}\n\n\tStatement parse_do_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.DO);\n\t\tvar body = parse_embedded_statement ();\n\t\texpect (TokenType.WHILE);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar condition = parse_expression ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new DoStatement (body, condition, get_src (begin));\n\t}\n\n\tStatement parse_for_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\tBlock block = null;\n\t\texpect (TokenType.FOR);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar initializer_list = new ArrayList<Expression> ();\n\t\tif (!accept (TokenType.SEMICOLON)) {\n\t\t\tbool is_expr;\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.VAR:\n\t\t\t\tis_expr = false;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OP_INC:\n\t\t\tcase TokenType.OP_DEC:\n\t\t\t\tis_expr = true;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tis_expr = is_expression ();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (is_expr) {\n\t\t\t\tdo {\n\t\t\t\t\tinitializer_list.add (parse_statement_expression ());\n\t\t\t\t} while (accept (TokenType.COMMA));\n\t\t\t\texpect (TokenType.SEMICOLON);\n\t\t\t} else {\n\t\t\t\t// variable declaration in initializer\n\t\t\t\tblock = new Block (get_src (begin));\n\t\t\t\tparse_local_variable_declarations (block);\n\t\t\t}\n\t\t}\n\t\tExpression condition = null;\n\t\tif (current () != TokenType.SEMICOLON) {\n\t\t\tcondition = parse_expression ();\n\t\t}\n\t\texpect (TokenType.SEMICOLON);\n\t\tvar iterator_list = new ArrayList<Expression> ();\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\titerator_list.add (parse_statement_expression ());\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar src = get_src (begin);\n\t\tvar body = parse_embedded_statement ();\n\t\tvar stmt = new ForStatement (condition, body, src);\n\t\tforeach (Expression init in initializer_list) {\n\t\t\tstmt.add_initializer (init);\n\t\t}\n\t\tforeach (Expression iter in iterator_list) {\n\t\t\tstmt.add_iterator (iter);\n\t\t}\n\t\tif (block != null) {\n\t\t\tblock.add_statement (stmt);\n\t\t\treturn block;\n\t\t} else {\n\t\t\treturn stmt;\n\t\t}\n\t}\n\n\tStatement parse_foreach_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.FOREACH);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tDataType type = null;\n\t\tif (!accept (TokenType.VAR)) {\n\t\t\ttype = parse_type (true, true);\n\t\t\tif (accept (TokenType.IN)) {\n\t\t\t\tReport.error (type.source_reference, \"syntax error, expected var or type\");\n\t\t\t\tthrow new ParseError.SYNTAX (\"expected var or type\");\n\t\t\t}\n\t\t}\n\t\tstring id = parse_identifier ();\n\t\texpect (TokenType.IN);\n\t\tvar collection = parse_expression ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar src = get_src (begin);\n\t\tvar body = parse_embedded_statement ();\n\t\treturn new ForeachStatement (type, id, collection, body, src);\n\t}\n\n\tStatement parse_break_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.BREAK);\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new BreakStatement (get_src (begin));\n\t}\n\n\tStatement parse_continue_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.CONTINUE);\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new ContinueStatement (get_src (begin));\n\t}\n\n\tStatement parse_return_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.RETURN);\n\t\tExpression expr = null;\n\t\tif (current () != TokenType.SEMICOLON) {\n\t\t\texpr = parse_expression ();\n\t\t}\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new ReturnStatement (expr, get_src (begin));\n\t}\n\n\tStatement parse_yield_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.YIELD);\n\t\tif (current () != TokenType.SEMICOLON && current () != TokenType.RETURN) {\n\t\t\t// yield expression\n\t\t\tprev ();\n\t\t\treturn parse_expression_statement ();\n\t\t}\n\t\tExpression expr = null;\n\t\tif (accept (TokenType.RETURN)) {\n\t\t\texpr = parse_expression ();\n\t\t}\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new YieldStatement (expr, get_src (begin));\n\t}\n\n\tStatement parse_throw_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.THROW);\n\t\tvar expr = parse_expression ();\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new ThrowStatement (expr, get_src (begin));\n\t}\n\n\tStatement parse_try_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.TRY);\n\t\tvar try_block = parse_block ();\n\t\tBlock finally_clause = null;\n\t\tvar catch_clauses = new ArrayList<CatchClause> ();\n\t\tif (current () == TokenType.CATCH) {\n\t\t\tparse_catch_clauses (catch_clauses);\n\t\t\tif (current () == TokenType.FINALLY) {\n\t\t\t\tfinally_clause = parse_finally_clause ();\n\t\t\t}\n\t\t} else {\n\t\t\tfinally_clause = parse_finally_clause ();\n\t\t}\n\t\tvar stmt = new TryStatement (try_block, finally_clause, get_src (begin));\n\t\tforeach (CatchClause clause in catch_clauses) {\n\t\t\tstmt.add_catch_clause (clause);\n\t\t}\n\t\treturn stmt;\n\t}\n\n\tvoid parse_catch_clauses (List<CatchClause> catch_clauses) throws ParseError {\n\t\twhile (accept (TokenType.CATCH)) {\n\t\t\tvar begin = get_location ();\n\t\t\tDataType type = null;\n\t\t\tstring id = null;\n\t\t\tif (accept (TokenType.OPEN_PARENS)) {\n\t\t\t\ttype = parse_type (true, true);\n\t\t\t\tid = parse_identifier ();\n\t\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t\t}\n\t\t\tvar block = parse_block ();\n\t\t\tcatch_clauses.add (new CatchClause (type, id, block, get_src (begin)));\n\t\t}\n\t}\n\n\tBlock parse_finally_clause () throws ParseError {\n\t\texpect (TokenType.FINALLY);\n\t\tvar block = parse_block ();\n\t\treturn block;\n\t}\n\n\tStatement parse_lock_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.LOCK);\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tvar expr = parse_expression ();\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tvar stmt = parse_embedded_statement ();\n\t\treturn new LockStatement (expr, stmt, get_src (begin));\n\t}\n\n\tStatement parse_delete_statement () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.DELETE);\n\t\tvar expr = parse_expression ();\n\t\texpect (TokenType.SEMICOLON);\n\t\treturn new DeleteStatement (expr, get_src (begin));\n\t}\n\n\tstring parse_attribute_value () throws ParseError {\n\t\tswitch (current ()) {\n\t\tcase TokenType.NULL:\n\t\tcase TokenType.TRUE:\n\t\tcase TokenType.FALSE:\n\t\tcase TokenType.INTEGER_LITERAL:\n\t\tcase TokenType.REAL_LITERAL:\n\t\tcase TokenType.STRING_LITERAL:\n\t\t\tnext ();\n\t\t\treturn get_last_string ();\n\t\tcase TokenType.MINUS:\n\t\t\tnext ();\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.INTEGER_LITERAL:\n\t\t\tcase TokenType.REAL_LITERAL:\n\t\t\t\tnext ();\n\t\t\t\treturn \"-\" + get_last_string ();\n\t\t\tdefault:\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected number\"));\n\t\t\t}\n\t\tdefault:\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected literal\"));\n\t\t}\n\t}\n\n\tList<Attribute>? parse_attributes () throws ParseError {\n\t\tif (current () != TokenType.OPEN_BRACKET) {\n\t\t\treturn null;\n\t\t}\n\t\tvar attrs = new ArrayList<Attribute> ();\n\t\twhile (accept (TokenType.OPEN_BRACKET)) {\n\t\t\tdo {\n\t\t\t\tvar begin = get_location ();\n\t\t\t\tstring id = parse_identifier ();\n\t\t\t\tvar attr = new Attribute (id, get_src (begin));\n\t\t\t\tif (accept (TokenType.OPEN_PARENS)) {\n\t\t\t\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tid = parse_identifier ();\n\t\t\t\t\t\t\texpect (TokenType.ASSIGN);\n\t\t\t\t\t\t\tattr.add_argument (id, parse_attribute_value ());\n\t\t\t\t\t\t} while (accept (TokenType.COMMA));\n\t\t\t\t\t}\n\t\t\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t\t\t}\n\t\t\t\tattrs.add (attr);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.CLOSE_BRACKET);\n\t\t}\n\t\treturn attrs;\n\t}\n\n\tvoid set_attributes (CodeNode node, List<Attribute>? attributes) {\n\t\tif (attributes != null) {\n\t\t\tforeach (Attribute attr in (List<Attribute>) attributes) {\n\t\t\t\tif (node.get_attribute (attr.name) != null) {\n\t\t\t\t\tReport.error (attr.source_reference, \"duplicate attribute `%s`\".printf (attr.name));\n\t\t\t\t}\n\t\t\t\tnode.attributes.append (attr);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid parse_main_block (Symbol parent) throws ParseError {\n\t\tvar begin = get_location ();\n\n\t\tvar method = new Method (\"main\", new VoidType (), get_src (begin));\n\t\tmethod.body = new Block (get_src (begin));\n\t\tparse_statements (method.body);\n\t\tif (current () != TokenType.EOF) {\n\t\t\tReport.error (get_current_src (), \"expected end of file\");\n\t\t}\n\n\t\tmethod.body.source_reference.end = get_current_src ().end;\n\n\t\tif (!context.experimental) {\n\t\t\tReport.warning (method.source_reference, \"main blocks are experimental\");\n\t\t}\n\n\t\tparent.add_method (method);\n\t}\n\n\tvoid parse_declaration (Symbol parent, bool root = false) throws ParseError {\n\t\tcomment = scanner.pop_comment ();\n\t\tvar attrs = parse_attributes ();\n\t\t\n\t\tvar begin = get_location ();\n\t\t\n\t\tTokenType last_keyword = current ();\n\t\t\n\t\twhile (is_declaration_keyword (current ())) {\n\t\t\tlast_keyword = current ();\n\t\t\tnext ();\n\t\t}\n\t\n\t\tswitch (current ()) {\t\n\t\tcase TokenType.CONSTRUCT:\n\t\t\trollback (begin);\n\t\t\tparse_constructor_declaration (parent, attrs);\n\t\t\treturn;\n\t\tcase TokenType.TILDE:\n\t\t\trollback (begin);\n\t\t\tparse_destructor_declaration (parent, attrs);\n\t\t\treturn;\n\t\tcase TokenType.OPEN_BRACE:\n\t\tcase TokenType.SEMICOLON:\n\t\tcase TokenType.IF:\n\t\tcase TokenType.SWITCH:\n\t\tcase TokenType.WHILE:\n\t\tcase TokenType.DO:\n\t\tcase TokenType.FOR:\n\t\tcase TokenType.FOREACH:\n\t\tcase TokenType.BREAK:\n\t\tcase TokenType.CONTINUE:\n\t\tcase TokenType.RETURN:\n\t\tcase TokenType.YIELD:\n\t\tcase TokenType.THROW:\n\t\tcase TokenType.TRY:\n\t\tcase TokenType.LOCK:\n\t\tcase TokenType.DELETE:\n\t\tcase TokenType.VAR:\n\t\tcase TokenType.OP_INC:\n\t\tcase TokenType.OP_DEC:\n\t\tcase TokenType.BASE:\n\t\tcase TokenType.THIS:\n#if !VALAC_0_26\n\t\tcase TokenType.OPEN_PARENS:\n#endif\n\t\tcase TokenType.STAR:\n\t\tcase TokenType.NEW:\n\t\t\t// statement\n\t\t\tif (attrs != null) {\n\t\t\t\t// no attributes allowed before statements\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected statement\"));\n\t\t\t}\n\t\t\tif (!root) {\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"statements outside blocks allowed only in root namespace\"));\n\t\t\t}\n\t\t\trollback (begin);\n\t\t\tparse_main_block (parent);\n\t\t\treturn;\n\t\tdefault:\n\t\t\tif (root) {\n\t\t\t\tbool is_expr = is_expression ();\n\t\t\t\tif (is_expr) {\n\t\t\t\t\trollback (begin);\n\t\t\t\t\tparse_main_block (parent);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tskip_type ();\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.OPEN_BRACE:\n\t\t\tcase TokenType.SEMICOLON:\n\t\t\tcase TokenType.COLON:\n\t\t\t\trollback (begin);\n\t\t\t\tswitch (last_keyword) {\n\t\t\t\tcase TokenType.CLASS:\n\t\t\t\t\tparse_class_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tcase TokenType.ENUM:\n\t\t\t\t\tparse_enum_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tcase TokenType.ERRORDOMAIN:\n\t\t\t\t\tparse_errordomain_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tcase TokenType.INTERFACE:\n\t\t\t\t\tparse_interface_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tcase TokenType.NAMESPACE:\n\t\t\t\t\tparse_namespace_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tcase TokenType.STRUCT:\n\t\t\t\t\tparse_struct_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OPEN_PARENS:\n\t\t\t\trollback (begin);\n\t\t\t\tparse_creation_method_declaration (parent, attrs);\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tskip_type (); // might contain type parameter list\n\t\t\t\tswitch (current ()) {\n\t\t\t\tcase TokenType.OPEN_PARENS:\n\t\t\t\t\trollback (begin);\n\t\t\t\t\tswitch (last_keyword) {\n\t\t\t\t\tcase TokenType.DELEGATE:\n\t\t\t\t\t\tparse_delegate_declaration (parent, attrs);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase TokenType.SIGNAL:\n\t\t\t\t\t\tparse_signal_declaration (parent, attrs);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparse_method_declaration (parent, attrs);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\tcase TokenType.ASSIGN:\n\t\t\t\tcase TokenType.SEMICOLON:\n\t\t\t\t\trollback (begin);\n\t\t\t\t\tswitch (last_keyword) {\n\t\t\t\t\tcase TokenType.CONST:\n\t\t\t\t\t\tparse_constant_declaration (parent, attrs);\n\t\t\t\t\t\treturn;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparse_field_declaration (parent, attrs);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\tcase TokenType.OPEN_BRACE:\n\t\t\t\tcase TokenType.THROWS:\n\t\t\t\t\trollback (begin);\n\t\t\t\t\tparse_property_declaration (parent, attrs);\n\t\t\t\t\treturn;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\trollback (begin);\n\n\t\tthrow new ParseError.SYNTAX (get_error (\"expected declaration\"));\n\t}\n\n\tvoid parse_declarations (Symbol parent, bool root = false) throws ParseError {\n\t\tif (!root) {\n\t\t\texpect (TokenType.OPEN_BRACE);\n\t\t}\n\t\twhile (current () != TokenType.CLOSE_BRACE && current () != TokenType.EOF) {\n\t\t\ttry {\n\t\t\t\tparse_declaration (parent, (parent == context.root));\n\t\t\t} catch (ParseError e) {\n\t\t\t\tint r;\n\t\t\t\tdo {\n\t\t\t\t\tr = recover ();\n\t\t\t\t\tif (r == RecoveryState.STATEMENT_BEGIN) {\n\t\t\t\t\t\tnext ();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} while (true);\n\t\t\t\tif (r == RecoveryState.EOF) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!root) {\n\t\t\tif (!accept (TokenType.CLOSE_BRACE)) {\n\t\t\t\t// only report error if it's not a secondary error\n\t\t\t\tif (context.report.get_errors () == 0) {\n\t\t\t\t\tReport.error (get_current_src (), \"expected `}'\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tenum RecoveryState {\n\t\tEOF,\n\t\tDECLARATION_BEGIN,\n\t\tSTATEMENT_BEGIN\n\t}\n\n\tRecoveryState recover () {\n\t\twhile (current () != TokenType.EOF) {\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.ABSTRACT:\n\t\t\tcase TokenType.CLASS:\n\t\t\tcase TokenType.CONST:\n\t\t\tcase TokenType.CONSTRUCT:\n\t\t\tcase TokenType.DELEGATE:\n\t\t\tcase TokenType.ENUM:\n\t\t\tcase TokenType.ERRORDOMAIN:\n\t\t\tcase TokenType.EXTERN:\n\t\t\tcase TokenType.INLINE:\n\t\t\tcase TokenType.INTERFACE:\n\t\t\tcase TokenType.INTERNAL:\n\t\t\tcase TokenType.NAMESPACE:\n\t\t\tcase TokenType.NEW:\n\t\t\tcase TokenType.OVERRIDE:\n\t\t\tcase TokenType.PRIVATE:\n\t\t\tcase TokenType.PROTECTED:\n\t\t\tcase TokenType.PUBLIC:\n\t\t\tcase TokenType.SEALED:\n\t\t\tcase TokenType.SIGNAL:\n\t\t\tcase TokenType.STATIC:\n\t\t\tcase TokenType.STRUCT:\n\t\t\tcase TokenType.VIRTUAL:\n\t\t\tcase TokenType.VOLATILE:\n\t\t\t\treturn RecoveryState.DECLARATION_BEGIN;\n\t\t\tcase TokenType.BREAK:\n\t\t\tcase TokenType.CONTINUE:\n\t\t\tcase TokenType.DELETE:\n\t\t\tcase TokenType.DO:\n\t\t\tcase TokenType.FOR:\n\t\t\tcase TokenType.FOREACH:\n\t\t\tcase TokenType.IF:\n\t\t\tcase TokenType.LOCK:\n\t\t\tcase TokenType.RETURN:\n\t\t\tcase TokenType.SWITCH:\n\t\t\tcase TokenType.THROW:\n\t\t\tcase TokenType.TRY:\n\t\t\tcase TokenType.VAR:\n\t\t\tcase TokenType.WHILE:\n\t\t\tcase TokenType.YIELD:\n\t\t\t\treturn RecoveryState.STATEMENT_BEGIN;\n\t\t\tdefault:\n\t\t\t\tnext ();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn RecoveryState.EOF;\n\t}\n\n\tvoid parse_namespace_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.NAMESPACE);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar ns = new Namespace (sym.name, get_src (begin));\n\t\tif (comment != null) {\n\t\t\tns.add_comment (comment);\n\t\t\tcomment = null;\n\t\t}\n\n\t\tset_attributes (ns, attrs);\n\n\t\texpect (TokenType.OPEN_BRACE);\n\n\t\tvar old_using_directives = scanner.source_file.current_using_directives;\n\t\tparse_using_directives (ns);\n\n\t\tparse_declarations (ns, true);\n\n\t\tscanner.source_file.current_using_directives = old_using_directives;\n\n\t\tif (!accept (TokenType.CLOSE_BRACE)) {\n\t\t\t// only report error if it's not a secondary error\n\t\t\tif (context.report.get_errors () == 0) {\n\t\t\t\tReport.error (get_current_src (), \"expected `}'\");\n\t\t\t}\n\t\t}\n\n\t\tSymbol result = ns;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, ns.source_reference) : parent);\n\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tvoid parse_using_directives (Namespace ns) throws ParseError {\n\t\twhile (accept (TokenType.USING)) {\n\t\t\tdo {\n\t\t\t\tvar begin = get_location ();\n\t\t\t\tvar sym = parse_symbol_name ();\n\t\t\t\tvar ns_ref = new UsingDirective (sym, get_src (begin));\n\t\t\t\tscanner.source_file.add_using_directive (ns_ref);\n\t\t\t\tns.add_using_directive (ns_ref);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.SEMICOLON);\n\t\t}\n\t}\n\n\tvoid parse_class_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_type_declaration_modifiers ();\n\t\texpect (TokenType.CLASS);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar type_param_list = parse_type_parameter_list ();\n\t\tvar base_types = new ArrayList<DataType> ();\n\t\tif (accept (TokenType.COLON)) {\n\t\t\tdo {\n\t\t\t\tbase_types.add (parse_type (true, false));\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\n\t\tvar cl = new Class (sym.name, get_src (begin), comment);\n\t\tcl.access = access;\n\t\tif (ModifierFlags.ABSTRACT in flags) {\n\t\t\tcl.is_abstract = true;\n\t\t}\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tcl.external = true;\n\t\t}\n\t\tset_attributes (cl, attrs);\n\t\tforeach (TypeParameter type_param in type_param_list) {\n\t\t\tcl.add_type_parameter (type_param);\n\t\t}\n\t\tforeach (DataType base_type in base_types) {\n\t\t\tcl.add_base_type (base_type);\n\t\t}\n\n\t\tparse_declarations (cl);\n\n\t\t// ensure there is always a default construction method\n\t\tif (scanner.source_file.file_type == SourceFileType.SOURCE\n\t\t    && cl.default_construction_method == null) {\n\t\t\tvar m = new CreationMethod (cl.name, null, cl.source_reference);\n\t\t\tm.access = SymbolAccessibility.PUBLIC;\n\t\t\tm.body = new Block (cl.source_reference);\n\t\t\tcl.add_method (m);\n\t\t}\n\n\t\tSymbol result = cl;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, cl.source_reference) : parent);\n\t\t\tif (result is Namespace) {\n\t\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\t} else {\n\t\t\t\tnext.add_class ((Class) result);\n\t\t\t}\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tvoid parse_constant_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\texpect (TokenType.CONST);\n\t\tvar type = parse_type (false, false);\n\t\tstring id = parse_identifier ();\n\n\t\ttype = parse_inline_array_type (type);\n\n\t\tExpression initializer = null;\n\t\tif (accept (TokenType.ASSIGN)) {\n\t\t\tinitializer = parse_expression ();\n\t\t}\n\t\texpect (TokenType.SEMICOLON);\n\n\t\t// constant arrays don't own their element\n\t\tvar array_type = type as ArrayType;\n\t\tif (array_type != null) {\n\t\t\tarray_type.element_type.value_owned = false;\n\t\t}\n\n\t\tvar c = new Constant (id, type, initializer, get_src (begin), comment);\n\t\tc.access = access;\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tc.external = true;\n\t\t}\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tc.hides = true;\n\t\t}\n\t\tset_attributes (c, attrs);\n\n\t\tparent.add_constant (c);\n\t}\n\n\tvoid parse_field_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\tvar type = parse_type (true, true);\n\t\tstring id = parse_identifier ();\n\t\ttype = parse_inline_array_type (type);\n\n\t\tvar f = new Field (id, type, null, get_src (begin), comment);\n\t\tf.access = access;\n\t\tset_attributes (f, attrs);\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\tf.binding = MemberBinding.STATIC;\n\t\t} else if (ModifierFlags.CLASS in flags) {\n\t\t\tf.binding = MemberBinding.CLASS;\n\t\t}\n\t\tif (ModifierFlags.ABSTRACT in flags\n\t\t    || ModifierFlags.VIRTUAL in flags\n\t\t    || ModifierFlags.OVERRIDE in flags) {\n\t\t\tReport.error (f.source_reference, \"abstract, virtual, and override modifiers are not applicable to fields\");\n\t\t}\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tf.external = true;\n\t\t}\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tf.hides = true;\n\t\t}\n\t\tif (accept (TokenType.ASSIGN)) {\n\t\t\tf.initializer = parse_expression ();\n\t\t}\n\t\texpect (TokenType.SEMICOLON);\n\n\t\tparent.add_field (f);\n\t}\n\n\tInitializerList parse_initializer () throws ParseError {\n\t\tvar begin = get_location ();\n\t\texpect (TokenType.OPEN_BRACE);\n\t\tvar initializer = new InitializerList (get_src (begin));\n\t\twhile (current () != TokenType.CLOSE_BRACE) {\n\t\t\tvar init = parse_argument ();\n\t\t\tinitializer.append (init);\n\n\t\t\tif (!accept (TokenType.COMMA)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\texpect (TokenType.CLOSE_BRACE);\n\t\treturn initializer;\n\t}\n\n\tvoid parse_method_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\tvar type = parse_type (true, false);\n#if VALAC_0_26\n\t\tvar sym = parse_symbol_name ();\n#else\n\t\tstring id = parse_identifier ();\n#endif\n\t\tvar type_param_list = parse_type_parameter_list ();\n#if VALAC_0_26\n\t\tvar method = new Method (sym.name, type, get_src (begin), comment);\n\t\tif (sym.inner != null) {\n\t\t\tmethod.base_interface_type = new UnresolvedType.from_symbol (sym.inner, sym.inner.source_reference);\n\t\t}\n#else\n\t\tvar method = new Method (id, type, get_src (begin), comment);\n#endif\n\t\tmethod.access = access;\n\t\tset_attributes (method, attrs);\n\t\tforeach (TypeParameter type_param in type_param_list) {\n\t\t\tmethod.add_type_parameter (type_param);\n\t\t}\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\tmethod.binding = MemberBinding.STATIC;\n\t\t} else if (ModifierFlags.CLASS in flags) {\n\t\t\tmethod.binding = MemberBinding.CLASS;\n\t\t}\n\t\tif (ModifierFlags.ASYNC in flags) {\n\t\t\tmethod.coroutine = true;\n\t\t}\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tmethod.hides = true;\n\t\t}\n\n\t\tif (method.binding == MemberBinding.INSTANCE) {\n\t\t\tif (ModifierFlags.ABSTRACT in flags) {\n\t\t\t\tmethod.is_abstract = true;\n\t\t\t}\n\t\t\tif (ModifierFlags.VIRTUAL in flags) {\n\t\t\t\tmethod.is_virtual = true;\n\t\t\t}\n\t\t\tif (ModifierFlags.OVERRIDE in flags) {\n\t\t\t\tmethod.overrides = true;\n\t\t\t}\n\t\t\tif ((method.is_abstract && method.is_virtual)\n\t\t\t    || (method.is_abstract && method.overrides)\n\t\t\t    || (method.is_virtual && method.overrides)) {\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"only one of `abstract', `virtual', or `override' may be specified\"));\n\t\t\t}\n\t\t} else {\n\t\t\tif (ModifierFlags.ABSTRACT in flags\n\t\t\t    || ModifierFlags.VIRTUAL in flags\n\t\t\t    || ModifierFlags.OVERRIDE in flags) {\n\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"the modifiers `abstract', `virtual', and `override' are not valid for static methods\"));\n\t\t\t}\n\t\t}\n\n\t\tif (ModifierFlags.INLINE in flags) {\n\t\t\tmethod.is_inline = true;\n\t\t}\n\t\tif (ModifierFlags.EXTERN in flags) {\n\t\t\tmethod.external = true;\n\t\t}\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\tvar param = parse_parameter ();\n\t\t\t\tmethod.add_parameter (param);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tif (accept (TokenType.THROWS)) {\n\t\t\tdo {\n\t\t\t\tmethod.add_error_type (parse_type (true, false));\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\twhile (accept (TokenType.REQUIRES)) {\n\t\t\texpect (TokenType.OPEN_PARENS);\n\t\t\tmethod.add_precondition (parse_expression ());\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t}\n\t\twhile (accept (TokenType.ENSURES)) {\n\t\t\texpect (TokenType.OPEN_PARENS);\n\t\t\tmethod.add_postcondition (parse_expression ());\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t}\n\t\tif (!accept (TokenType.SEMICOLON)) {\n\t\t\tmethod.body = parse_block ();\n\t\t} else if (scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tmethod.external = true;\n\t\t}\n\n\t\tparent.add_method (method);\n\t}\n\n\tvoid parse_property_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\tvar type = parse_type (true, true);\n\n\t\tbool getter_owned = false;\n\t\tif (accept (TokenType.HASH)) {\n\t\t\tif (!context.deprecated) {\n\t\t\t\tReport.warning (get_last_src (), \"deprecated syntax, use `owned` modifier before `get'\");\n\t\t\t}\n\t\t\tgetter_owned = true;\n\t\t}\n\n\t\tstring id = parse_identifier ();\n\t\tvar prop = new Property (id, type, null, null, get_src (begin), comment);\n\t\tprop.access = access;\n\t\tset_attributes (prop, attrs);\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\tprop.binding = MemberBinding.STATIC;\n\t\t} else if (ModifierFlags.CLASS in flags) {\n\t\t\tprop.binding = MemberBinding.CLASS;\n\t\t}\n\t\tif (ModifierFlags.ABSTRACT in flags) {\n\t\t\tprop.is_abstract = true;\n\t\t}\n\t\tif (ModifierFlags.VIRTUAL in flags) {\n\t\t\tprop.is_virtual = true;\n\t\t}\n\t\tif (ModifierFlags.OVERRIDE in flags) {\n\t\t\tprop.overrides = true;\n\t\t}\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tprop.hides = true;\n\t\t}\n\t\tif (ModifierFlags.ASYNC in flags) {\n\t\t\tReport.error (prop.source_reference, \"async properties are not supported yet\");\n\t\t}\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tprop.external = true;\n\t\t}\n\t\tif ((prop.is_abstract && prop.is_virtual)\n\t\t\t|| (prop.is_abstract && prop.overrides)\n\t\t\t|| (prop.is_virtual && prop.overrides)) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"only one of `abstract', `virtual', or `override' may be specified\"));\n\t\t}\n\n\t\tif (accept (TokenType.THROWS)) {\n\t\t\tdo {\n\t\t\t\tprop.add_error_type (parse_type (true, false));\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\tReport.error (prop.source_reference, \"properties throwing errors are not supported yet\");\n\t\t}\n\t\texpect (TokenType.OPEN_BRACE);\n\t\twhile (current () != TokenType.CLOSE_BRACE) {\n\t\t\tif (accept (TokenType.DEFAULT)) {\n\t\t\t\tif (prop.initializer != null) {\n\t\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"property default value already defined\"));\n\t\t\t\t}\n\t\t\t\texpect (TokenType.ASSIGN);\n\t\t\t\tprop.initializer = parse_expression ();\n\t\t\t\texpect (TokenType.SEMICOLON);\n\t\t\t} else {\n\t\t\t\tcomment = scanner.pop_comment ();\n\n\t\t\t\tvar accessor_begin = get_location ();\n\t\t\t\tvar accessor_attrs = parse_attributes ();\n\t\t\t\tvar accessor_access = parse_access_modifier (SymbolAccessibility.PUBLIC);\n\n\t\t\t\tvar value_type = type.copy ();\n\t\t\t\tvalue_type.value_owned = accept (TokenType.OWNED);\n\n\t\t\t\tif (accept (TokenType.GET)) {\n\t\t\t\t\tif (prop.get_accessor != null) {\n\t\t\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"property get accessor already defined\"));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (getter_owned) {\n\t\t\t\t\t\tvalue_type.value_owned = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tBlock block = null;\n\t\t\t\t\tif (!accept (TokenType.SEMICOLON)) {\n\t\t\t\t\t\tblock = parse_block ();\n\t\t\t\t\t\tprop.external = false;\n\t\t\t\t\t}\n\t\t\t\t\tprop.get_accessor = new PropertyAccessor (true, false, false, value_type, block, get_src (accessor_begin), comment);\n\t\t\t\t\tset_attributes (prop.get_accessor, accessor_attrs);\n\t\t\t\t\tprop.get_accessor.access = accessor_access;\n\t\t\t\t} else {\n\t\t\t\t\tbool writable, _construct;\n\t\t\t\t\tif (accept (TokenType.SET)) {\n\t\t\t\t\t\twritable = true;\n\t\t\t\t\t\t_construct = accept (TokenType.CONSTRUCT);\n\t\t\t\t\t} else if (accept (TokenType.CONSTRUCT)) {\n\t\t\t\t\t\t_construct = true;\n\t\t\t\t\t\twritable = accept (TokenType.SET);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"expected get, set, or construct\"));\n\t\t\t\t\t}\n\t\t\t\t\tif (prop.set_accessor != null) {\n\t\t\t\t\t\tthrow new ParseError.SYNTAX (get_error (\"property set accessor already defined\"));\n\t\t\t\t\t}\n\t\t\t\t\tBlock block = null;\n\t\t\t\t\tif (!accept (TokenType.SEMICOLON)) {\n\t\t\t\t\t\tblock = parse_block ();\n\t\t\t\t\t\tprop.external = false;\n\t\t\t\t\t}\n\t\t\t\t\tprop.set_accessor = new PropertyAccessor (false, writable, _construct, value_type, block, get_src (accessor_begin), comment);\n\t\t\t\t\tset_attributes (prop.set_accessor, accessor_attrs);\n\t\t\t\t\tprop.set_accessor.access = accessor_access;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\texpect (TokenType.CLOSE_BRACE);\n\n\t\tif (!prop.is_abstract && prop.source_type == SourceFileType.SOURCE) {\n\t\t\tbool empty_get = (prop.get_accessor != null && prop.get_accessor.body == null);\n\t\t\tbool empty_set = (prop.set_accessor != null && prop.set_accessor.body == null);\n\n\t\t\tif (empty_get != empty_set) {\n\t\t\t\tif (empty_get) {\n\t\t\t\t\tReport.error (prop.source_reference, \"property getter must have a body\");\n\t\t\t\t} else if (empty_set) {\n\t\t\t\t\tReport.error (prop.source_reference, \"property setter must have a body\");\n\t\t\t\t}\n\t\t\t\tprop.error = true;\n\t\t\t}\n\n\t\t\tif (empty_get && empty_set) {\n\t\t\t\t/* automatic property accessor body generation */\n\t\t\t\tvar variable_type = prop.property_type.copy ();\n\t\t\t\tprop.field = new Field (\"_%s\".printf (prop.name), variable_type, prop.initializer, prop.source_reference);\n\t\t\t\tprop.field.access = SymbolAccessibility.PRIVATE;\n\t\t\t\tprop.field.binding = prop.binding;\n\t\t\t}\n\t\t}\n\n\t\tparent.add_property (prop);\n\t}\n\n\tvoid parse_signal_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\texpect (TokenType.SIGNAL);\n\t\tvar type = parse_type (true, false);\n\t\tstring id = parse_identifier ();\n\t\tvar sig = new Signal (id, type, get_src (begin), comment);\n\t\tsig.access = access;\n\t\tset_attributes (sig, attrs);\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"`static' modifier not allowed on signals\"));\n\t\t} else if (ModifierFlags.CLASS in flags) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"`class' modifier not allowed on signals\"));\n\t\t}\n\t\tif (ModifierFlags.VIRTUAL in flags) {\n\t\t\tsig.is_virtual = true;\n\t\t}\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tsig.hides = true;\n\t\t}\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\tvar param = parse_parameter ();\n\t\t\t\tsig.add_parameter (param);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tif (!accept (TokenType.SEMICOLON)) {\n\t\t\tsig.body = parse_block ();\n\t\t}\n\n\t\tparent.add_signal (sig);\n\t}\n\n\tvoid parse_constructor_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\texpect (TokenType.CONSTRUCT);\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"`new' modifier not allowed on constructor\"));\n\t\t}\n\t\tvar c = new Constructor (get_src (begin));\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\tc.binding = MemberBinding.STATIC;\n\t\t} else if (ModifierFlags.CLASS in flags) {\n\t\t\tc.binding = MemberBinding.CLASS;\n\t\t}\n\t\tc.body = parse_block ();\n\n\t\tparent.add_constructor (c);\n\t}\n\n\tvoid parse_destructor_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\texpect (TokenType.TILDE);\n\t\tparse_identifier ();\n\t\texpect (TokenType.OPEN_PARENS);\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"`new' modifier not allowed on destructor\"));\n\t\t}\n\t\tvar d = new Destructor (get_src (begin));\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\td.binding = MemberBinding.STATIC;\n\t\t} else if (ModifierFlags.CLASS in flags) {\n\t\t\td.binding = MemberBinding.CLASS;\n\t\t}\n\t\td.body = parse_block ();\n\n\t\tparent.add_destructor (d);\n\t}\n\n\tvoid parse_struct_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_type_declaration_modifiers ();\n\t\texpect (TokenType.STRUCT);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar type_param_list = parse_type_parameter_list ();\n\t\tDataType base_type = null;\n\t\tif (accept (TokenType.COLON)) {\n\t\t\tbase_type = parse_type (true, false);\n\t\t}\n\t\tvar st = new Struct (sym.name, get_src (begin), comment);\n\t\tst.access = access;\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tst.external = true;\n\t\t}\n\t\tset_attributes (st, attrs);\n\t\tforeach (TypeParameter type_param in type_param_list) {\n\t\t\tst.add_type_parameter (type_param);\n\t\t}\n\t\tif (base_type != null) {\n\t\t\tst.base_type = base_type;\n\t\t}\n\n\t\tparse_declarations (st);\n\n\t\tSymbol result = st;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, st.source_reference) : parent);\n\t\t\tif (result is Namespace) {\n\t\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\t} else {\n\t\t\t\tnext.add_struct ((Struct) result);\n\t\t\t}\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tvoid parse_interface_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_type_declaration_modifiers ();\n\t\texpect (TokenType.INTERFACE);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar type_param_list = parse_type_parameter_list ();\n\t\tvar base_types = new ArrayList<DataType> ();\n\t\tif (accept (TokenType.COLON)) {\n\t\t\tdo {\n\t\t\t\tvar type = parse_type (true, false);\n\t\t\t\tbase_types.add (type);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\tvar iface = new Interface (sym.name, get_src (begin), comment);\n\t\tiface.access = access;\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tiface.external = true;\n\t\t}\n\t\tset_attributes (iface, attrs);\n\t\tforeach (TypeParameter type_param in type_param_list) {\n\t\t\tiface.add_type_parameter (type_param);\n\t\t}\n\t\tforeach (DataType base_type in base_types) {\n\t\t\tiface.add_prerequisite (base_type);\n\t\t}\n\n\t\tparse_declarations (iface);\n\n\t\tSymbol result = iface;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, iface.source_reference) : parent);\n\t\t\tif (result is Namespace) {\n\t\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\t} else {\n\t\t\t\tnext.add_interface ((Interface) result);\n\t\t\t}\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tvoid parse_enum_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_type_declaration_modifiers ();\n\t\texpect (TokenType.ENUM);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar en = new Enum (sym.name, get_src (begin), comment);\n\t\ten.access = access;\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\ten.external = true;\n\t\t}\n\t\tset_attributes (en, attrs);\n\n\t\texpect (TokenType.OPEN_BRACE);\n\t\tdo {\n\t\t\tif (current () == TokenType.CLOSE_BRACE\n\t\t\t    && en.get_values ().size > 0) {\n\t\t\t\t// allow trailing comma\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar value_attrs = parse_attributes ();\n\t\t\tvar value_begin = get_location ();\n\t\t\tstring id = parse_identifier ();\n\t\t\tcomment = scanner.pop_comment ();\n\n\t\t\tExpression value = null;\n\t\t\tif (accept (TokenType.ASSIGN)) {\n\t\t\t\tvalue = parse_expression ();\n\t\t\t}\n\n\t\t\tvar ev = new EnumValue (id, value, get_src (value_begin), comment);\n\t\t\tev.access = SymbolAccessibility.PUBLIC;\n\t\t\tset_attributes (ev, value_attrs);\n\t\t\ten.add_value (ev);\n\t\t} while (accept (TokenType.COMMA));\n\t\tif (accept (TokenType.SEMICOLON)) {\n\t\t\t// enum methods\n\t\t\twhile (current () != TokenType.CLOSE_BRACE) {\n\t\t\t\tparse_declaration (en);\n\t\t\t}\n\t\t}\n\t\texpect (TokenType.CLOSE_BRACE);\n\n\t\tSymbol result = en;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, en.source_reference) : parent);\n\t\t\tif (result is Namespace) {\n\t\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\t} else {\n\t\t\t\tnext.add_enum ((Enum) result);\n\t\t\t}\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tvoid parse_errordomain_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_type_declaration_modifiers ();\n\t\texpect (TokenType.ERRORDOMAIN);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar ed = new ErrorDomain (sym.name, get_src (begin), comment);\n\t\ted.access = access;\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\ted.external = true;\n\t\t}\n\t\tset_attributes (ed, attrs);\n\n\t\texpect (TokenType.OPEN_BRACE);\n\t\tdo {\n\t\t\tif (current () == TokenType.CLOSE_BRACE\n\t\t\t    && ed.get_codes ().size > 0) {\n\t\t\t\t// allow trailing comma\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar code_attrs = parse_attributes ();\n\t\t\tvar code_begin = get_location ();\n\t\t\tstring id = parse_identifier ();\n\t\t\tcomment = scanner.pop_comment ();\n\t\t\tvar ec = new ErrorCode (id, get_src (code_begin), comment);\n\t\t\tset_attributes (ec, code_attrs);\n\t\t\tif (accept (TokenType.ASSIGN)) {\n\t\t\t\tec.value = parse_expression ();\n\t\t\t}\n\t\t\ted.add_code (ec);\n\t\t} while (accept (TokenType.COMMA));\n\t\tif (accept (TokenType.SEMICOLON)) {\n\t\t\t// errordomain methods\n\t\t\twhile (current () != TokenType.CLOSE_BRACE) {\n\t\t\t\tparse_declaration (ed);\n\t\t\t}\n\t\t}\n\t\texpect (TokenType.CLOSE_BRACE);\n\n\t\tSymbol result = ed;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, ed.source_reference) : parent);\n\t\t\tif (result is Namespace) {\n\t\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\t} else {\n\t\t\t\tnext.add_error_domain ((ErrorDomain) result);\n\t\t\t}\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tSymbolAccessibility parse_access_modifier (SymbolAccessibility default_access = SymbolAccessibility.PRIVATE) {\n\t\tswitch (current ()) {\n\t\tcase TokenType.PRIVATE:\n\t\t\tnext ();\n\t\t\treturn SymbolAccessibility.PRIVATE;\n\t\tcase TokenType.PROTECTED:\n\t\t\tnext ();\n\t\t\treturn SymbolAccessibility.PROTECTED;\n\t\tcase TokenType.INTERNAL:\n\t\t\tnext ();\n\t\t\treturn SymbolAccessibility.INTERNAL;\n\t\tcase TokenType.PUBLIC:\n\t\t\tnext ();\n\t\t\treturn SymbolAccessibility.PUBLIC;\n\t\tdefault:\n\t\t\treturn default_access;\n\t\t}\n\t}\n\n\tModifierFlags parse_type_declaration_modifiers () {\n\t\tModifierFlags flags = 0;\n\t\twhile (true) {\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.ABSTRACT:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.ABSTRACT;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.EXTERN:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.EXTERN;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.SEALED:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.SEALED;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn flags;\n\t\t\t}\n\t\t}\n\t}\n\n\tModifierFlags parse_member_declaration_modifiers () {\n\t\tModifierFlags flags = 0;\n\t\twhile (true) {\n\t\t\tswitch (current ()) {\n\t\t\tcase TokenType.ABSTRACT:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.ABSTRACT;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.ASYNC:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.ASYNC;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.CLASS:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.CLASS;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.EXTERN:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.EXTERN;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.INLINE:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.INLINE;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.NEW:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.NEW;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.OVERRIDE:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.OVERRIDE;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.SEALED:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.SEALED;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.STATIC:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.STATIC;\n\t\t\t\tbreak;\n\t\t\tcase TokenType.VIRTUAL:\n\t\t\t\tnext ();\n\t\t\t\tflags |= ModifierFlags.VIRTUAL;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn flags;\n\t\t\t}\n\t\t}\n\t}\n\n\tParameter parse_parameter () throws ParseError {\n\t\tvar attrs = parse_attributes ();\n\t\tvar begin = get_location ();\n\t\tif (accept (TokenType.ELLIPSIS)) {\n\t\t\t// varargs\n\t\t\treturn new Parameter.with_ellipsis (get_src (begin));\n\t\t}\n\t\tbool params_array = accept (TokenType.PARAMS);\n\t\tvar direction = ParameterDirection.IN;\n\t\tif (accept (TokenType.OUT)) {\n\t\t\tdirection = ParameterDirection.OUT;\n\t\t} else if (accept (TokenType.REF)) {\n\t\t\tdirection = ParameterDirection.REF;\n\t\t}\n\n\t\tDataType type;\n\t\tif (direction == ParameterDirection.IN) {\n\t\t\t// in parameters are unowned by default\n\t\t\ttype = parse_type (false, false);\n\t\t} else if (direction == ParameterDirection.REF) {\n\t\t\t// ref parameters own the value by default\n\t\t\ttype = parse_type (true, true);\n\t\t} else {\n\t\t\t// out parameters own the value by default\n\t\t\ttype = parse_type (true, false);\n\t\t}\n\t\tstring id = parse_identifier ();\n\n\t\ttype = parse_inline_array_type (type);\n\n\t\tvar param = new Parameter (id, type, get_src (begin));\n\t\tset_attributes (param, attrs);\n\t\tparam.direction = direction;\n\t\tparam.params_array = params_array;\n\t\tif (accept (TokenType.ASSIGN)) {\n\t\t\tparam.initializer = parse_expression ();\n\t\t}\n\t\treturn param;\n\t}\n\n\tvoid parse_creation_method_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\tvar sym = parse_symbol_name ();\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"`new' modifier not allowed on creation method\"));\n\t\t}\n\t\tCreationMethod method;\n\t\tif (sym.inner == null) {\n\t\t\tmethod = new CreationMethod (sym.name, null, get_src (begin), comment);\n\t\t} else {\n\t\t\tmethod = new CreationMethod (sym.inner.name, sym.name, get_src (begin), comment);\n\t\t}\n\t\tif (ModifierFlags.EXTERN in flags) {\n\t\t\tmethod.external = true;\n\t\t}\n\t\tif (ModifierFlags.ABSTRACT in flags\n\t\t    || ModifierFlags.VIRTUAL in flags\n\t\t    || ModifierFlags.OVERRIDE in flags) {\n\t\t\tReport.error (method.source_reference, \"abstract, virtual, and override modifiers are not applicable to creation methods\");\n\t\t}\n\t\tif (ModifierFlags.ASYNC in flags) {\n\t\t\tmethod.coroutine = true;\n\t\t}\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\tvar param = parse_parameter ();\n\t\t\t\tmethod.add_parameter (param);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tif (accept (TokenType.THROWS)) {\n\t\t\tdo {\n\t\t\t\tmethod.add_error_type (parse_type (true, false));\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\twhile (accept (TokenType.REQUIRES)) {\n\t\t\texpect (TokenType.OPEN_PARENS);\n\t\t\tmethod.add_precondition (parse_expression ());\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t}\n\t\twhile (accept (TokenType.ENSURES)) {\n\t\t\texpect (TokenType.OPEN_PARENS);\n\t\t\tmethod.add_postcondition (parse_expression ());\n\t\t\texpect (TokenType.CLOSE_PARENS);\n\t\t}\n\t\tmethod.access = access;\n\t\tset_attributes (method, attrs);\n\t\tif (!accept (TokenType.SEMICOLON)) {\n\t\t\tmethod.body = parse_block ();\n\t\t} else if (scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\tmethod.external = true;\n\t\t}\n\n\t\tparent.add_method (method);\n\t}\n\n\tvoid parse_delegate_declaration (Symbol parent, List<Attribute>? attrs) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tvar access = parse_access_modifier ();\n\t\tvar flags = parse_member_declaration_modifiers ();\n\t\texpect (TokenType.DELEGATE);\n\t\tif (ModifierFlags.NEW in flags) {\n\t\t\tthrow new ParseError.SYNTAX (get_error (\"`new' modifier not allowed on delegates\"));\n\t\t}\n\t\tvar type = parse_type (true, false);\n\t\tvar sym = parse_symbol_name ();\n\t\tvar type_param_list = parse_type_parameter_list ();\n\t\tvar d = new Delegate (sym.name, type, get_src (begin), comment);\n\t\td.access = access;\n\t\tset_attributes (d, attrs);\n\t\tif (ModifierFlags.STATIC in flags) {\n\t\t\tif (!context.deprecated) {\n\t\t\t\t// TODO enable warning in future releases\n\t\t\t\tReport.warning (get_last_src (), \"deprecated syntax, use [CCode (has_target = false)]\");\n\t\t\t}\n\t\t\td.has_target = false;\n\t\t}\n\t\tif (ModifierFlags.EXTERN in flags || scanner.source_file.file_type == SourceFileType.PACKAGE) {\n\t\t\td.external = true;\n\t\t}\n\t\tforeach (TypeParameter type_param in type_param_list) {\n\t\t\td.add_type_parameter (type_param);\n\t\t}\n\t\texpect (TokenType.OPEN_PARENS);\n\t\tif (current () != TokenType.CLOSE_PARENS) {\n\t\t\tdo {\n\t\t\t\tvar param = parse_parameter ();\n\t\t\t\td.add_parameter (param);\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.CLOSE_PARENS);\n\t\tif (accept (TokenType.THROWS)) {\n\t\t\tdo {\n\t\t\t\td.add_error_type (parse_type (true, false));\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t}\n\t\texpect (TokenType.SEMICOLON);\n\n\t\tSymbol result = d;\n\t\twhile (sym != null) {\n\t\t\tsym = sym.inner;\n\n\t\t\tSymbol next = (sym != null ? new Namespace (sym.name, d.source_reference) : parent);\n\t\t\tif (result is Namespace) {\n\t\t\t\tnext.add_namespace ((Namespace) result);\n\t\t\t} else {\n\t\t\t\tnext.add_delegate ((Delegate) result);\n\t\t\t}\n\t\t\tresult = next;\n\t\t}\n\t}\n\n\tList<TypeParameter> parse_type_parameter_list () throws ParseError {\n\t\tif (accept (TokenType.OP_LT)) {\n\t\t\tvar list = new ArrayList<TypeParameter> ();\n\t\t\tdo {\n\t\t\t\tvar begin = get_location ();\n\t\t\t\tstring id = parse_identifier ();\n\t\t\t\tlist.add (new TypeParameter (id, get_src (begin)));\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.OP_GT);\n\t\t\treturn list;\n\t\t} else {\n\t\t\tif (_empty_type_parameter_list == null) {\n\t\t\t\t_empty_type_parameter_list = new ArrayList<TypeParameter> ();\n\t\t\t}\n\t\t\treturn _empty_type_parameter_list;\n\t\t}\n\t}\n\n\tvoid skip_type_argument_list () throws ParseError {\n\t\tif (accept (TokenType.OP_LT)) {\n\t\t\tdo {\n\t\t\t\tskip_type ();\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\texpect (TokenType.OP_GT);\n\t\t}\n\t}\n\n\t// try to parse type argument list\n\tList<DataType>? parse_type_argument_list (bool maybe_expression) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tif (accept (TokenType.OP_LT)) {\n\t\t\tvar list = new ArrayList<DataType> ();\n\t\t\tdo {\n\t\t\t\tswitch (current ()) {\n\t\t\t\tcase TokenType.VOID:\n\t\t\t\tcase TokenType.DYNAMIC:\n\t\t\t\tcase TokenType.UNOWNED:\n\t\t\t\tcase TokenType.WEAK:\n\t\t\t\tcase TokenType.IDENTIFIER:\n\t\t\t\t\tvar type = parse_type (true, true);\n\t\t\t\t\tlist.add (type);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\trollback (begin);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} while (accept (TokenType.COMMA));\n\t\t\tif (!accept (TokenType.OP_GT)) {\n\t\t\t\trollback (begin);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (maybe_expression) {\n\t\t\t\t// check follower to decide whether to keep type argument list\n\t\t\t\tswitch (current ()) {\n\t\t\t\tcase TokenType.OPEN_PARENS:\n\t\t\t\tcase TokenType.CLOSE_PARENS:\n\t\t\t\tcase TokenType.CLOSE_BRACKET:\n\t\t\t\tcase TokenType.OPEN_BRACE:\n\t\t\t\tcase TokenType.COLON:\n\t\t\t\tcase TokenType.SEMICOLON:\n\t\t\t\tcase TokenType.COMMA:\n\t\t\t\tcase TokenType.DOT:\n\t\t\t\tcase TokenType.INTERR:\n\t\t\t\tcase TokenType.OP_EQ:\n\t\t\t\tcase TokenType.OP_NE:\n\t\t\t\t\t// keep type argument list\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// interpret tokens as expression\n\t\t\t\t\trollback (begin);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\t\treturn null;\n\t}\n\n\tMemberAccess parse_member_name (Expression? base_expr = null) throws ParseError {\n\t\tvar begin = get_location ();\n\t\tMemberAccess expr = null;\n\t\tbool first = true;\n\t\tdo {\n\t\t\tstring id = parse_identifier ();\n\n\t\t\t// The first member access can be global:: qualified\n\t\t\tbool qualified = false;\n\t\t\tif (first && id == \"global\" && accept (TokenType.DOUBLE_COLON)) {\n\t\t\t\tid = parse_identifier ();\n\t\t\t\tqualified = true;\n\t\t\t}\n\n\t\t\tList<DataType> type_arg_list = parse_type_argument_list (false);\n\t\t\texpr = new MemberAccess (expr != null ? expr : base_expr, id, get_src (begin));\n\t\t\texpr.qualified = qualified;\n\t\t\tif (type_arg_list != null) {\n\t\t\t\tforeach (DataType type_arg in type_arg_list) {\n\t\t\t\t\texpr.add_type_argument (type_arg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = false;\n\t\t} while (accept (TokenType.DOT));\n\t\treturn expr;\n\t}\n\n\tbool is_declaration_keyword (TokenType type) {\n\t\tswitch (type) {\n\t\tcase TokenType.ABSTRACT:\n\t\tcase TokenType.ASYNC:\n\t\tcase TokenType.CLASS:\n\t\tcase TokenType.CONST:\n\t\tcase TokenType.DELEGATE:\n\t\tcase TokenType.ENUM:\n\t\tcase TokenType.ERRORDOMAIN:\n\t\tcase TokenType.EXTERN:\n\t\tcase TokenType.INLINE:\n\t\tcase TokenType.INTERFACE:\n\t\tcase TokenType.INTERNAL:\n\t\tcase TokenType.NAMESPACE:\n\t\tcase TokenType.NEW:\n\t\tcase TokenType.OVERRIDE:\n\t\tcase TokenType.PRIVATE:\n\t\tcase TokenType.PROTECTED:\n\t\tcase TokenType.PUBLIC:\n\t\tcase TokenType.SEALED:\n\t\tcase TokenType.SIGNAL:\n\t\tcase TokenType.STATIC:\n\t\tcase TokenType.STRUCT:\n\t\tcase TokenType.VIRTUAL:\n\t\tcase TokenType.VOLATILE:\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "guanako/scanner/valascanner.vala",
    "content": "/* valascanner.vala\n *\n * Copyright (C) 2008-2012  Jürg Billeter\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n *\n * Author:\n * \tJürg Billeter <j@bitron.ch>\n * \tJukka-Pekka Iivonen <jp0409@jippii.fi>\n */\n\nusing GLib;\n\n/**\n * Lexical scanner for Vala source files.\n */\npublic class Vala.ScannerExt {\n\tpublic SourceFile source_file { get; private set; }\n\n\t/*GUANAKO_EXT_START*/\n\tpublic Set<string> used_defines { get; private set; }\n\t/*GUANAKO_EXT_END*/\n\n\tTokenType previous;\n\tchar* current;\n\tchar* end;\n\n\tint line;\n\tint column;\n\n\tComment _comment;\n\n\tConditional[] conditional_stack;\n\n\tstruct Conditional {\n\t\tpublic bool matched;\n\t\tpublic bool else_found;\n\t\tpublic bool skip_section;\n\t}\n\n\tState[] state_stack;\n\n\tenum State {\n\t\tPARENS,\n\t\tBRACE,\n\t\tBRACKET,\n\t\tTEMPLATE,\n\t\tTEMPLATE_PART,\n\t\tREGEX_LITERAL\n\t}\n\n\tpublic ScannerExt (SourceFile source_file) {\n\t\tthis.source_file = source_file;\n\n\t\t/*GUANAKO_EXT_START*/\n\t\tused_defines = new HashSet<string> (str_hash, str_equal);\n\t\t/*GUANAKO_EXT_END*/\n\n\t\tchar* begin = source_file.get_mapped_contents ();\n\t\tend = begin + source_file.get_mapped_length ();\n\n\t\tcurrent = begin;\n\n\t\tline = 1;\n\t\tcolumn = 1;\n\t}\n\n\tpublic void seek (SourceLocation location) {\n\t\tcurrent = location.pos;\n\t\tline = location.line;\n\t\tcolumn = location.column;\n\n\t\tconditional_stack = null;\n\t\tstate_stack = null;\n\t}\n\n\tbool in_template () {\n\t\treturn (state_stack.length > 0 && state_stack[state_stack.length - 1] == State.TEMPLATE);\n\t}\n\n\tbool in_template_part () {\n\t\treturn (state_stack.length > 0 && state_stack[state_stack.length - 1] == State.TEMPLATE_PART);\n\t}\n\n\tbool in_regex_literal () {\n\t\treturn (state_stack.length > 0 && state_stack[state_stack.length - 1] == State.REGEX_LITERAL);\n\t}\n\n\tbool is_ident_char (char c) {\n\t\treturn (c.isalnum () || c == '_');\n\t}\n\n\tSourceReference get_source_reference (int offset, int length = 0) {\n\t\treturn new SourceReference (source_file, SourceLocation (current, line, column + offset), SourceLocation (current + length, line, column + offset + length));\n\t}\n\n\tpublic TokenType read_regex_token (out SourceLocation token_begin, out SourceLocation token_end) {\n\t\tTokenType type;\n\t\tchar* begin = current;\n\t\ttoken_begin = SourceLocation (begin, line, column);\n\n\t\tint token_length_in_chars = -1;\n\n\t\tif (current >= end) {\n\t\t\ttype = TokenType.EOF;\n\t\t} else {\n\t\t\tswitch (current[0]) {\n\t\t\tcase '/':\n\t\t\t\ttype = TokenType.CLOSE_REGEX_LITERAL;\n\t\t\t\tcurrent++;\n\t\t\t\tstate_stack.length--;\n\t\t\t\tvar fl_i = false;\n\t\t\t\tvar fl_s = false;\n\t\t\t\tvar fl_m = false;\n\t\t\t\tvar fl_x = false;\n\t\t\t\twhile (current[0] == 'i' || current[0] == 's' || current[0] == 'm' || current[0] == 'x') {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase 'i':\n\t\t\t\t\t\tif (fl_i) {\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"modifier 'i' used more than once\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfl_i = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tif (fl_s) {\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"modifier 's' used more than once\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfl_s = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tif (fl_m) {\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"modifier 'm' used more than once\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfl_m = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'x':\n\t\t\t\t\t\tif (fl_x) {\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"modifier 'x' used more than once\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfl_x = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent++;\n\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttype = TokenType.REGEX_LITERAL;\n\t\t\t\ttoken_length_in_chars = 0;\n\t\t\t\twhile (current < end && current[0] != '/') {\n\t\t\t\t\tif (current[0] == '\\\\') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\tif (current >= end) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\t\tcase '\\'':\n\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\tcase '\\\\':\n\t\t\t\t\t\tcase '/':\n\t\t\t\t\t\tcase '^':\n\t\t\t\t\t\tcase '$':\n\t\t\t\t\t\tcase '.':\n\t\t\t\t\t\tcase '[':\n\t\t\t\t\t\tcase ']':\n\t\t\t\t\t\tcase '{':\n\t\t\t\t\t\tcase '}':\n\t\t\t\t\t\tcase '(':\n\t\t\t\t\t\tcase ')':\n\t\t\t\t\t\tcase '?':\n\t\t\t\t\t\tcase '*':\n\t\t\t\t\t\tcase '+':\n\t\t\t\t\t\tcase '-':\n\t\t\t\t\t\tcase '#':\n\t\t\t\t\t\tcase '&':\n\t\t\t\t\t\tcase '~':\n\t\t\t\t\t\tcase ':':\n\t\t\t\t\t\tcase ';':\n\t\t\t\t\t\tcase '<':\n\t\t\t\t\t\tcase '>':\n\t\t\t\t\t\tcase '|':\n\t\t\t\t\t\tcase '%':\n\t\t\t\t\t\tcase '=':\n\t\t\t\t\t\tcase '@':\n\t\t\t\t\t\tcase '0':\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'B':\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\tcase 'r':\n\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tcase 'p':\n\t\t\t\t\t\tcase 'P':\n\t\t\t\t\t\tcase 'e':\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\tcase 'D':\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tcase 'w':\n\t\t\t\t\t\tcase 'W':\n\t\t\t\t\t\tcase 'G':\n\t\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'u':\n\t\t\t\t\t\t\t// u escape character has four hex digits\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tint digit_length;\n\t\t\t\t\t\t\tfor (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) {\n\t\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (digit_length != 4) {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"\\\\u requires four hex digits\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'x':\n\t\t\t\t\t\t\t// hexadecimal escape character requires two hex digits\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tint digit_length;\n\t\t\t\t\t\t\tfor (digit_length = 0; current < end && current[0].isxdigit (); digit_length++) {\n\t\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (digit_length < 1) {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"\\\\x requires at least one hex digit\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid escape sequence\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (current[0] == '\\n') {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tunichar u = ((string) current).get_char_validated ((long) (end - current));\n\t\t\t\t\t\tif (u != (unichar) (-1)) {\n\t\t\t\t\t\t\tcurrent += u.to_utf8 (null);\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid UTF-8 character\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (current >= end || current[0] == '\\n') {\n\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"syntax error, expected \\\"\");\n\t\t\t\t\tstate_stack.length--;\n\t\t\t\t\treturn read_token (out token_begin, out token_end);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (token_length_in_chars < 0) {\n\t\t\tcolumn += (int) (current - begin);\n\t\t} else {\n\t\t\tcolumn += token_length_in_chars;\n\t\t}\n\n\t\ttoken_end = SourceLocation (current, line, column - 1);\n\n\t\treturn type;\n\t}\n\n\tpublic static TokenType get_identifier_or_keyword (char* begin, int len) {\n\t\tswitch (len) {\n\t\tcase 2:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'a':\n\t\t\t\tif (matches (begin, \"as\")) return TokenType.AS;\n\t\t\t\tbreak;\n\t\t\tcase 'd':\n\t\t\t\tif (matches (begin, \"do\")) return TokenType.DO;\n\t\t\t\tbreak;\n\t\t\tcase 'i':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'f':\n\t\t\t\t\treturn TokenType.IF;\n\t\t\t\tcase 'n':\n\t\t\t\t\treturn TokenType.IN;\n\t\t\t\tcase 's':\n\t\t\t\t\treturn TokenType.IS;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'f':\n\t\t\t\tif (matches (begin, \"for\")) return TokenType.FOR;\n\t\t\t\tbreak;\n\t\t\tcase 'g':\n\t\t\t\tif (matches (begin, \"get\")) return TokenType.GET;\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\tif (matches (begin, \"new\")) return TokenType.NEW;\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\tif (matches (begin, \"out\")) return TokenType.OUT;\n\t\t\t\tbreak;\n\t\t\tcase 'r':\n\t\t\t\tif (matches (begin, \"ref\")) return TokenType.REF;\n\t\t\t\tbreak;\n\t\t\tcase 's':\n\t\t\t\tif (matches (begin, \"set\")) return TokenType.SET;\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\tif (matches (begin, \"try\")) return TokenType.TRY;\n\t\t\t\tbreak;\n\t\t\tcase 'v':\n\t\t\t\tif (matches (begin, \"var\")) return TokenType.VAR;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'b':\n\t\t\t\tif (matches (begin, \"base\")) return TokenType.BASE;\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tif (matches (begin, \"case\")) return TokenType.CASE;\n\t\t\t\tbreak;\n\t\t\tcase 'e':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'l':\n\t\t\t\t\tif (matches (begin, \"else\")) return TokenType.ELSE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'n':\n\t\t\t\t\tif (matches (begin, \"enum\")) return TokenType.ENUM;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'l':\n\t\t\t\tif (matches (begin, \"lock\")) return TokenType.LOCK;\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\tif (matches (begin, \"null\")) return TokenType.NULL;\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'h':\n\t\t\t\t\tif (matches (begin, \"this\")) return TokenType.THIS;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'r':\n\t\t\t\t\tif (matches (begin, \"true\")) return TokenType.TRUE;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'v':\n\t\t\t\tif (matches (begin, \"void\")) return TokenType.VOID;\n\t\t\t\tbreak;\n\t\t\tcase 'w':\n\t\t\t\tif (matches (begin, \"weak\")) return TokenType.WEAK;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'a':\n\t\t\t\tif (matches (begin, \"async\")) return TokenType.ASYNC;\n\t\t\t\tbreak;\n\t\t\tcase 'b':\n\t\t\t\tif (matches (begin, \"break\")) return TokenType.BREAK;\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'a':\n\t\t\t\t\tif (matches (begin, \"catch\")) return TokenType.CATCH;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'l':\n\t\t\t\t\tif (matches (begin, \"class\")) return TokenType.CLASS;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'o':\n\t\t\t\t\tif (matches (begin, \"const\")) return TokenType.CONST;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'f':\n\t\t\t\tif (matches (begin, \"false\")) return TokenType.FALSE;\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\tif (matches (begin, \"owned\")) return TokenType.OWNED;\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\tif (matches (begin, \"throw\")) return TokenType.THROW;\n\t\t\t\tbreak;\n\t\t\tcase 'u':\n\t\t\t\tif (matches (begin, \"using\")) return TokenType.USING;\n\t\t\t\tbreak;\n\t\t\tcase 'w':\n\t\t\t\tif (matches (begin, \"while\")) return TokenType.WHILE;\n\t\t\t\tbreak;\n\t\t\tcase 'y':\n\t\t\t\tif (matches (begin, \"yield\")) return TokenType.YIELD;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'd':\n\t\t\t\tif (matches (begin, \"delete\")) return TokenType.DELETE;\n\t\t\t\tbreak;\n\t\t\tcase 'e':\n\t\t\t\tif (matches (begin, \"extern\")) return TokenType.EXTERN;\n\t\t\t\tbreak;\n\t\t\tcase 'i':\n\t\t\t\tif (matches (begin, \"inline\")) return TokenType.INLINE;\n\t\t\t\tbreak;\n\t\t\tcase 'p':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'a':\n\t\t\t\t\tif (matches (begin, \"params\")) return TokenType.PARAMS;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'u':\n\t\t\t\t\tif (matches (begin, \"public\")) return TokenType.PUBLIC;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'r':\n\t\t\t\tif (matches (begin, \"return\")) return TokenType.RETURN;\n\t\t\t\tbreak;\n\t\t\tcase 's':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'e':\n\t\t\t\t\tif (matches (begin, \"sealed\")) return TokenType.SEALED;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'i':\n\t\t\t\t\tswitch (begin[2]) {\n\t\t\t\t\tcase 'g':\n\t\t\t\t\t\tif (matches (begin, \"signal\")) return TokenType.SIGNAL;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tif (matches (begin, \"sizeof\")) return TokenType.SIZEOF;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 't':\n\t\t\t\t\tswitch (begin[2]) {\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tif (matches (begin, \"static\")) return TokenType.STATIC;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'r':\n\t\t\t\t\t\tif (matches (begin, \"struct\")) return TokenType.STRUCT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'w':\n\t\t\t\t\tif (matches (begin, \"switch\")) return TokenType.SWITCH;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'h':\n\t\t\t\t\tif (matches (begin, \"throws\")) return TokenType.THROWS;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'y':\n\t\t\t\t\tif (matches (begin, \"typeof\")) return TokenType.TYPEOF;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'd':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'e':\n\t\t\t\t\tif (matches (begin, \"default\")) return TokenType.DEFAULT;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'y':\n\t\t\t\t\tif (matches (begin, \"dynamic\")) return TokenType.DYNAMIC;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'e':\n\t\t\t\tif (matches (begin, \"ensures\")) return TokenType.ENSURES;\n\t\t\t\tbreak;\n\t\t\tcase 'f':\n\t\t\t\tswitch (begin[1]) {\n\t\t\t\tcase 'i':\n\t\t\t\t\tif (matches (begin, \"finally\")) return TokenType.FINALLY;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'o':\n\t\t\t\t\tif (matches (begin, \"foreach\")) return TokenType.FOREACH;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'p':\n\t\t\t\tif (matches (begin, \"private\")) return TokenType.PRIVATE;\n\t\t\t\tbreak;\n\t\t\tcase 'u':\n\t\t\t\tif (matches (begin, \"unowned\")) return TokenType.UNOWNED;\n\t\t\t\tbreak;\n\t\t\tcase 'v':\n\t\t\t\tif (matches (begin, \"virtual\")) return TokenType.VIRTUAL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'a':\n\t\t\t\tif (matches (begin, \"abstract\")) return TokenType.ABSTRACT;\n\t\t\t\tbreak;\n\t\t\tcase 'c':\n\t\t\t\tif (matches (begin, \"continue\")) return TokenType.CONTINUE;\n\t\t\t\tbreak;\n\t\t\tcase 'd':\n\t\t\t\tif (matches (begin, \"delegate\")) return TokenType.DELEGATE;\n\t\t\t\tbreak;\n\t\t\tcase 'i':\n\t\t\t\tif (matches (begin, \"internal\")) return TokenType.INTERNAL;\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\tif (matches (begin, \"override\")) return TokenType.OVERRIDE;\n\t\t\t\tbreak;\n\t\t\tcase 'r':\n\t\t\t\tif (matches (begin, \"requires\")) return TokenType.REQUIRES;\n\t\t\t\tbreak;\n\t\t\tcase 'v':\n\t\t\t\tif (matches (begin, \"volatile\")) return TokenType.VOLATILE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\tswitch (begin[0]) {\n\t\t\tcase 'c':\n\t\t\t\tif (matches (begin, \"construct\")) return TokenType.CONSTRUCT;\n\t\t\t\tbreak;\n\t\t\tcase 'i':\n\t\t\t\tif (matches (begin, \"interface\")) return TokenType.INTERFACE;\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\tif (matches (begin, \"namespace\")) return TokenType.NAMESPACE;\n\t\t\t\tbreak;\n\t\t\tcase 'p':\n\t\t\t\tif (matches (begin, \"protected\")) return TokenType.PROTECTED;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 11:\n\t\t\tif (matches (begin, \"errordomain\")) return TokenType.ERRORDOMAIN;\n\t\t\tbreak;\n\t\t}\n\t\treturn TokenType.IDENTIFIER;\n\t}\n\n\tTokenType read_number () {\n\t\tvar type = TokenType.INTEGER_LITERAL;\n\n\t\t// integer part\n\t\tif (current < end - 2 && current[0] == '0'\n\t\t    && current[1] == 'x' && current[2].isxdigit ()) {\n\t\t\t// hexadecimal integer literal\n\t\t\tcurrent += 2;\n\t\t\twhile (current < end && current[0].isxdigit ()) {\n\t\t\t\tcurrent++;\n\t\t\t}\n\t\t} else {\n\t\t\t// decimal number\n\t\t\twhile (current < end && current[0].isdigit ()) {\n\t\t\t\tcurrent++;\n\t\t\t}\n\t\t}\n\n\t\t// fractional part\n\t\tif (current < end - 1 && current[0] == '.' && current[1].isdigit ()) {\n\t\t\ttype = TokenType.REAL_LITERAL;\n\t\t\tcurrent++;\n\t\t\twhile (current < end && current[0].isdigit ()) {\n\t\t\t\tcurrent++;\n\t\t\t}\n\t\t}\n\n\t\t// exponent part\n\t\tif (current < end && current[0].tolower () == 'e') {\n\t\t\ttype = TokenType.REAL_LITERAL;\n\t\t\tcurrent++;\n\t\t\tif (current < end && (current[0] == '+' || current[0] == '-')) {\n\t\t\t\tcurrent++;\n\t\t\t}\n\t\t\twhile (current < end && current[0].isdigit ()) {\n\t\t\t\tcurrent++;\n\t\t\t}\n\t\t}\n\n\t\t// type suffix\n\t\tif (current < end) {\n\t\t\tbool real_literal = (type == TokenType.REAL_LITERAL);\n\n\t\t\tswitch (current[0]) {\n\t\t\tcase 'l':\n\t\t\tcase 'L':\n\t\t\t\tif (type == TokenType.INTEGER_LITERAL) {\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tif (current < end && current[0].tolower () == 'l') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'u':\n\t\t\tcase 'U':\n\t\t\t\tif (type == TokenType.INTEGER_LITERAL) {\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tif (current < end && current[0].tolower () == 'l') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tif (current < end && current[0].tolower () == 'l') {\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'f':\n\t\t\tcase 'F':\n\t\t\tcase 'd':\n\t\t\tcase 'D':\n\t\t\t\ttype = TokenType.REAL_LITERAL;\n\t\t\t\tcurrent++;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (!real_literal && is_ident_char (current[0])) {\n\t\t\t\t// allow identifiers to start with a digit\n\t\t\t\t// as long as they contain at least one char\n\t\t\t\twhile (current < end && is_ident_char (current[0])) {\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\ttype = TokenType.IDENTIFIER;\n\t\t\t}\n\t\t}\n\n\t\treturn type;\n\t}\n\n\tpublic TokenType read_template_token (out SourceLocation token_begin, out SourceLocation token_end) {\n\t\tTokenType type;\n\t\tchar* begin = current;\n\t\ttoken_begin = SourceLocation (begin, line, column);\n\n\t\tint token_length_in_chars = -1;\n\n\t\tif (current >= end) {\n\t\t\ttype = TokenType.EOF;\n\t\t} else {\n\t\t\tswitch (current[0]) {\n\t\t\tcase '\"':\n\t\t\t\ttype = TokenType.CLOSE_TEMPLATE;\n\t\t\t\tcurrent++;\n\t\t\t\tstate_stack.length--;\n\t\t\t\tbreak;\n\t\t\tcase '$':\n\t\t\t\ttoken_begin.pos++; // $ is not part of following token\n\t\t\t\tcurrent++;\n\t\t\t\tif (current[0].isalpha () || current[0] == '_') {\n\t\t\t\t\tint len = 0;\n\t\t\t\t\twhile (current < end && is_ident_char (current[0])) {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tlen++;\n\t\t\t\t\t}\n\t\t\t\t\ttype = TokenType.IDENTIFIER;\n\t\t\t\t\tstate_stack += State.TEMPLATE_PART;\n\t\t\t\t} else if (current[0] == '(') {\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tcolumn += 2;\n\t\t\t\t\tstate_stack += State.PARENS;\n\t\t\t\t\treturn read_token (out token_begin, out token_end);\n\t\t\t\t} else if (current[0] == '$') {\n\t\t\t\t\ttype = TokenType.TEMPLATE_STRING_LITERAL;\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tstate_stack += State.TEMPLATE_PART;\n\t\t\t\t} else {\n\t\t\t\t\tReport.error (get_source_reference (1), \"unexpected character\");\n\t\t\t\t\treturn read_template_token (out token_begin, out token_end);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttype = TokenType.TEMPLATE_STRING_LITERAL;\n\t\t\t\ttoken_length_in_chars = 0;\n\t\t\t\twhile (current < end && current[0] != '\"' && current[0] != '$') {\n\t\t\t\t\tif (current[0] == '\\\\') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\tif (current >= end) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\t\tcase '\\'':\n\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\tcase '\\\\':\n\t\t\t\t\t\tcase '0':\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\tcase 'r':\n\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'u':\n\t\t\t\t\t\t\t// u escape character has four hex digits\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tint digit_length;\n\t\t\t\t\t\t\tfor (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) {\n\t\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (digit_length != 4) {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"\\\\u requires four hex digits\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'x':\n\t\t\t\t\t\t\t// hexadecimal escape character requires two hex digits\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tint digit_length;\n\t\t\t\t\t\t\tfor (digit_length = 0; current < end && current[0].isxdigit (); digit_length++) {\n\t\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (digit_length < 1) {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"\\\\x requires at least one hex digit\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid escape sequence\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (current[0] == '\\n') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tline++;\n\t\t\t\t\t\tcolumn = 1;\n\t\t\t\t\t\ttoken_length_in_chars = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tunichar u = ((string) current).get_char_validated ((long) (end - current));\n\t\t\t\t\t\tif (u != (unichar) (-1)) {\n\t\t\t\t\t\t\tcurrent += u.to_utf8 (null);\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid UTF-8 character\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (current >= end) {\n\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"syntax error, expected \\\"\");\n\t\t\t\t\tstate_stack.length--;\n\t\t\t\t\treturn read_token (out token_begin, out token_end);\n\t\t\t\t}\n\t\t\t\tstate_stack += State.TEMPLATE_PART;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (token_length_in_chars < 0) {\n\t\t\tcolumn += (int) (current - begin);\n\t\t} else {\n\t\t\tcolumn += token_length_in_chars;\n\t\t}\n\n\t\ttoken_end = SourceLocation (current, line, column - 1);\n\n\t\treturn type;\n\t}\n\n\tpublic TokenType read_token (out SourceLocation token_begin, out SourceLocation token_end) {\n\t\tif (in_template ()) {\n\t\t\treturn read_template_token (out token_begin, out token_end);\n\t\t} else if (in_template_part ()) {\n\t\t\tstate_stack.length--;\n\n\t\t\ttoken_begin = SourceLocation (current, line, column);\n\t\t\ttoken_end = SourceLocation (current, line, column - 1);\n\n\t\t\treturn TokenType.COMMA;\n\t\t} else if (in_regex_literal ()) {\n\t\t\treturn read_regex_token (out token_begin, out token_end);\n\t\t}\n\n\t\tspace ();\n\n\t\tTokenType type;\n\t\tchar* begin = current;\n\t\ttoken_begin = SourceLocation (begin, line, column);\n\n\t\tint token_length_in_chars = -1;\n\n\t\tif (current >= end) {\n\t\t\ttype = TokenType.EOF;\n\t\t} else if (current[0].isalpha () || current[0] == '_') {\n\t\t\tint len = 0;\n\t\t\twhile (current < end && is_ident_char (current[0])) {\n\t\t\t\tcurrent++;\n\t\t\t\tlen++;\n\t\t\t}\n\t\t\ttype = get_identifier_or_keyword (begin, len);\n\t\t} else if (current[0] == '@') {\n\t\t\tif (current < end - 1 && current[1] == '\"') {\n\t\t\t\ttype = TokenType.OPEN_TEMPLATE;\n\t\t\t\tcurrent += 2;\n\t\t\t\tstate_stack += State.TEMPLATE;\n\t\t\t} else {\n\t\t\t\ttoken_begin.pos++; // @ is not part of the identifier\n\t\t\t\tcurrent++;\n\t\t\t\tint len = 0;\n\t\t\t\twhile (current < end && is_ident_char (current[0])) {\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tlen++;\n\t\t\t\t}\n\t\t\t\ttype = TokenType.IDENTIFIER;\n\t\t\t}\n\t\t} else if (current[0].isdigit ()) {\n\t\t\ttype = read_number ();\n\t\t} else {\n\t\t\tswitch (current[0]) {\n\t\t\tcase '{':\n\t\t\t\ttype = TokenType.OPEN_BRACE;\n\t\t\t\tcurrent++;\n\t\t\t\tstate_stack += State.BRACE;\n\t\t\t\tbreak;\n\t\t\tcase '}':\n\t\t\t\ttype = TokenType.CLOSE_BRACE;\n\t\t\t\tcurrent++;\n\t\t\t\tif (state_stack.length > 0) {\n\t\t\t\t\tstate_stack.length--;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '(':\n\t\t\t\ttype = TokenType.OPEN_PARENS;\n\t\t\t\tcurrent++;\n\t\t\t\tstate_stack += State.PARENS;\n\t\t\t\tbreak;\n\t\t\tcase ')':\n\t\t\t\ttype = TokenType.CLOSE_PARENS;\n\t\t\t\tcurrent++;\n\t\t\t\tif (state_stack.length > 0) {\n\t\t\t\t\tstate_stack.length--;\n\t\t\t\t}\n\t\t\t\tif (in_template ()) {\n\t\t\t\t\ttype = TokenType.COMMA;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\ttype = TokenType.OPEN_BRACKET;\n\t\t\t\tcurrent++;\n\t\t\t\tstate_stack += State.BRACKET;\n\t\t\t\tbreak;\n\t\t\tcase ']':\n\t\t\t\ttype = TokenType.CLOSE_BRACKET;\n\t\t\t\tcurrent++;\n\t\t\t\tif (state_stack.length > 0) {\n\t\t\t\t\tstate_stack.length--;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '.':\n\t\t\t\ttype = TokenType.DOT;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end - 1) {\n\t\t\t\t\tif (current[0] == '.' && current[1] == '.') {\n\t\t\t\t\t\ttype = TokenType.ELLIPSIS;\n\t\t\t\t\t\tcurrent += 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ':':\n\t\t\t\ttype = TokenType.COLON;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == ':') {\n\t\t\t\t\ttype = TokenType.DOUBLE_COLON;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ',':\n\t\t\t\ttype = TokenType.COMMA;\n\t\t\t\tcurrent++;\n\t\t\t\tbreak;\n\t\t\tcase ';':\n\t\t\t\ttype = TokenType.SEMICOLON;\n\t\t\t\tcurrent++;\n\t\t\t\tbreak;\n\t\t\tcase '#':\n\t\t\t\ttype = TokenType.HASH;\n\t\t\t\tcurrent++;\n\t\t\t\tbreak;\n\t\t\tcase '?':\n\t\t\t\ttype = TokenType.INTERR;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == '?') {\n\t\t\t\t\ttype = TokenType.OP_COALESCING;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '|':\n\t\t\t\ttype = TokenType.BITWISE_OR;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end) {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\ttype = TokenType.ASSIGN_BITWISE_OR;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '|':\n\t\t\t\t\t\ttype = TokenType.OP_OR;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '&':\n\t\t\t\ttype = TokenType.BITWISE_AND;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end) {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\ttype = TokenType.ASSIGN_BITWISE_AND;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '&':\n\t\t\t\t\t\ttype = TokenType.OP_AND;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '^':\n\t\t\t\ttype = TokenType.CARRET;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\ttype = TokenType.ASSIGN_BITWISE_XOR;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '~':\n\t\t\t\ttype = TokenType.TILDE;\n\t\t\t\tcurrent++;\n\t\t\t\tbreak;\n\t\t\tcase '=':\n\t\t\t\ttype = TokenType.ASSIGN;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end) {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\ttype = TokenType.OP_EQ;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '>':\n\t\t\t\t\t\ttype = TokenType.LAMBDA;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '<':\n\t\t\t\ttype = TokenType.OP_LT;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end) {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\ttype = TokenType.OP_LE;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '<':\n\t\t\t\t\t\ttype = TokenType.OP_SHIFT_LEFT;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\t\t\ttype = TokenType.ASSIGN_SHIFT_LEFT;\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '>':\n\t\t\t\ttype = TokenType.OP_GT;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\ttype = TokenType.OP_GE;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '!':\n\t\t\t\ttype = TokenType.OP_NEG;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\ttype = TokenType.OP_NE;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '+':\n\t\t\t\ttype = TokenType.PLUS;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end) {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\ttype = TokenType.ASSIGN_ADD;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '+':\n\t\t\t\t\t\ttype = TokenType.OP_INC;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '-':\n\t\t\t\ttype = TokenType.MINUS;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end) {\n\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\ttype = TokenType.ASSIGN_SUB;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '-':\n\t\t\t\t\t\ttype = TokenType.OP_DEC;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '>':\n\t\t\t\t\t\ttype = TokenType.OP_PTR;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '*':\n\t\t\t\ttype = TokenType.STAR;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\ttype = TokenType.ASSIGN_MUL;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '/':\n\t\t\t\tswitch (previous) {\n\t\t\t\tcase TokenType.ASSIGN:\n\t\t\t\tcase TokenType.COMMA:\n\t\t\t\tcase TokenType.MINUS:\n\t\t\t\tcase TokenType.OP_AND:\n\t\t\t\tcase TokenType.OP_COALESCING:\n\t\t\t\tcase TokenType.OP_EQ:\n\t\t\t\tcase TokenType.OP_GE:\n\t\t\t\tcase TokenType.OP_GT:\n\t\t\t\tcase TokenType.OP_LE:\n\t\t\t\tcase TokenType.OP_LT:\n\t\t\t\tcase TokenType.OP_NE:\n\t\t\t\tcase TokenType.OP_NEG:\n\t\t\t\tcase TokenType.OP_OR:\n\t\t\t\tcase TokenType.OPEN_BRACE:\n\t\t\t\tcase TokenType.OPEN_PARENS:\n\t\t\t\tcase TokenType.PLUS:\n\t\t\t\tcase TokenType.RETURN:\n\t\t\t\t\ttype = TokenType.OPEN_REGEX_LITERAL;\n\t\t\t\t\tstate_stack += State.REGEX_LITERAL;\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\ttype = TokenType.DIV;\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\t\ttype = TokenType.ASSIGN_DIV;\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '%':\n\t\t\t\ttype = TokenType.PERCENT;\n\t\t\t\tcurrent++;\n\t\t\t\tif (current < end && current[0] == '=') {\n\t\t\t\t\ttype = TokenType.ASSIGN_PERCENT;\n\t\t\t\t\tcurrent++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '\\'':\n\t\t\tcase '\"':\n\t\t\t\tif (begin[0] == '\\'') {\n\t\t\t\t\ttype = TokenType.CHARACTER_LITERAL;\n\t\t\t\t} else if (current < end - 6 && begin[1] == '\"' && begin[2] == '\"') {\n\t\t\t\t\ttype = TokenType.VERBATIM_STRING_LITERAL;\n\t\t\t\t\ttoken_length_in_chars = 6;\n\t\t\t\t\tcurrent += 3;\n\t\t\t\t\twhile (current < end - 4) {\n\t\t\t\t\t\tif (current[0] == '\"' && current[1] == '\"' && current[2] == '\"' && current[3] != '\"') {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (current[0] == '\\n') {\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\tline++;\n\t\t\t\t\t\t\tcolumn = 1;\n\t\t\t\t\t\t\ttoken_length_in_chars = 3;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunichar u = ((string) current).get_char_validated ((long) (end - current));\n\t\t\t\t\t\t\tif (u != (unichar) (-1)) {\n\t\t\t\t\t\t\t\tcurrent += u.to_utf8 (null);\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid UTF-8 character\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (current[0] == '\"' && current[1] == '\"' && current[2] == '\"') {\n\t\t\t\t\t\tcurrent += 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"syntax error, expected \\\"\\\"\\\"\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\ttype = TokenType.STRING_LITERAL;\n\t\t\t\t}\n\t\t\t\ttoken_length_in_chars = 2;\n\t\t\t\tcurrent++;\n\t\t\t\twhile (current < end && current[0] != begin[0]) {\n\t\t\t\t\tif (current[0] == '\\\\') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\tif (current >= end) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch (current[0]) {\n\t\t\t\t\t\tcase '\\'':\n\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\tcase '\\\\':\n\t\t\t\t\t\tcase '0':\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\tcase 'r':\n\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\tcase '$':\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'u':\n\t\t\t\t\t\t\t// u escape character has four hex digits\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tint digit_length;\n\t\t\t\t\t\t\tfor (digit_length = 0; digit_length < 4 && current < end && current[0].isxdigit (); digit_length++) {\n\t\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (digit_length != 4) {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"\\\\u requires four hex digits\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'x':\n\t\t\t\t\t\t\t// hexadecimal escape character requires two hex digits\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\tint digit_length;\n\t\t\t\t\t\t\tfor (digit_length = 0; current < end && current[0].isxdigit (); digit_length++) {\n\t\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (digit_length < 1) {\n\t\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"\\\\x requires at least one hex digit\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid escape sequence\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (current[0] == '\\n') {\n\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\tline++;\n\t\t\t\t\t\tcolumn = 1;\n\t\t\t\t\t\ttoken_length_in_chars = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tunichar u = ((string) current).get_char_validated ((long) (end - current));\n\t\t\t\t\t\tif (u != (unichar) (-1)) {\n\t\t\t\t\t\t\tcurrent += u.to_utf8 (null);\n\t\t\t\t\t\t\ttoken_length_in_chars++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrent++;\n\t\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid UTF-8 character\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (current < end && begin[0] == '\\'' && current[0] != '\\'') {\n\t\t\t\t\t\t// multiple characters in single character literal\n\t\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"invalid character literal\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (current < end) {\n\t\t\t\t\tcurrent++;\n\t\t\t\t} else {\n\t\t\t\t\tReport.error (get_source_reference (token_length_in_chars), \"syntax error, expected %c\".printf (begin[0]));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tunichar u = ((string) current).get_char_validated ((long) (end - current));\n\t\t\t\tif (u != (unichar) (-1)) {\n\t\t\t\t\tcurrent += u.to_utf8 (null);\n\t\t\t\t\tReport.error (get_source_reference (0), \"syntax error, unexpected character\");\n\t\t\t\t} else {\n\t\t\t\t\tcurrent++;\n\t\t\t\t\tReport.error (get_source_reference (0), \"invalid UTF-8 character\");\n\t\t\t\t}\n\t\t\t\tcolumn++;\n\t\t\t\treturn read_token (out token_begin, out token_end);\n\t\t\t}\n\t\t}\n\n\t\tif (token_length_in_chars < 0) {\n\t\t\tcolumn += (int) (current - begin);\n\t\t} else {\n\t\t\tcolumn += token_length_in_chars;\n\t\t}\n\n\t\ttoken_end = SourceLocation (current, line, column - 1);\n\t\tprevious = type;\n\n\t\treturn type;\n\t}\n\n\tstatic bool matches (char* begin, string keyword) {\n\t\tchar* keyword_array = (char*) keyword;\n\t\tlong len = keyword.length;\n\t\tfor (int i = 0; i < len; i++) {\n\t\t\tif (begin[i] != keyword_array[i]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tbool pp_whitespace () {\n\t\tbool found = false;\n\t\twhile (current < end && current[0].isspace () && current[0] != '\\n') {\n\t\t\tfound = true;\n\t\t\tcurrent++;\n\t\t\tcolumn++;\n\t\t}\n\t\treturn found;\n\t}\n\n\tvoid pp_space () {\n\t\twhile (pp_whitespace () || comment ()) {\n\t\t}\n\t}\n\n\tvoid pp_directive () {\n\t\t// hash sign\n\t\tcurrent++;\n\t\tcolumn++;\n\n\t\tif (line == 1 && column == 2 && current < end && current[0] == '!') {\n\t\t\t// hash bang: #!\n\t\t\t// skip until end of line or end of file\n\t\t\twhile (current < end && current[0] != '\\n') {\n\t\t\t\tcurrent++;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tpp_space ();\n\n\t\tchar* begin = current;\n\t\tint len = 0;\n\t\twhile (current < end && current[0].isalnum ()) {\n\t\t\tcurrent++;\n\t\t\tcolumn++;\n\t\t\tlen++;\n\t\t}\n\n\t\tif (len == 2 && matches (begin, \"if\")) {\n\t\t\tparse_pp_if ();\n\t\t} else if (len == 4 && matches (begin, \"elif\")) {\n\t\t\tparse_pp_elif ();\n\t\t} else if (len == 4 && matches (begin, \"else\")) {\n\t\t\tparse_pp_else ();\n\t\t} else if (len == 5 && matches (begin, \"endif\")) {\n\t\t\tparse_pp_endif ();\n\t\t} else {\n\t\t\tReport.error (get_source_reference (-len, len), \"syntax error, invalid preprocessing directive\");\n\t\t}\n\n\t\tif (conditional_stack.length > 0\n\t\t    && conditional_stack[conditional_stack.length - 1].skip_section) {\n\t\t\t// skip lines until next preprocessing directive\n\t\t\tbool bol = false;\n\t\t\twhile (current < end) {\n\t\t\t\tif (bol && current[0] == '#') {\n\t\t\t\t\t// go back to begin of line\n\t\t\t\t\tcurrent -= (column - 1);\n\t\t\t\t\tcolumn = 1;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (current[0] == '\\n') {\n\t\t\t\t\tline++;\n\t\t\t\t\tcolumn = 0;\n\t\t\t\t\tbol = true;\n\t\t\t\t} else if (!current[0].isspace ()) {\n\t\t\t\t\tbol = false;\n\t\t\t\t}\n\t\t\t\tcurrent++;\n\t\t\t\tcolumn++;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid pp_eol () {\n\t\tpp_space ();\n\t\tif (current >= end || current[0] != '\\n') {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, expected newline\");\n\t\t}\n\t}\n\n\tvoid parse_pp_if () {\n\t\tpp_space ();\n\n\t\tbool condition = parse_pp_expression ();\n\n\t\tpp_eol ();\n\n\t\tconditional_stack += Conditional ();\n\n\t\tif (condition && (conditional_stack.length == 1 || !conditional_stack[conditional_stack.length - 2].skip_section)) {\n\t\t\t// condition true => process code within if\n\t\t\tconditional_stack[conditional_stack.length - 1].matched = true;\n\t\t} else {\n\t\t\t// skip lines until next preprocessing directive\n\t\t\tconditional_stack[conditional_stack.length - 1].skip_section = true;\n\t\t}\n\t}\n\n\tvoid parse_pp_elif () {\n\t\tpp_space ();\n\n\t\tbool condition = parse_pp_expression ();\n\n\t\tpp_eol ();\n\n\t\tif (conditional_stack.length == 0 || conditional_stack[conditional_stack.length - 1].else_found) {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, unexpected #elif\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (condition && !conditional_stack[conditional_stack.length - 1].matched\n\t\t    && (conditional_stack.length == 1 || !conditional_stack[conditional_stack.length - 2].skip_section)) {\n\t\t\t// condition true => process code within if\n\t\t\tconditional_stack[conditional_stack.length - 1].matched = true;\n\t\t\tconditional_stack[conditional_stack.length - 1].skip_section = false;\n\t\t} else {\n\t\t\t// skip lines until next preprocessing directive\n\t\t\tconditional_stack[conditional_stack.length - 1].skip_section = true;\n\t\t}\n\t}\n\n\tvoid parse_pp_else () {\n\t\tpp_eol ();\n\n\t\tif (conditional_stack.length == 0 || conditional_stack[conditional_stack.length - 1].else_found) {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, unexpected #else\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!conditional_stack[conditional_stack.length - 1].matched\n\t\t    && (conditional_stack.length == 1 || !conditional_stack[conditional_stack.length - 2].skip_section)) {\n\t\t\t// condition true => process code within if\n\t\t\tconditional_stack[conditional_stack.length - 1].matched = true;\n\t\t\tconditional_stack[conditional_stack.length - 1].skip_section = false;\n\t\t} else {\n\t\t\t// skip lines until next preprocessing directive\n\t\t\tconditional_stack[conditional_stack.length - 1].skip_section = true;\n\t\t}\n\t}\n\n\tvoid parse_pp_endif () {\n\t\tpp_eol ();\n\n\t\tif (conditional_stack.length == 0) {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, unexpected #endif\");\n\t\t\treturn;\n\t\t}\n\n\t\tconditional_stack.length--;\n\t}\n\n\tbool parse_pp_symbol () {\n\t\tint len = 0;\n\t\twhile (current < end && is_ident_char (current[0])) {\n\t\t\tcurrent++;\n\t\t\tcolumn++;\n\t\t\tlen++;\n\t\t}\n\n\t\tif (len == 0) {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, expected identifier\");\n\t\t\treturn false;\n\t\t}\n\n\t\tstring identifier = ((string) (current - len)).substring (0, len);\n\t\tbool defined;\n\t\tif (identifier == \"true\") {\n\t\t\tdefined = true;\n\t\t} else if (identifier == \"false\") {\n\t\t\tdefined = false;\n\t\t} else {\n\t\t\t/*GUANAKO_EXT_START*/\n            used_defines.add (identifier);\n\t\t\t/*GUANAKO_EXT_END*/\n\t\t\tdefined = source_file.context.is_defined (identifier);\n\t\t}\n\n\t\treturn defined;\n\t}\n\n\tbool parse_pp_primary_expression () {\n\t\tif (current >= end) {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, expected identifier\");\n\t\t} else if (is_ident_char (current[0])) {\n\t\t\treturn parse_pp_symbol ();\n\t\t} else if (current[0] == '(') {\n\t\t\tcurrent++;\n\t\t\tcolumn++;\n\t\t\tpp_space ();\n\t\t\tbool result = parse_pp_expression ();\n\t\t\tpp_space ();\n\t\t\tif (current < end && current[0] ==  ')') {\n\t\t\t\tcurrent++;\n\t\t\t\tcolumn++;\n\t\t\t} else {\n\t\t\t\tReport.error (get_source_reference (0), \"syntax error, expected `)'\");\n\t\t\t}\n\t\t\treturn result;\n\t\t} else {\n\t\t\tReport.error (get_source_reference (0), \"syntax error, expected identifier\");\n\t\t}\n\t\treturn false;\n\t}\n\n\tbool parse_pp_unary_expression () {\n\t\tif (current < end && current[0] == '!') {\n\t\t\tcurrent++;\n\t\t\tcolumn++;\n\t\t\tpp_space ();\n\t\t\treturn !parse_pp_unary_expression ();\n\t\t}\n\n\t\treturn parse_pp_primary_expression ();\n\t}\n\n\tbool parse_pp_equality_expression () {\n\t\tbool left = parse_pp_unary_expression ();\n\t\tpp_space ();\n\t\twhile (true) {\n\t\t\tif (current < end - 1 && current[0] == '=' && current[1] == '=') {\n\t\t\t\tcurrent += 2;\n\t\t\t\tcolumn += 2;\n\t\t\t\tpp_space ();\n\t\t\t\tbool right = parse_pp_unary_expression ();\n\t\t\t\tleft = (left == right);\n\t\t\t} else if (current < end - 1 && current[0] == '!' && current[1] == '=') {\n\t\t\t\tcurrent += 2;\n\t\t\t\tcolumn += 2;\n\t\t\t\tpp_space ();\n\t\t\t\tbool right = parse_pp_unary_expression ();\n\t\t\t\tleft = (left != right);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn left;\n\t}\n\n\tbool parse_pp_and_expression () {\n\t\tbool left = parse_pp_equality_expression ();\n\t\tpp_space ();\n\t\twhile (current < end - 1 && current[0] == '&' && current[1] == '&') {\n\t\t\tcurrent += 2;\n\t\t\tcolumn += 2;\n\t\t\tpp_space ();\n\t\t\tbool right = parse_pp_equality_expression ();\n\t\t\tleft = left && right;\n\t\t}\n\t\treturn left;\n\t}\n\n\tbool parse_pp_or_expression () {\n\t\tbool left = parse_pp_and_expression ();\n\t\tpp_space ();\n\t\twhile (current < end - 1 && current[0] == '|' && current[1] == '|') {\n\t\t\tcurrent += 2;\n\t\t\tcolumn += 2;\n\t\t\tpp_space ();\n\t\t\tbool right = parse_pp_and_expression ();\n\t\t\tleft = left || right;\n\t\t}\n\t\treturn left;\n\t}\n\n\tbool parse_pp_expression () {\n\t\treturn parse_pp_or_expression ();\n\t}\n\n\tbool whitespace () {\n\t\tbool found = false;\n\t\tbool bol = (column == 1);\n\t\twhile (current < end && current[0].isspace ()) {\n\t\t\tif (current[0] == '\\n') {\n\t\t\t\tline++;\n\t\t\t\tcolumn = 0;\n\t\t\t\tbol = true;\n\t\t\t}\n\t\t\tfound = true;\n\t\t\tcurrent++;\n\t\t\tcolumn++;\n\t\t}\n\t\tif (bol && current < end && current[0] == '#') {\n\t\t\tpp_directive ();\n\t\t\treturn true;\n\t\t}\n\t\treturn found;\n\t}\n\n\tbool comment (bool file_comment = false) {\n\t\tif (current == null\n\t\t    || current > end - 2\n\t\t    || current[0] != '/'\n\t\t    || (current[1] != '/' && current[1] != '*')) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (current[1] == '/') {\n\t\t\tSourceReference source_reference = null;\n\t\t\tif (file_comment) {\n\t\t\t\tsource_reference = get_source_reference (0);\n\t\t\t}\n\n\t\t\t// single-line comment\n\t\t\tcurrent += 2;\n\t\t\tchar* begin = current;\n\n\t\t\t// skip until end of line or end of file\n\t\t\twhile (current < end && current[0] != '\\n') {\n\t\t\t\tcurrent++;\n\t\t\t}\n\n\t\t\tif (source_reference != null) {\n\t\t\t\tpush_comment (((string) begin).substring (0, (long) (current - begin)), source_reference, file_comment);\n\t\t\t}\n\t\t} else {\n\t\t\tSourceReference source_reference = null;\n\n\t\t\tif (file_comment && current[2] == '*') {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (current[2] == '*' || file_comment) {\n\t\t\t\tsource_reference = get_source_reference (0);\n\t\t\t}\n\n\t\t\tcurrent += 2;\n\n\t\t\tchar* begin = current;\n\t\t\twhile (current < end - 1\n\t\t\t       && (current[0] != '*' || current[1] != '/')) {\n\t\t\t\tif (current[0] == '\\n') {\n\t\t\t\t\tline++;\n\t\t\t\t\tcolumn = 0;\n\t\t\t\t}\n\t\t\t\tcurrent++;\n\t\t\t\tcolumn++;\n\t\t\t}\n\n\t\t\tif (current == end - 1) {\n\t\t\t\tReport.error (get_source_reference (0), \"syntax error, expected */\");\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (source_reference != null) {\n\t\t\t\tpush_comment (((string) begin).substring (0, (long) (current - begin)), source_reference, file_comment);\n\t\t\t}\n\n\t\t\tcurrent += 2;\n\t\t\tcolumn += 2;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tvoid space () {\n\t\twhile (whitespace () || comment ()) {\n\t\t}\n\t}\n\n\tpublic void parse_file_comments () {\n\t\twhile (whitespace () || comment (true)) {\n\t\t}\n\t}\n\n\tvoid push_comment (string comment_item, SourceReference source_reference, bool file_comment) {\n\t\tif (comment_item[0] == '*') {\n\t\t\tif (_comment != null) {\n\t\t\t\t// extra doc comment, add it to source file comments\n\t\t\t\tsource_file.add_comment (_comment);\n\t\t\t}\n\t\t\t_comment = new Comment (comment_item, source_reference);\n\t\t}\n\n\t\tif (file_comment) {\n\t\t\tsource_file.add_comment (new Comment (comment_item, source_reference));\n\t\t\t_comment = null;\n\t\t}\n\t}\n\n\t/**\n\t * Clears and returns the content of the comment stack.\n\t *\n\t * @return saved comment\n\t */\n\tpublic Comment? pop_comment () {\n\t\tif (_comment == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar comment = _comment;\n\t\t_comment = null;\n\t\treturn comment;\n\t}\n}\n\n"
  },
  {
    "path": "guanako/stylecheck.vala",
    "content": "/*\n * guanako/stylecheck.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Vala;\n\nnamespace Guanako {\n    /**\n     * Do some custom coding style checks like whitespace and bracket style.\n     */\n    public class StyleChecker {\n        /**\n         * Compatible version number of configuration file.\n         */\n        const string STYLE_VERSION_MIN = \"0.1\";\n\n        /**\n         * Associated {@link Guanako.Project}.\n         */\n        Guanako.Project? project = null;\n        /**\n         * List of checks.\n         */\n        public Gee.ArrayList<CheckMap?> checkmaps { get; private set; }\n        /**\n         * List of checks ordered by type of check.\n         */\n        public Gee.HashMap<CheckType, Gee.ArrayList<CheckMap?>> checklist { get; private set; }\n\n        /**\n         * List of found errors.\n         */\n        public Gee.ArrayList<StyleError?> errors { get; private set; }\n        /**\n         * Internal list of errors.\n         */\n        private Gee.ArrayList<StyleError?> new_errors;\n\n        /**\n         * Configuration file.\n         */\n        public string? stylefile { get; set; }\n        /**\n         * Version of configuration file.\n         */\n        public string stylefile_version { get; private set; default = \"0\"; }\n\n        /**\n         * Regex check object. Associate regex with capturing group (which is\n         * the style error).\n         */\n        public class RegexCheck {\n            public Regex regex;\n            public int match_num;\n\n            /**\n             * Construct regex check object.\n             *\n             * @param regex {@link Regex} to check.\n             * @param match_num Number of capturing group.\n             */\n            public RegexCheck (Regex regex, int match_num = 0) {\n                this.regex = regex;\n                this.match_num = match_num;\n            }\n\n            /**\n             * Construct regex object from pattern.\n             *\n             * @param pattern Pattern to build regex from.\n             * @param match_num Number of capturing group.\n             */\n            public RegexCheck.str (string pattern, int match_num = 0) throws GLib.RegexError {\n                regex = new Regex (pattern);\n                this.match_num = match_num;\n            }\n        }\n\n        /**\n         * Single style check object.\n         */\n        public struct CheckMap {\n            /**\n             * Ordered list of checks (with regexes).\n             */\n            Gee.ArrayList<RegexCheck?> checks;\n            /**\n             * Type of check.\n             */\n            CheckType type;\n            /**\n             * Description of check.\n             */\n            string description;\n        }\n\n        /**\n         * Single style error object.\n         */\n        public class StyleError {\n            /**\n             * Associated check.\n             */\n            public CheckMap check;\n            /**\n             * Matching regex.\n             */\n            public Regex match_regex;\n            /**\n             * Source file.\n             */\n            public SourceFile file;\n            /**\n             * Start position.\n             */\n            public int start;\n            /**\n             * End position.\n             */\n            public int end;\n\n            /**\n             * Create style error object.\n             *\n             * @param check Check.\n             * @param regex Regex.\n             * @param file Source file.\n             * @param start Start position.\n             * @param end End position.\n             */\n            public StyleError (CheckMap check,\n                               Regex match_regex,\n                               SourceFile file,\n                               int start,\n                               int end) {\n                this.check = check;\n                this.match_regex = match_regex;\n                this.file = file;\n                this.start = start;\n                this.end = end;\n            }\n        }\n\n        /**\n         * Type of checks.\n         */\n        public enum CheckType {\n            /* Hex values would be easier to read but are to big (16^27+). */\n            GLOBAL                  = 0,  // all\n\n            // declaration\n            NAMESPACE_DECLARATION   = 1 << 0,  // namespace\n            // class like\n            CLASS_DECLARACTION      = 1 << 1,  // class\n            INTERFACE_DECLARATION   = 1 << 2,  // interface\n            STRUCT_DECLARACTION     = 1 << 3,  // struct\n            KLASS_DECLARATION       = 1 << 1 | 1 << 2 | 1 << 3,\n            // method like\n            SIGNAL_DECLARATION      = 1 << 4,  // signal\n            DELEGATE_DECLARATION    = 1 << 5,  // delegate\n            LAMBDA_DECLARATION      = 1 << 6,  // lambda method\n            METHOD_DECLARATION      = 1 << 4 | 1 << 5 | 1 << 6,\n            // global declaration\n            DECLARACTION            = 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6,\n\n            // comparison\n            COMPARISON              = 1 << 7,  // ==, !=, <, >, <=, =>\n\n            // operators\n            // assignment\n            ASSIGNMENT_OPERATOR     = 1 << 8,  // =, +=, -=, /=, *=, %=, |=, &=, ^=, <<=, >>=\n            ARITHMETIC_OPERATOR     = 1 << 9,  // ++, --\n            ASSIGNMENT              = 1 << 8 | 1 << 9,\n            // other operators\n            BITWISE_OPERATOR        = 1 << 10,  // &, |, ^, <<, >>\n            UNARY_OPERATOR          = 1 << 11,  // !, ~\n            TERNARY_OPERATOR        = 1 << 12,  // ? :\n            COALESCING_OPERATOR     = 1 << 13,  // ??\n            OPERATOR                = 1 << 10 | 1 << 11 | 1 << 12 | 1 << 13,\n\n            // control structures\n            // loops\n            DO_LOOP                 = 1 << 14,  // do ... while\n            WHILE_LOOP              = 1 << 15,  // while ...\n            FOR_LOOP                = 1 << 16,  // for\n            FOREACH_LOOP            = 1 << 17,  // foreach\n            LOOP                    = 1 << 14 | 1 << 15 | 1 << 16 | 1 << 17,\n            // if\n            IF                      = 1 << 18,  // if\n            ELSE                    = 1 << 19,  // else\n            IF_CONTROL              = 1 << 18 | 1 << 19,\n            // switch\n            SWITCH                  = 1 << 20,  // switch\n            CASE                    = 1 << 21,  // case\n            DEFAULT                 = 1 << 22,  // default\n            SWITCH_CONTROL          = 1 << 20 | 1 << 21 | 1 << 22,\n            // global control structures\n            BREAK                   = 1 << 23,  // break\n            CONTINUE                = 1 << 24,  // continue\n            CONTROL                 = 1 << 23 | 1 << 24,\n\n            // code attributes\n            CCODE                   = 1 << 25,  // [CCode...\n            OTHER_ATTRIBUTE         = 1 << 26,  // [foobar...\n            ATTRIBUTE               = 1 << 25 | 1 << 26,\n\n            // comments\n            BLOCK_COMMENT           = 1 << 27,  // /* */\n            LINE_COMMENT            = 1 << 28,  // //\n            COMMENT                 = 1 << 27 | 1 << 28;\n\n            /**\n             * Convert string to {@link CheckType}.\n             *\n             * @param name CheckType as string.\n             * @param result Resulting {@link CheckType} or\n             *               {@link CheckType.GLOBAL} if no matching type was\n             *               found.\n             * @return Return `true` on success else `false`.\n             */\n            public static bool parse_name (string name, out CheckType result = null) {\n                var ec = (EnumClass) typeof (CheckType).class_ref();\n                var ev = ec.get_value_by_name (\"CHECK_TYPE_\" + name);\n                if (ev == null) {\n                    result = CheckType.GLOBAL;\n                    return false;\n                }\n\n                result = (CheckType) ev.value;\n                return true;\n            }\n        }\n\n        /**\n         * Create {@link StyleChecker} object.\n         *\n         * @param project {@link Guanako.Project} to associate with.\n         * @param filename Name of configuration file or null.\n         */\n        public StyleChecker (Guanako.Project project, string? filename = null) {\n            this.project = project;\n            stylefile = filename;\n            checkmaps = new Gee.ArrayList<CheckMap?>();\n            checklist = new Gee.HashMap<CheckType,Gee.ArrayList<CheckMap?>>();\n            errors = new Gee.ArrayList<StyleError?>();\n        }\n\n        /**\n         * Add a new check.\n         *\n         * @param description Description of check.\n         * @param regex {@link Regex} to check.\n         * @param match_num Number of relevant capturing group.\n         * @param type {@link CheckType} of check.\n         */\n        public void add_check (string description,\n                               Regex regex,\n                               int match_num = 0,\n                               CheckType type = CheckType.GLOBAL) {\n            var regexes = new Gee.ArrayList<RegexCheck?>();\n            regexes.add (new RegexCheck (regex, match_num));\n            CheckMap checkmap = {regexes, type, description};\n            checkmaps.add (checkmap);\n            var list = new Gee.ArrayList<CheckMap?>();\n            list.add (checkmap);\n            checklist.set (type, list);\n        }\n\n        /**\n         * Add a new check with multiple regexes.\n         *\n         * @param description Description of check.\n         * @param regexes List of {@link RegexCheck} objects to check.\n         * @param type {@link CheckType} of check.\n         */\n        public void add_checks (string description,\n                                Gee.ArrayList<RegexCheck?> regexes,\n                                CheckType type = CheckType.GLOBAL) {\n            CheckMap checkmap = {regexes, type, description};\n            checkmaps.add (checkmap);\n            var list = new Gee.ArrayList<CheckMap?>();\n            list.add (checkmap);\n            checklist.set (type, list);\n        }\n\n        /**\n         * Add new check (regex) to existing check ({@link CheckMap}.\n         *\n         * @param regex {@link Regex} to check.\n         * @param match_num Number of relevant capturing group.\n         */\n        public void insert_check (CheckMap checkmap,\n                                  Regex regex,\n                                  int match_num = 0) {\n            checkmap.checks.add (new RegexCheck (regex, match_num));\n        }\n\n        /**\n         * Add new checks (regexes) to existing check ({@link CheckMap}.\n         *\n         * @param regexes List of {@link RegexCheck} objects to check.\n         */\n        public void insert_checks (CheckMap checkmap,\n                                   Gee.ArrayList<RegexCheck?> regexes) {\n            foreach (var rcheck in regexes)\n                checkmap.checks.add (rcheck);\n        }\n\n        /**\n         * Remove complete check.\n         *\n         * @param checkmap Check.\n         */\n        public void delete_check (CheckMap checkmap) {\n            checklist[checkmap.type].remove (checkmap);  // can now be empty\n        }\n\n        /**\n         * Remove check (regex) of check ({@link CheckMap}.\n         *\n         * @param checkmap Check.\n         * @param pos Number of regex.\n         */\n        public void remove_check (CheckMap checkmap, int pos) {\n            checkmap.checks.remove_at (pos);  // can now be empty\n        }\n\n        /**\n         * Load checks from file.\n         *\n         * @param filename Name of file to load checks from. If null load from\n         *                 {@link stylefile}.\n         */\n        public void load (string? filename = null) throws GLib.IOError, GLib.RegexError {\n            if (filename == null)\n                filename = stylefile;\n            var file = File.new_for_path (filename);\n            if (!file.query_exists())\n                throw new IOError.NOT_FOUND (_(\"File does not exist.\"));\n\n            Xml.Doc* doc = Xml.Parser.parse_file (filename);\n            if (doc == null) {\n                delete doc;\n                throw new IOError.INVALID_DATA (_(\"Cannot parse file.\"));\n            }\n\n            Xml.Node* root_node = doc->get_root_element();\n            if (root_node == null || root_node->name != \"stylechecks\") {\n                delete doc;\n                throw new IOError.INVALID_DATA (_(\"File does not contain enough information.\"));\n            }\n\n            if (root_node->has_prop (\"version\") != null)\n                stylefile_version = root_node->get_prop (\"version\");\n            //TODO: strcmp not sufficient: 3.xx vs 15.xx\n            if (strcmp (stylefile_version, STYLE_VERSION_MIN) < 0) {\n                delete doc;\n                throw new IOError.INVALID_DATA (_(\"Project file to old: %s < %s\\n\"),\n                                                stylefile_version,\n                                                STYLE_VERSION_MIN);\n            }\n\n            for (Xml.Node* i = root_node->children; i != null; i = i->next) {\n                if (i->type != Xml.ElementType.ELEMENT_NODE)\n                    continue;\n                switch (i->name) {\n                    case \"check\":\n                        string? description = null;\n                        var rchecks = new Gee.ArrayList<RegexCheck?>();\n                        CheckType? type = null;\n                        for (Xml.Node* p = i->children; p != null; p = p->next) {\n                            if (p->type != Xml.ElementType.ELEMENT_NODE)\n                                continue;\n                            switch (p->name) {\n                                case \"description\":\n                                    if (description == null)\n                                        description = p->get_content();\n                                    else {\n                                        var new_desc = p->get_content();\n                                        if (description != new_desc)\n                                            warning_msg (_(\"Skip different description: '%s' - '%s'\\n\"),\n                                                         description, new_desc);\n                                    }\n                                    break;\n                                case \"type\":\n                                    if (type == null)\n                                        type = (CheckType) p->get_content();\n                                    else {\n                                        CheckType new_type;\n                                        string name = p->get_content();\n                                        if (!CheckType.parse_name (name, out new_type))\n                                            warning_msg (_(\"Unknown CheckType '%s', assume 'GLOBAL'.\\n\"), name);\n                                        if (type != new_type)\n                                            warning_msg (_(\"Skip different type: '%s' - '%s'\\n\"),\n                                                           type, new_type);\n                                    }\n                                    break;\n                                case \"regexcheck\":\n                                    string? regex = null;\n                                    int? match_num = null;\n                                    for (Xml.Node* pp = p->children; pp != null; pp = pp->next) {\n                                        if (pp->type != Xml.ElementType.ELEMENT_NODE)\n                                            continue;\n                                        switch (pp->name) {\n                                            case \"regex\":\n                                                if (regex == null)\n                                                    regex = p->get_content();\n                                                else {\n                                                    var new_regex = p->get_content();\n                                                    if (regex != new_regex)\n                                                        warning_msg (_(\"Skip different regexes: '%s' - '%s'\\n\"),\n                                                                     regex , new_regex);\n                                                }\n                                                break;\n                                            case \"matchgroup\":\n                                                if (match_num == null)\n                                                    match_num = int.parse (p->get_content());\n                                                else {\n                                                    var new_match_num = int.parse (p->get_content());\n                                                    if (match_num != new_match_num)\n                                                        warning_msg (_(\"Skip different match groups: '%d' - '%d'\\n\"),\n                                                                     match_num , new_match_num);\n                                                }\n                                                break;\n                                            default:\n                                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), pp->line, pp->name);\n                                                break;\n                                        }\n                                    }\n                                    if (regex == null) {\n                                        warning_msg (_(\"No regex to check.\\n\"));\n                                        break;\n                                    }\n                                    if (match_num == null) {\n                                        match_num = 0;\n                                        // TRANSLATORS:\n                                        // A \"capturing group\" is used to group (and possibly mark) expressions\n                                        // within regular expressions for later use. Usually they are numbered\n                                        // so we can access them over an index.\n                                        debug_msg (_(\"No default capturing group ('matchgroup'). Set it to 0: %s\\n\"), regex);\n                                    }\n                                    rchecks.add (new RegexCheck.str (regex, match_num));\n                                    break;\n                                default:\n                                    warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                    break;\n                            }\n                        }\n                        if (description == null) {\n                            description = \"\";\n                            warning_msg (_(\"No description found.\\n\"));\n                        }\n                        if (type == null) {\n                            type = CheckType.GLOBAL;\n                            // TRANSLATORS: This is a technical information. You migth not\n                            // want to translate \"CheckType\".\n                            warning_msg (_(\"No CheckType found, assume 'GLOBAL'.\\n\"));\n                        }\n                        add_checks (description, rchecks, type);\n                        break;\n                    default:\n                        warning_msg (\"Unknown configuration file value line %hu: %s\\n\", i->line, i->name);\n                        break;\n                }\n            }\n\n            delete doc;\n        }\n\n        /**\n         * Save checks to file.\n         *\n         * @param filename Name of file to save checks to. If null save to\n         *                 {@link stylefile}.\n         */\n        public void save (string? filename = null) {\n            if (filename == null)\n                filename = stylefile;\n            var writer = new Xml.TextWriter.filename (filename);\n            writer.set_indent (true);\n            writer.set_indent_string (\"\\t\");\n\n            writer.start_element (\"stylechecks\");\n            writer.write_attribute (\"version\", stylefile_version);\n\n            foreach (var checkmap in checkmaps) {\n                writer.start_element (\"check\");\n                writer.write_element (\"description\", checkmap.description);\n                writer.write_element (\"type\", checkmap.type.to_string());\n                foreach (var rcheck in checkmap.checks) {\n                    writer.start_element (\"regexcheck\");\n                    writer.write_element (\"regex\", rcheck.regex.get_pattern());\n                    writer.write_element (\"matchgroup\", rcheck.match_num.to_string());\n                    writer.end_element();\n                }\n                writer.end_element();\n            }\n\n            writer.end_element();\n        }\n\n        /**\n         * Get exactly selected code region.\n         *\n         * @param sf {@link Vala.SourceFile} of locations.\n         * @param begin {@link Vala.SourceLocation} starting point.\n         * @param end {@link Vala.SourceLocation} ending point.\n         * @return Return included code region. Can be a multi line string.\n         */\n        private string get_code_region (SourceFile sf, SourceLocation begin, SourceLocation end) {\n            string region;\n            if (begin.line != end.line) {\n                var tmpregion = sf.get_source_line (begin.line);\n                region = tmpregion.slice (begin.column, tmpregion.length) + \"\\n\";\n                for (var line = begin.line + 1; line < end.line; ++line)\n                    region += sf.get_source_line (line) + \"\\n\";\n                tmpregion = sf.get_source_line (end.line);\n                region += tmpregion.slice (0, end.column);\n            } else\n                region = sf.get_source_line (begin.line).slice(begin.column-1, end.column);\n            return region;\n        }\n\n        /**\n         * Get selected code region with code around.\n         *\n         * Region will include full lines.\n         *\n         * @param sf {@link Vala.SourceFile} of locations.\n         * @param begin {@link Vala.SourceLocation} starting point.\n         * @param end {@link Vala.SourceLocation} ending point.\n         * @return Return included code region. Can be a multi line string.\n         */\n        private string get_code_region_line (SourceFile sf, SourceLocation begin, SourceLocation end) {\n            string region = \"\";\n            for (var line = begin.line; line < end.line; ++line)\n                region += sf.get_source_line (line) + \"\\n\";\n            region += sf.get_source_line (end.line);\n            return region;\n        }\n\n        /**\n         * Run a single check with all checks (regexes). Add found errors to\n         * internal error list. Initialize this list with {@link init_errors}\n         * and swap with {@link swap_errors}.\n         *\n         * @param checkmap Check.\n         * @param file Source file to check.\n         */\n        public void check (CheckMap checkmap, SourceFile file) {\n            if ((checkmap.type & CheckType.DECLARACTION) == 0)\n                return;\n            // file.accept_children(file);\n            foreach (var node in file.get_nodes()) {\n                bool loopcond = true;\n                switch (checkmap.type) {\n                    case CheckType.GLOBAL:\n                    case CheckType.NAMESPACE_DECLARATION:\n                        errmsg (_(\"Type not implemented yet: %s\\n\"), checkmap.type.to_string());\n                        break;\n                    case CheckType.CLASS_DECLARACTION:\n                        loopcond = node is Namespace || node is Class;\n                        break;\n                    case CheckType.INTERFACE_DECLARATION:\n                    case CheckType.STRUCT_DECLARACTION:\n                    case CheckType.KLASS_DECLARATION:\n                    case CheckType.SIGNAL_DECLARATION:\n                    case CheckType.DELEGATE_DECLARATION:\n                    case CheckType.LAMBDA_DECLARATION:\n                    case CheckType.METHOD_DECLARATION:\n                    case CheckType.DECLARACTION:\n                    case CheckType.COMPARISON:\n                    case CheckType.ASSIGNMENT_OPERATOR:\n                    case CheckType.ARITHMETIC_OPERATOR:\n                    case CheckType.ASSIGNMENT:\n                    case CheckType.BITWISE_OPERATOR:\n                    case CheckType.UNARY_OPERATOR:\n                    case CheckType.TERNARY_OPERATOR:\n                    case CheckType.COALESCING_OPERATOR:\n                    case CheckType.OPERATOR:\n                    case CheckType.DO_LOOP:\n                    case CheckType.WHILE_LOOP:\n                    case CheckType.FOR_LOOP:\n                    case CheckType.FOREACH_LOOP:\n                    case CheckType.LOOP:\n                    case CheckType.IF:\n                    case CheckType.ELSE:\n                    case CheckType.IF_CONTROL:\n                    case CheckType.SWITCH:\n                    case CheckType.CASE:\n                    case CheckType.DEFAULT:\n                    case CheckType.SWITCH_CONTROL:\n                    case CheckType.BREAK:\n                    case CheckType.CONTINUE:\n                    case CheckType.CONTROL:\n                    case CheckType.CCODE:\n                    case CheckType.BLOCK_COMMENT:\n                    case CheckType.LINE_COMMENT:\n                    case CheckType.COMMENT:\n                        errmsg (_(\"Type not implemented yet: %s\\n\"), checkmap.type.to_string());\n                        break;\n                    default:\n                        warning_msg (_(\"Unknown CheckType: %s\\n\"), checkmap.type.to_string());\n                        break;\n                }\n                // if (!loopcond)\n                //     continue;\n                stdout.printf (\"node: %s\\n\", node.type_name);\n                var exact_region = get_code_region (node.source_reference.file,\n                                                    node.source_reference.begin,\n                                                    node.source_reference.end);\n                stdout.printf (\"line:|%s|\\n\", exact_region);\n\n                iter_symbol ((Symbol) node, (smb, depth) => {\n                    stdout.printf (\"Symbol: %s\\n\", smb.name);\n                    exact_region = get_code_region (smb.source_reference.file,\n                                                    smb.source_reference.begin,\n                                                    smb.source_reference.end);\n                    stdout.printf (\"line:|%s|\\n\", exact_region);\n                    return IterCallbackReturns.CONTINUE;;\n                });\n\n                continue;\n\n                var line_region = get_code_region_line (node.source_reference.file,\n                                                        node.source_reference.begin,\n                                                        node.source_reference.end);\n                stdout.printf (\"|--|%s|--|\\n\", line_region);\n\n                foreach (var rcheck in checkmap.checks) {\n                    stdout.printf (\"Check -- \");\n                    stdout.printf (\"Regex: %s\\n\", rcheck.regex.get_pattern());\n                    MatchInfo info;\n                    if (rcheck.regex.match (line_region, 0, out info)) {\n                        int start;\n                        int end;\n                        info.fetch_pos (rcheck.match_num, out start, out end);\n                        stdout.printf (\"matched:|%s|\\n\", line_region.slice (start, end));\n                        new_errors.add (new StyleError (checkmap,\n                                                        rcheck.regex,\n                                                        file,\n                                                        start,\n                                                        end));\n                    }\n                }\n            }\n        }\n\n        /**\n         * Iterate over all source files and run all checks on each.\n         */\n        public void check_all() {\n            init_errors();\n            foreach (var file in project.sourcefiles) {\n                debug_msg (\"\\nProcessing source file: %s\\n\", file.filename);\n                foreach (var checkmap in checkmaps)\n                    check (checkmap, file);\n            }\n            swap_errors();\n        }\n\n        /**\n         * Iterate over all checks and run all for all source files.\n         */\n        public void check_all_by_check() {\n            init_errors();\n            foreach (var checkmap in checkmaps)\n                foreach (var file in project.sourcefiles) {\n                    debug_msg (\"\\nProcessing source file: %s\\n\", file.filename);\n                    check (checkmap, file);\n                }\n            swap_errors();\n        }\n\n        /**\n         * Run all checks on one source file.\n         *\n         * @param file {@link Vala.SourceFile} to check.\n         */\n        public void check_all_by_file (SourceFile file) {\n            init_errors();\n            debug_msg (\"\\nProcessing source file: %s\\n\", file.filename);\n            foreach (var checkmap in checkmaps)\n                check (checkmap, file);\n            swap_errors();\n        }\n\n        /**\n         * Initialize internal list of errors.\n         */\n        public void init_errors() {\n            new_errors = new Gee.ArrayList<StyleError?>();\n        }\n\n        /**\n         * Swap internal errors to public list.\n         *\n         * @param errlist If not null swap to errlist instead of\n         *                {@link errors}.\n         */\n        public void swap_errors (Gee.ArrayList<StyleError?>? errlist = null) {\n            if (errlist != null)\n                errlist = new_errors;\n            else\n                lock (errors)\n                    errors = new_errors;\n        }\n\n        /**\n         * Clear errors.\n         */\n        public void clear() {\n            init_errors();\n            lock (errors)\n                swap_errors();\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "icons/CMakeLists.txt",
    "content": "#\n# icons/CMakeLists.txt\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\ninclude(\"${CMAKE_SOURCE_DIR}/cmake/Common.cmake\")\n\n# Generate usable application icons.\nset(sizeslist \"24\" \"32\" \"48\" \"64\" \"72\" \"96\" \"128\" \"256\")\nconvert_svg_to_png(png_list\n  ICON\n    \"${CMAKE_CURRENT_SOURCE_DIR}/V4_logo.svg\"\n  SIZES\n    ${sizeslist}\n  PNG_NAME\n    \"valama\"\n)\nadd_custom_target(icons\n  ALL\n  DEPENDS\n    ${png_list}\n  COMMENT\n    \"Generate application icons.\" VERBATIM\n)\n\n# Generate logo with text.\nset(sizeslist \"128\")\nconvert_svg_to_png(textlogo\n  ICON\n    \"${CMAKE_CURRENT_SOURCE_DIR}/V4.svg\"\n  SIZES\n    ${sizeslist}\n  PNG_NAME\n    \"valama-text\"\n  DESTINATION\n    \"${datadir}\"\n)\nadd_custom_target(icons_text\n  ALL\n  DEPENDS\n    ${textlogo}\n  COMMENT\n    \"Generate text logo.\" VERBATIM\n)\n\n\n# Install application icon.\nif(CONVERT)\n  install(\n    FILES\n      \"${CMAKE_CURRENT_BINARY_DIR}/icons/hicolor/32x32/apps/valama.png\"\n    DESTINATION\n      \"${pixrootdir}\"\n  )\nendif()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "po/CMakeLists.txt",
    "content": "#\n# po/CMakeLists.txt\n# Copyright (C) 2012, 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\ninclude(Gettext)\nif(XGETTEXT_FOUND)\n  set(potfile \"${CMAKE_CURRENT_SOURCE_DIR}/${project_name_lower}.pot\")\n  gettext_create_pot(\"${potfile}\"\n    SRCFILES\n      ${srcfiles}\n      \"guanako/*.vala\"\n    DESKTOPFILES\n      \"data/valama.desktop.in\"\n    GSETTINGSFILES\n      \"data/org.valama.gschema.xml\"\n  )\n  option(UPDATE_PO \"Update .po files.\" ON)\n  if(UPDATE_PO)\n    set(NOUPDATE)\n  else()\n    set(NOUPDATE \"NOUPDATE\")\n  endif()\n  option(INSTALL_INTLTOOL_MERGED \"Copy intltoolized files into source tree.\" OFF)\n  if(INSTALL_INTLTOOL_MERGED)\n    set(DESKTOPFILES_INSTALL \"DESKTOPFILES_INSTALL\")\n  else()\n    set(DESKTOPFILES_INSTALL)\n  endif()\n  gettext_create_translations(\"${potfile}\" ALL ${NOUPDATE} ${DESKTOPFILES_INSTALL})\nendif()\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "po/de.po",
    "content": "# German translations for Valama package.\n# Copyright (C) 2012 THE Valama'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the Valama package.\n# Dominique Lasserre <lasserre.d@gmail.com>, 2012.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Valama 0.1.2\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2013-05-30 21:20+0200\\n\"\n\"PO-Revision-Date: 2013-05-10 02:50+0100\\n\"\n\"Last-Translator: Dominique Lasserre <lasserre.d@gmail.com>\\n\"\n\"Language-Team: German\\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@->>> (line)<<<- -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:673\n#: ../src/dialogs/create_project.vala:727\nmsgid \" (line)\"\nmsgstr \" (Zeile)\"\n\n#: ../src/project/project.vala:621 ../src/project/project.vala:623\n#, c-format\nmsgid \"%s - Vala\"\nmsgstr \"%s - Vala\"\n\n#. TRANSLATORS:\n#. E.g.: Warning found: myfile.vala: 12(13)-12(17): unused variable `test'\n#: ../src/ui/reports.vala:231\n#, c-format\nmsgid \"%s found: %s: %d(%d)-%d(%d): %s\\n\"\nmsgstr \"%s gefunden: %s: %d(%d)-%d(%d): %s\\n\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished ...\"\n#: ../src/ui/current_file_structure.vala:107\n#, c-format\nmsgid \"%s update finished (not a valid source buffer)!\\n\"\nmsgstr \"%s-Update beendet (kein gültiger Quellpuffer)!\\n\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished!\"\n#: ../src/ui/breakpoints.vala:297 ../src/ui/current_file_structure.vala:176\n#: ../src/ui/current_symbol.vala:153 ../src/ui/project_browser.vala:317\n#: ../src/ui/reports.vala:222 ../src/ui/search.vala:246\n#: ../src/ui/source_viewer.vala:625 ../src/ui/symbol_browser.vala:142\n#, c-format\nmsgid \"%s update finished!\\n\"\nmsgstr \"%s-Update beendet!\\n\"\n\n#. TRANSLATORS:\n#. E.g. \"CMake build failed: some error\" or \"Autotools build failed: some error\"\n#: ../src/project/build_project.vala:145\n#, c-format\nmsgid \"'%s' build failed: %s\\n\"\nmsgstr \"'%s'-Kompilieren fehlgeschlagen: %s\\n\"\n\n#: ../src/project/build_project.vala:135 ../src/project/build_project.vala:186\n#: ../src/project/build_project.vala:222\n#, c-format\nmsgid \"'%s' cleaning failed: %s\\n\"\nmsgstr \"'%s'-Aufräumen fehlgeschlagen: %s\\n\"\n\n#: ../src/project/build_project.vala:139\n#, c-format\nmsgid \"'%s' configuration failed: %s\\n\"\nmsgstr \"'%s'-Konfiguration fehlgeschlagen: %s\\n\"\n\n#: ../src/project/build_project.vala:131 ../src/project/build_project.vala:182\n#: ../src/project/build_project.vala:218\n#, c-format\nmsgid \"'%s' initialization failed: %s\\n\"\nmsgstr \"'%s'-Initialisierung fehlgeschlagen: %s\\n\"\n\n#: ../src/common/args.vala:78\n#, c-format\nmsgid \"'%s' not a positive number\"\nmsgstr \"'%s' keine positive Zahl\"\n\n#: ../src/project/build_project.vala:149\n#, c-format\nmsgid \"'%s' tests failed: %s\\n\"\nmsgstr \"'%s'-Tests fehlgeschlagen: %s\\n\"\n\n#: ../src/project/build_project.vala:120\n#, c-format\nmsgid \"'Build' failed with exit status: %d\\n\"\nmsgstr \"'Kompilieren' mit Rückgabewert '%d' fehlgeschlagen.\\n\"\n\n#: ../src/project/build_project.vala:106\n#, c-format\nmsgid \"'Clean' failed with exit status: %d\\n\"\nmsgstr \"'Aufräumen' mit Rückgabewert '%d' fehlgeschlagen.\\n\"\n\n#: ../src/project/build_project.vala:125\n#, c-format\nmsgid \"'Configure' failed with exit status: %d\\n\"\nmsgstr \"'Konfigurieren' mit Rückgabewert '%d' fehlgeschlagen.\\n\"\n\n#: ../src/project/build_project.vala:102 ../src/project/build_project.vala:177\n#: ../src/project/build_project.vala:213\n#, c-format\nmsgid \"'Distclean' failed with exit status: %d\\n\"\nmsgstr \"'Vollständiges Aufräumen' mit Rückgabewert '%d' fehlgeschlagen.\\n\"\n\n#: ../src/project/build_project.vala:97 ../src/project/build_project.vala:171\n#: ../src/project/build_project.vala:208\n#, c-format\nmsgid \"'Initialization' failed with exit status: %d\\n\"\nmsgstr \"'Initialisieren' mit Rückgabewert '%d' fehlgeschlagen.\\n\"\n\n#: ../src/project/build_project.vala:115\n#, c-format\nmsgid \"'Tests' failed with exit status: %d\\n\"\nmsgstr \"'Testen' mit Rückgabewert '%d' fehlgeschlagen.\\n\"\n\n#: ../src/project/project.vala:1801\nmsgid \"(new file)\"\nmsgstr \"(neue Datei)\"\n\n#: ../src/common/args.vala:52\nmsgid \"- Valama: next generation Vala IDE\"\nmsgstr \"- Valama: Vala IDE der nächsten Generation\"\n\n#: ../src/ui/project_browser.vala:190 ../src/ui/project_browser.vala:206\nmsgid \"Add new directory\"\nmsgstr \"Neues Verzeichnis hinzufügen\"\n\n#: ../src/ui/project_browser.vala:185 ../src/ui/project_browser.vala:202\nmsgid \"Add new file\"\nmsgstr \"Neue Datei hinzufügen\"\n\n#. TRANSLATORS:\n#. E.g.: \"Add new file to project (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:51\n#, c-format\nmsgid \"Add new file to project (%s)\"\nmsgstr \"Neue Datei zum Projekt hinzufügen (%s)\"\n\n#: ../src/ui/project_browser.vala:177 ../src/ui/project_browser.vala:195\nmsgid \"Add new package\"\nmsgstr \"Paket hinzufügen\"\n\n#: ../src/project/project.vala:911 ../src/project/project.vala:922\n#, c-format\nmsgid \"Add package: %s\\n\"\nmsgstr \"Füge Paket hinzu: %s\\n\"\n\n#: ../src/project/project.vala:726\n#, c-format\nmsgid \"Add project to recent manager: %s - %s\\n\"\nmsgstr \"Füge Projekt zu Letzte-Änderungen-Manager hinzu: %s - %s\\n\"\n\n#: ../src/ui/search.vala:71\nmsgid \"All files\"\nmsgstr \"Alle Dateien\"\n\n#. TRANSLATORS: (*) is a file filter (globbing) and matches all files.\n#: ../src/ui/welcome_screen.vala:590\nmsgid \"All files (*)\"\nmsgstr \"Alle Dateien (*)\"\n\n#: ../src/project/project.vala:531 ../src/project/project.vala:585\n#, c-format\nmsgid \"An error occurred while loading new Guanako project: %s\\n\"\nmsgstr \"Ein Fehler trat beim Laden eines neuen Guanako-Projekts auf: %s\\n\"\n\n#: ../src/ui/app_output.vala:39 ../src/ui_main.vala:181\nmsgid \"Application output\"\nmsgstr \"Anwendungsausgabe\"\n\n#: ../src/project/build_project.vala:250\n#, c-format\nmsgid \"Application received signal: %s\\n\"\nmsgstr \"Anwendung empfang Signal: %s\\n\"\n\n#: ../src/project/build_project.vala:235\nmsgid \"Application still running. Quit it manually.\\n\"\nmsgstr \"Anwendung noch laufend. Manuelles Beenden nötig.\\n\"\n\n#: ../src/project/build_project.vala:266\n#, c-format\nmsgid \"Application terminated with exit status '%d'.\\n\"\nmsgstr \"Anwendung beendete mit Rückgabewert '%d'.\\n\"\n\n#: ../src/dialogs/create_project.vala:306\nmsgid \"Author\"\nmsgstr \"Autor\"\n\n#: ../src/dialogs/create_project.vala:63\nmsgid \"Author information\"\nmsgstr \"Autorinformation\"\n\n#: ../src/dialogs/create_project.vala:308\nmsgid \"Authors\"\nmsgstr \"Autoren\"\n\n#. TRANSLATORS: Of course not the body part ;) .\n#. Go to the previous window.\n#: ../src/ui/welcome_screen.vala:430 ../src/ui_main.vala:480\nmsgid \"Back\"\nmsgstr \"Zurück\"\n\n#: ../src/ui_main.vala:189\nmsgid \"Breakpoints / Timers\"\nmsgstr \"Haltepunkte / Timer\"\n\n#: ../src/project/project.vala:1911\nmsgid \"Buffer loaded.\\n\"\nmsgstr \"Puffer geladen.\\n\"\n\n#: ../src/project/project.vala:1929\nmsgid \"Buffer update\"\nmsgstr \"Pufferupdate\"\n\n#: ../src/ui_main.vala:393 ../src/ui_main.vala:399 ../src/ui_main.vala:542\nmsgid \"Build\"\nmsgstr \"Kompiliere\"\n\n#: ../src/project/build_project.vala:70\n#, c-format\nmsgid \"Build command received signal: %s\\n\"\nmsgstr \"Kompilierkommando empfang Signal: %s\\n\"\n\n#. TRANSLATORS:\n#. The user has to choose a directory where to build the application\n#. so it might be undefined.\n#: ../src/buildsystem/base.vala:429 ../src/buildsystem/cmake.vala:44\nmsgid \"Build directory not set.\"\nmsgstr \"Kein Kompilierverzeichnis angegeben.\"\n\n#: ../src/ui_main.vala:177\nmsgid \"Build output\"\nmsgstr \"Kompilierausgabe\"\n\n#: ../src/project/project_templates.vala:74\n#, c-format\nmsgid \"Build system '%s' currently not supported by template selector.\\n\"\nmsgstr \"\"\n\"Build-System '%s' zur Zeit bei der Vorlagenauswahl nicht unterstützt.\\n\"\n\n#: ../src/project/project.vala:1715\n#, c-format\nmsgid \"Build system '%s' not supported.\\n\"\nmsgstr \"Build-System '%s' nicht unterstützt.\\n\"\n\n#: ../src/project/project.vala:1078\n#, c-format\nmsgid \"Build system directory does not exist: %s\\n\"\nmsgstr \"Build-System-Verzeichnis existiert nicht: %s\\n\"\n\n#: ../src/project/project.vala:1076\n#, c-format\nmsgid \"Build system file does not exist: %s\\n\"\nmsgstr \"Build-System-Datei existiert nicht: %s\\n\"\n\n#: ../src/ui/project_browser.vala:289\nmsgid \"Build system files\"\nmsgstr \"Build-System-Dateien\"\n\n#: ../src/common/args.vala:40\nmsgid \"Build systems directory.\"\nmsgstr \"Build-System-Verzeichnis\"\n\n#: ../src/buildsystem/base.vala:75\n#, c-format\nmsgid \"Buildsystem build finished: %s\\n\"\nmsgstr \"Build-System-Kompiliervorgang abgeschlossen: %s\\n\"\n\n#: ../src/buildsystem/base.vala:72\n#, c-format\nmsgid \"Buildsystem build started: %s\\n\"\nmsgstr \"Build-System-Kompiliervorgang gestartet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:81\n#, c-format\nmsgid \"Buildsystem cleaning finished: %s\\n\"\nmsgstr \"Build-System-Aufräumen abgeschlossen: %s\\n\"\n\n#: ../src/buildsystem/base.vala:78\n#, c-format\nmsgid \"Buildsystem cleaning started: %s\\n\"\nmsgstr \"Build-System-Aufräumen gestartet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:69\n#, c-format\nmsgid \"Buildsystem configuration finished: %s\\n\"\nmsgstr \"Build-System-Konfiguration beendet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:66\n#, c-format\nmsgid \"Buildsystem configuration started: %s\\n\"\nmsgstr \"Build-System-Konfiguration gestartet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:87\n#, c-format\nmsgid \"Buildsystem distcleaning finished: %s\\n\"\nmsgstr \"Vollständiges Build-System-Aufräumen beendet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:84\n#, c-format\nmsgid \"Buildsystem distcleaning started: %s\\n\"\nmsgstr \"Vollständiges Build-System-Aufräumen gestartet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:63\n#, c-format\nmsgid \"Buildsystem initialization finished: %s\\n\"\nmsgstr \"Build-System-Initialisierung beendet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:60\n#, c-format\nmsgid \"Buildsystem initialization started: %s\\n\"\nmsgstr \"Build-System-Initialisieren gestartet: %s\\n\"\n\n#: ../src/buildsystem/base.vala:93\n#, c-format\nmsgid \"Buildsystem tests finished: %s\\n\"\nmsgstr \"Build-System-Tests abgeschlossen: %s\\n\"\n\n#: ../src/buildsystem/base.vala:90\n#, c-format\nmsgid \"Buildsystem tests started: %s\\n\"\nmsgstr \"Build-System-Tests gestartet: %s\\n\"\n\n#: ../guanako/guanako.vala:943\n#, c-format\nmsgid \"Call '%s' not found in '%s'\\n\"\nmsgstr \"Aufruf '%s' nicht gefunden in '%s'\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@ (line) -> 'barfoo'\"... or\n#. \"Cannot apply substitution @foobar@ -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:670\n#, c-format\nmsgid \"Cannot apply substitution '@%s@'%s -> '%s': %s does not exist\\n\"\nmsgstr \"\"\n\"Kann Ersetzen  '@%s@'%s -> '%s' nicht durchführen: %s existiert nicht\\n\"\n\n#: ../src/dialogs/create_project.vala:754\n#, c-format\nmsgid \"Cannot create temporary file '%s' to apply substitutions: %s\\n\"\nmsgstr \"\"\n\"Kann temporäre Datei '%s' um Ersetzungen durchzuführen, nicht anlegen: %s\\n\"\n\n#: ../src/project/project.vala:1264 ../src/project/project.vala:1620\n#: ../src/project/project_templates.vala:209 ../src/ui_main.vala:742\n#: ../guanako/stylecheck.vala:360\nmsgid \"Cannot parse file.\"\nmsgstr \"Kann Datei nicht parsen.\"\n\n#: ../src/dialogs/create_project.vala:735\n#, c-format\nmsgid \"Cannot read file '%s': %s\\n\"\nmsgstr \"Kann Datei '%s' nicht lesen: %s\\n\"\n\n#. TRANSLATORS: Change focus of source view to new file.\n#: ../src/ui/source_viewer.vala:66\n#, c-format\nmsgid \"Change current focus: %s\\n\"\nmsgstr \"Aktuellen Fokus ändern: %s\\n\"\n\n#: ../src/ui/stylechecker.vala:61\nmsgid \"Checker loaded.\\n\"\nmsgstr \"Checker geladen.\\n\"\n\n#: ../src/project/project.vala:1734 ../src/project/project.vala:1744\n#, c-format\nmsgid \"Choose '%s' package.\\n\"\nmsgstr \"Wähle Paket '%s'.\\n\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:45\n#, fuzzy\nmsgid \"Choose Buildsystem\"\nmsgstr \"Dateinamen wählen\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:46\nmsgid \"Choose a buildsystem for current project.\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:36\nmsgid \"Choose directory name\"\nmsgstr \"Verzeichnisnamen wählen\"\n\n#: ../src/dialogs/create_file.vala:35\nmsgid \"Choose filename\"\nmsgstr \"Dateinamen wählen\"\n\n#: ../src/ui/welcome_screen/create_project_packages.vala:31\n#, fuzzy\nmsgid \"Choose packages\"\nmsgstr \"Wähle Paket '%s'.\\n\"\n\n#: ../src/dialogs/create_project.vala:522\nmsgid \"Choose project template\"\nmsgstr \"Projektvorlage wählen\"\n\n#: ../src/ui_main.vala:419\nmsgid \"Clean\"\nmsgstr \"Aufräumen\"\n\n#: ../src/ui_main.vala:425\nmsgid \"Clean all\"\nmsgstr \"Vollständig aufräumen\"\n\n#: ../src/ui_main.vala:412\nmsgid \"Clean build\"\nmsgstr \"Sauberes Kompilieren\"\n\n#: ../src/ui/app_output.vala:51\nmsgid \"Clear output\"\nmsgstr \"Ausgabe leeren.\"\n\n#: ../src/project/project.vala:2062\nmsgid \"Close buffer.\\n\"\nmsgstr \"Schließe Puffer.\\n\"\n\n#: ../src/ui_main.vala:482\nmsgid \"Close project\"\nmsgstr \"Projekt schließen\"\n\n#: ../src/ui/source_viewer.vala:278\n#, c-format\nmsgid \"Close view and buffer: %s\\n\"\nmsgstr \"Ansicht und Puffer schließen: %s\\n\"\n\n#: ../src/ui_main.vala:197\nmsgid \"Coding style checker\"\nmsgstr \"Coding-Style-Checker\"\n\n#: ../src/dialogs/missing_packages.vala:39\nmsgid \"Compiling and auto completion might fail!\"\nmsgstr \"Kompilieren und Autovervollständigung könnten nicht funktionieren!\"\n\n#: ../src/completion_provider.vala:66\nmsgid \"Completion\"\nmsgstr \"Vervollständigung\"\n\n#: ../src/common/common.vala:471\n#, c-format\nmsgid \"Copy from '%s' to '%s'.\\n\"\nmsgstr \"Von '%s' nach '%s' kopieren.\\n\"\n\n#: ../src/common/common.vala:348\nmsgid \"Copying finished.\\n\"\nmsgstr \"Kopieren beendet.\\n\"\n\n#: ../src/dialogs/about.vala:50\nmsgid \"Copyright © 2012, 2013 Valama development team\"\nmsgstr \"Copyright © 2012, 2013 Valama Entwicklungsteam\"\n\n#: ../guanako/guanako_frankenstein.vala:31\n#, c-format\nmsgid \"Could not acquire name.\\n\"\nmsgstr \"Konnte Namen nicht bekommen\\n\"\n\n#: ../src/project/project.vala:732\nmsgid \"Could not add project to recent manager.\\n\"\nmsgstr \"Konnte Projekt nicht zum Letzte-Änderungen-Manager hinzufügen.\\n\"\n\n#. TRANSLATORS: Could not change source view focus to new file.\n#: ../src/ui/source_viewer.vala:236\n#, c-format\nmsgid \"Could not change focus to: %s\\n\"\nmsgstr \"Konnte nicht den Fokus auf '%s' ändern.\\n\"\n\n#: ../src/dialogs/create_project.vala:759\n#: ../src/dialogs/create_project.vala:792\n#, c-format\nmsgid \"Could not close file descriptor for '%s': %s\\n\"\nmsgstr \"Konnte Datei '%s' nicht ordnungsgemäß schließen: %s\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Could not close source view (mapping) for: myfile.vala\"\n#: ../src/project/project.vala:1190\n#, c-format\nmsgid \"Could not close source view (mapping) for: %s\\n\"\nmsgstr \"Konnte Quellansicht (Mapping) für '%s' nicht schließen.\\n\"\n\n#: ../src/ui/source_viewer.vala:274\n#, c-format\nmsgid \"Could not close view: %s\\n\"\nmsgstr \"Konnte Ansicht nicht schließen: %s\\n\"\n\n#: ../src/dialogs/project_settings.vala:69\n#, c-format\nmsgid \"Could not compare project files inodes: %s\\n\"\nmsgstr \"Konnte Projektdatei-Inodes nicht vergleichen: %s\\n\"\n\n#: ../src/project/project.vala:135\n#, c-format\nmsgid \"Could not convert '%s' to '%s'.\\n\"\nmsgstr \"Konnte '%s' nicht zu '%s' übersetzen.\\n\"\n\n#: ../src/project/project.vala:66 ../src/project/project.vala:98\n#: ../src/project/project.vala:117\n#, c-format\nmsgid \"Could not convert '%s' to string: %u\\n\"\nmsgstr \"Konnte '%s' nicht zu einer Zeichenfolge übersetzen: %u\\n\"\n\n#: ../src/buildsystem/base.vala:586\n#, c-format\nmsgid \"Could not convert all characters: %s\\n\"\nmsgstr \"Konnte nicht alle Zeichen übersetzen: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:623\n#, c-format\nmsgid \"Could not copy templates for new project: %s\\n\"\nmsgstr \"Konnte Vorlagen für neues Projekt nicht kopieren: %s\\n\"\n\n#: ../src/ui_main.vala:278\n#, c-format\nmsgid \"Could not create cache directory: %s\\n\"\nmsgstr \"Konnte Cache-Verzeichnis nicht anlegen: %s\\n\"\n\n#: ../src/dialogs/create_file.vala:120\n#, c-format\nmsgid \"Could not create new directory: %s\\n\"\nmsgstr \"Konnte kein neues Verzeichnis erstellen: %s\\n\"\n\n#: ../src/dialogs/create_file.vala:110\n#, c-format\nmsgid \"Could not create new file: %s\\n\"\nmsgstr \"Konnte neue Datei nicht anlegen: %s\\n\"\n\n#: ../src/dialogs/create_file.vala:102\n#, c-format\nmsgid \"Could not create parent directory: %s\\n\"\nmsgstr \"Konnte übergeordnetes Verzeichnis nicht anlegen: %s\\n\"\n\n#: ../src/project/project.vala:1942\n#, c-format\nmsgid \"Could not create thread to update buffer: %s\\n\"\nmsgstr \"\"\n\"Thread zum Aktualisierung des Puffers konnte nicht erzeugt werden werden: \"\n\"%s\\n\"\n\n#: ../src/project/project.vala:679\n#, c-format\nmsgid \"Could not create thread to update source files: %s\\n\"\nmsgstr \"\"\n\"Thread zum Aktualisierung der Quelldateien konnte nicht erzeugt werden: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:690\n#, c-format\nmsgid \"Could not determine file path: %s\\n\"\nmsgstr \"Konnte Dateipfad nicht ermitteln: %s\\n\"\n\n#. TRANSLATORS: This is an technical information. You might not want\n#. to translate \"ScrolledWindow\".\n#: ../src/ui/source_viewer.vala:550\n#, c-format\nmsgid \"Could not find ScrolledWindow widget: %s\\n\"\nmsgstr \"Konnte ScrolledWindow-Widget nicht finden: %s\\n\"\n\n#: ../src/buildsystem/base.vala:316\n#, c-format\nmsgid \"Could not find pkg-config file for '%s'. \"\nmsgstr \"Konnte pkg-config-Datei für Paket '%s' nicht finden.\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:378 ../src/ui/project_browser.vala:481\n#, c-format\nmsgid \"Could not get current TreePath: %s\\n\"\nmsgstr \"Konnte aktuellen TreePath nicht bekommen: %s\\n\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreeView\".\n#: ../src/ui/project_browser.vala:115 ../src/ui/project_browser.vala:127\n#: ../src/ui/project_browser.vala:166 ../src/ui/project_browser.vala:386\n#: ../src/ui/project_browser.vala:425 ../src/ui/project_browser.vala:487\n#: ../src/ui/project_browser.vala:505\n#, c-format\nmsgid \"Could not get iterator in TreeView: %s\\n\"\nmsgstr \"Konnte TreeView-Iterator nicht ermitteln: %s\\n\"\n\n#: ../src/project/project.vala:595\n#, c-format\nmsgid \"Could not initialize build system: %s\\n\"\nmsgstr \"Konnte Build-System nicht initialisieren: %s\\n\"\n\n#: ../src/ui/ui_elements.vala:118\nmsgid \"Could not initialize locking signals.\\n\"\nmsgstr \"Konnte Sperrsignale nicht initialisieren.\\n\"\n\n#: ../src/completion_provider.vala:175\n#, c-format\nmsgid \"Could not launch completion thread successfully: %s\\n\"\nmsgstr \"Konnte Autovervollständigungs-Thread nicht starten: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:701 ../src/main.vala:178\n#: ../src/project/project.vala:822 ../src/project/project.vala:866\n#, c-format\nmsgid \"Could not list or iterate through directory content of '%s': %s\\n\"\nmsgstr \"Konnte im Verzeichnis '%s' nicht erfolgreich arbeiten: %s\\n\"\n\n#: ../src/project/project.vala:1033\n#, c-format\nmsgid \"Could not load Vala source file: %s\\n\"\nmsgstr \"Konnte Vala-Quelldatei nicht laden: %s\\n\"\n\n#: ../src/ui/welcome_screen.vala:245\n#, c-format\nmsgid \"Could not load Valama text logo: %s\\n\"\nmsgstr \"Konnte Valama-Textlogo nicht laden: %s\\n\"\n\n#: ../src/project/project.vala:1862 ../src/ui/source_viewer.vala:373\n#, c-format\nmsgid \"Could not load completion: %s\\n\"\nmsgstr \"Konnte Autovervollständigung nicht laden: %s\\n\"\n\n#: ../src/main.vala:279\n#, c-format\nmsgid \"Could not load file: %s\\n\"\nmsgstr \"Konnte Datei nicht laden: %s\\n\"\n\n#: ../src/completion_provider.vala:185\n#, c-format\nmsgid \"Could not load icon theme: %s\\n\"\nmsgstr \"Konnte Icon-Thema nicht laden: %s\\n\"\n\n#: ../src/project/project.vala:575 ../src/ui_main.vala:241\n#, c-format\nmsgid \"Could not load meta information: %s\\n\"\nmsgstr \"Konnte Metainformation nicht laden: %s\\n\"\n\n#: ../src/dialogs/project_settings.vala:79 ../src/ui/welcome_screen.vala:372\n#, c-format\nmsgid \"Could not load new project: %s\\n\"\nmsgstr \"Konnte neues Projekt nicht laden: %s\\n\"\n\n#: ../src/main.vala:170\n#, c-format\nmsgid \"Could not load pixmap: %s\\n\"\nmsgstr \"Konnte Pixmap nicht laden: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:143\n#, c-format\nmsgid \"Could not load project template: %s\\n\"\nmsgstr \"Konnte Projektvorlage nicht laden: %s\\n\"\n\n#: ../src/ui/welcome_screen.vala:631\n#, c-format\nmsgid \"Could not load project: %s\\n\"\nmsgstr \"Konnte Projekt nicht laden: %s\\n\"\n\n#: ../src/project/project_templates.vala:231\n#, c-format\nmsgid \"Could not load template '%s': %s\\n\"\nmsgstr \"Konnte Vorlage '%s' nicht laden: %s\\n\"\n\n#: ../src/project/project_templates.vala:198\n#, c-format\nmsgid \"Could not load template image: %s\\n\"\nmsgstr \"Konnte Vorlagenbild nicht laden: %s\\n\"\n\n#: ../guanako/guanako.vala:310\n#, c-format\nmsgid \"Could not load vapi: %s\\n\"\nmsgstr \"Konnte Vapi nicht laden: %s\\n\"\n\n#: ../src/project/project.vala:1232\n#, c-format\nmsgid \"Could not open directory or file in '%s': %s\\n\"\nmsgstr \"Konnte Verzeichnis oder Datei in '%s' nicht öffnen: %s\\n\"\n\n#: ../src/buildsystem/plain.vala:104 ../src/common/common.vala:636\n#, c-format\nmsgid \"Could not open file writable: %s\\n\"\nmsgstr \"Konnte Datei nicht beschreibbar öffnen: %s\\n\"\n\n#: ../src/buildsystem/cmake.vala:109\n#, c-format\nmsgid \"Could not open file: %s\\n\"\nmsgstr \"Konnte Datei nicht öffnen: %s\\n\"\n\n#: ../src/main.vala:172\n#, c-format\nmsgid \"Could not open pixmaps file: %s\\n\"\nmsgstr \"Konnte Pixmap-Datei nicht öffnen: %s\\n\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:53\n#, c-format\nmsgid \"Could not operate on directory: %s\"\nmsgstr \"Konnte nicht im Verzeichnis arbeiten: %s\"\n\n#: ../src/project/project_templates.vala:366\n#, c-format\nmsgid \"Could not process files in template directory: %s\\n\"\nmsgstr \"\"\n\"Konnte Dateien im Vorlagenverzeichnis nicht erfolgreich bearbeiten: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:786\n#, c-format\nmsgid \"Could not read file '%s' properly: %s\\n\"\nmsgstr \"Konnte Datei '%s' nicht vollständig lesen: %s\\n\"\n\n#: ../src/buildsystem/plain.vala:79\n#, c-format\nmsgid \"Could not read file content of '%s': %s\\n\"\nmsgstr \"Konnte Dateiinhalt von '%s' nicht lesen: %s\\n\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:51 ../guanako/guanako.vala:1294\n#, c-format\nmsgid \"Could not read file: %s\"\nmsgstr \"Konnte Datei nicht lesen: %s\"\n\n#: ../src/buildsystem/cmake.vala:107\n#, c-format\nmsgid \"Could not read file: %s\\n\"\nmsgstr \"Konnte Datei nicht lesen: %s\\n\"\n\n#: ../guanako/guanako.vala:1292\n#, c-format\nmsgid \"Could not read line: %s\"\nmsgstr \"Konnte Zeile nicht lesen: %s\"\n\n#: ../src/project/project.vala:528 ../src/project/project.vala:582\n#, c-format\nmsgid \"Could not read syntax file: %s\\n\"\nmsgstr \"Konnte Syntax-Datei nicht lesen: %s\\n\"\n\n#: ../guanako/guanako_frankenstein.vala:45\n#, c-format\nmsgid \"Could not register service.\\n\"\nmsgstr \"Konnte Dienst nicht registrieren.\\n\"\n\n#: ../src/project/project.vala:1481\nmsgid \"Could not select a package from choice.\\n\"\nmsgstr \"Konnte keine Paketauswahl treffen.\\n\"\n\n#: ../src/ui/source_viewer.vala:74\n#, c-format\nmsgid \"Could not select current source view: %s\\n\"\nmsgstr \"Konnte aktuelle Ansicht nicht auswählen: %s\\n\"\n\n#: ../src/buildsystem/base.vala:675\n#, c-format\nmsgid \"Could not spawn pkg-config package existence check: %s\\n\"\nmsgstr \"Konnte pkg-config-Paketexistenzprüfung nicht ausführen: %s\\n\"\n\n#: ../src/buildsystem/base.vala:553\n#, c-format\nmsgid \"Could not spawn subprocess: %s\\n\"\nmsgstr \"Konnte Prozess nicht ausführen: %s\\n\"\n\n#: ../src/ui/source_viewer.vala:366\n#, c-format\nmsgid \"Could not unload completion: %s\\n\"\nmsgstr \"Konnte Autovervollständigung nicht abschalten: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:796\n#, c-format\nmsgid \"\"\n\"Could not update file '%s' with '%s' (temporary file may still exist): %s\\n\"\nmsgstr \"\"\n\"Kann Datei '%s' nicht mit '%s' aktualisieren (temporäre Datei kann noch \"\n\"existieren): %s\\n\"\n\n#: ../src/buildsystem/plain.vala:101 ../src/common/common.vala:634\n#, c-format\nmsgid \"Could not update file: %s\\n\"\nmsgstr \"Konnte Datei nicht aktualisieren: %s\\n\"\n\n#: ../guanako/guanako_helpers.vala:45\n#, c-format\nmsgid \"Could not update vapi files: %s\\n\"\nmsgstr \"Konnte Vapi-Dateien nicht aktualisieren: %s\\n\"\n\n#: ../src/dialogs/create_file.vala:107\n#, c-format\nmsgid \"Could not write to new file: %s\\n\"\nmsgstr \"Konnte neue Datei nicht beschreiben: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:781\n#, c-format\nmsgid \"Could not write to temporary file '%s': %s\\n\"\nmsgstr \"Konnte nicht in temporäre Datei '%s' schreiben: %s\\n\"\n\n#: ../src/main.vala:72\n#, c-format\nmsgid \"Couldn't load Valama project: %s\\n\"\nmsgstr \"Konnte Valama-Projekt nicht laden: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:340\n#, c-format\nmsgid \"Couldn't load layout file: %s\\n\"\nmsgstr \"Konnte Layout-Datei nicht laden: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:354\n#, c-format\nmsgid \"Couldn't load layout: %s\\n\"\nmsgstr \"Konnte Layout nicht laden: %s\\n\"\n\n#: ../src/dialogs/create_project.vala:639\n#, c-format\nmsgid \"Couldn't load new project: %s\\n\"\nmsgstr \"Konnte neues Projekt nicht laden: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:373\n#, c-format\nmsgid \"Couldn't save layout to file: %s\\n\"\nmsgstr \"Konnte Layout nicht speichern: %s\\n\"\n\n#: ../src/project/project.vala:2010\n#, c-format\nmsgid \"Couldn't save project file: %s\\n\"\nmsgstr \"Konnte Projektdatei nicht speichern: %s\\n\"\n\n#: ../build/data/valama.desktop.in.h:3\nmsgid \"Create Vala projects.\"\nmsgstr \"Vala-Projekte erstellen\"\n\n#: ../src/ui_main.vala:492\nmsgid \"Create new file\"\nmsgstr \"Neue Datei erstellen\"\n\n#: ../src/ui/welcome_screen.vala:287\nmsgid \"Create new project\"\nmsgstr \"Neues Projekt erstellen\"\n\n#. TRANSLATORS:\n#. E.g.: \"Create new subdirectory (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:54\n#, c-format\nmsgid \"Create new subdirectory (%s)\"\nmsgstr \"Neues Unterverzeichnis erstellen (%s)\"\n\n#: ../src/ui/welcome_screen.vala:293\nmsgid \"Create project\"\nmsgstr \"Projekt erstellen\"\n\n#: ../src/ui/current_file_structure.vala:39 ../src/ui_main.vala:193\nmsgid \"Current file\"\nmsgstr \"Aktuelle Datei\"\n\n#. TRANSLATORS:\n#. \"Symbol\" in programming context as primitive data type used to name\n#. variables and functions.\n#: ../src/ui/current_symbol.vala:38 ../src/ui_main.vala:205\nmsgid \"Current symbol\"\nmsgstr \"Aktuelles Symbol\"\n\n#. TRANSLATORS: Uppercase for variables in command line options.\n#: ../src/common/args.vala:39 ../src/common/args.vala:40\nmsgid \"DIRECTORY\"\nmsgstr \"VERZEICHNIS\"\n\n#: ../src/project/project.vala:1133\n#, c-format\nmsgid \"Data directory does not exist: %s\\n\"\nmsgstr \"Datenverzeichnis existiert nicht: %s\\n\"\n\n#: ../src/project/project.vala:1131\n#, c-format\nmsgid \"Data file does not exist: %s\\n\"\nmsgstr \"Datendatei existiert nicht: %s\\n\"\n\n#. TRANSLATORS:\n#. \"Data files\" means the file is neighter a (Vala) source file nor a\n#. build system file - it's an other file or data file.\n#: ../src/ui/project_browser.vala:296\nmsgid \"Data files\"\nmsgstr \"Andere Dateien\"\n\n#: ../src/project/project.vala:94\nmsgid \"Debug\"\nmsgstr \"Debug\"\n\n#: ../guanako/reporter.vala:41\nmsgid \"Deprecated\"\nmsgstr \"Veraltet\"\n\n#: ../src/dialogs/create_project.vala:70\nmsgid \"Detailed information\"\nmsgstr \"Ausführliche informationen\"\n\n#. TRANSLATORS:\n#. A \"define\" is a preprocessor symbol which is either set or unset:\n#. #if FOOBAR || BARFOO   <- where FOOBAR and BARFOO are defines\n#: ../src/buildsystem/base.vala:170\n#, c-format\nmsgid \"Disable define: %s\\n\"\nmsgstr \"Deaktiviere Define: %s\\n\"\n\n#: ../src/ui/reports.vala:116\nmsgid \"Display all\"\nmsgstr \"Alle anzeigen\"\n\n#: ../src/common/args.vala:35\nmsgid \"Display version number.\"\nmsgstr \"Versionsnummer anzeigen.\"\n\n#: ../src/ui/project_browser.vala:517\nmsgid \"Do you want to delete this file?\"\nmsgstr \"Soll diese Datei gelöscht werden?\"\n\n#: ../src/dialogs/create_file.vala:86\nmsgid \"Don't let this field empty. Name a file.\"\nmsgstr \"Feld muss mit einem Dateinamen ausgefüllt werden.\"\n\n#: ../src/ui_main.vala:326\nmsgid \"Edit\"\nmsgstr \"Bearbeiten\"\n\n#: ../src/buildsystem/base.vala:160\n#, c-format\nmsgid \"Enable define for package '%s': %s\\n\"\nmsgstr \"Aktiviere Define für Paket '%s': %s\\n\"\n\n#: ../guanako/guanako.vala:723\n#, c-format\nmsgid \"Entry point '%s' not found in syntax file. Trying to segfault me, huh??\"\nmsgstr \"\"\n\"Einstiegspunkt '%s' in der Syntaxdatei wurde nicht gefunden. Erlaubt sich da \"\n\"jemand einen Scherz??\"\n\n#: ../src/ui/reports.vala:79 ../guanako/reporter.vala:37\nmsgid \"Error\"\nmsgstr \"Fehler\"\n\n#: ../src/common/common.vala:737\n#, c-format\nmsgid \"Error: \"\nmsgstr \"Fehler:\"\n\n#: ../src/common/args.vala:58\n#, c-format\nmsgid \"Error: %s\\n\"\nmsgstr \"Fehler: %s\\n\"\n\n#. TRANSLATORS: Notes aren't notices but comments/remarks.\n#: ../src/ui/reports.vala:215\n#, c-format\nmsgid \"\"\n\"Errors: %d, Warnings: %d, Deprecated: %d, Experimental: %d, Notes: %d  -  \"\n\"%d\\n\"\nmsgstr \"\"\n\"Fehler: %d, Warungen: %d, Veraltet: %i, Experimentell: %i, Bemerkungen: %i - \"\n\"%i\\n\"\n\n#: ../src/ui_main.vala:438 ../src/ui_main.vala:550\nmsgid \"Execute\"\nmsgstr \"Ausführen\"\n\n#: ../guanako/reporter.vala:43\nmsgid \"Experimental\"\nmsgstr \"Experimentell\"\n\n#: ../src/common/args.vala:36 ../src/common/args.vala:43\nmsgid \"FILE\"\nmsgstr \"DATEI\"\n\n#: ../src/ui/build_output.vala:102\nmsgid \"Failed\"\nmsgstr \"Fehlgeschlagen\"\n\n#: ../src/ui/breakpoints.vala:61 ../src/ui/reports.vala:67\n#: ../src/ui_main.vala:289\nmsgid \"File\"\nmsgstr \"Datei\"\n\n#: ../src/project/project.vala:1024 ../src/project/project.vala:1093\nmsgid \"File already a data file. Skip it.\\n\"\nmsgstr \"Datei existiert bereits als Datendatei. Überspringe sie.\\n\"\n\n#: ../src/project/project.vala:1090 ../src/project/project.vala:1145\nmsgid \"File already a source file. Skip it.\\n\"\nmsgstr \"Datei existiert bereits als Quelldatei. Überspringe sie.\\n\"\n\n#: ../src/project/project.vala:1021 ../src/project/project.vala:1148\nmsgid \"File already registered for build system. Skip it.\\n\"\nmsgstr \"Datei bereits als Build-System-Datei registriert. Überspringe sie.\\n\"\n\n#: ../src/common/common.vala:422\nmsgid \"File copying cancelled.\"\nmsgstr \"Kopieroperation abgebrochen.\"\n\n#: ../src/project/project_templates.vala:215\nmsgid \"File does not contain enough information\"\nmsgstr \"Datei enthält nicht genug Infomrationen\"\n\n#: ../src/project/project.vala:1270 ../src/project/project.vala:1626\n#: ../src/ui_main.vala:748 ../guanako/stylecheck.vala:366\nmsgid \"File does not contain enough information.\"\nmsgstr \"Datei enthält nicht genügend Informationen.\"\n\n#: ../guanako/stylecheck.vala:355\nmsgid \"File does not exist.\"\nmsgstr \"Datei existiert nicht.\"\n\n#: ../src/project/project.vala:2045\nmsgid \"File is modified. Do you want to save it?\"\nmsgstr \"Datei wurde verändert. Soll sie gespeichert werden?\"\n\n#. TRANSLATORS:\n#. File has to be registered with Valama (loaded) to check if the\n#. buffer was modified.\n#: ../src/project/project.vala:2030\n#, c-format\nmsgid \"File not registered in project to check if buffer is dirty: %s\\n\"\nmsgstr \"\"\n\"Datei nicht im Projekt registriert, um auf einen veränderten Puffer zu \"\n\"prüfen: %s\\n\"\n\n#: ../src/common/common.vala:631\n#, c-format\nmsgid \"File saved: %s\\n\"\nmsgstr \"Datei gespeichert: %s\\n\"\n\n#. TRANSLATORS:\n#. Focus docking widget (Gdl.DockItem): long name / file name (short name)\n#: ../src/ui_main.vala:797\n#, c-format\nmsgid \"Focus dock item: %s (%s)\\n\"\nmsgstr \"Dock-Item fokusieren: %s (%s)\\n\"\n\n#: ../src/project/project.vala:1680\nmsgid \"Following files are modified. Do you want to save them?\"\nmsgstr \"Folgende Dateien wurde geändert. Sollen sie gespeichert werden?\"\n\n#: ../src/common/args.vala:42\nmsgid \"Force loading of possibly incompatible template or project files.\"\nmsgstr \"\"\n\"Erzwinge Laden einer möglicherweise inkompatiblen Vorlage- oder \"\n\"Projektdateien.\"\n\n#: ../src/project/project.vala:1088\n#, c-format\nmsgid \"Found build system file: %s\\n\"\nmsgstr \"Build-System-Datei gefunden: %s\\n\"\n\n#: ../src/project/project.vala:1143\n#, c-format\nmsgid \"Found data file: %s\\n\"\nmsgstr \"Datendatei gefunden: %s\\n\"\n\n#: ../src/project/project.vala:1018\n#, c-format\nmsgid \"Found source file: %s\\n\"\nmsgstr \"Quelldatei gefunden: %s\\n\"\n\n#: ../src/dialogs/about.vala:45\n#, c-format\nmsgid \"French\"\nmsgstr \"Französisch\"\n\n#: ../src/dialogs/about.vala:46\n#, c-format\nmsgid \"German\"\nmsgstr \"Deutsch\"\n\n#: ../src/dialogs/about.vala:57\nmsgid \"Github project page\"\nmsgstr \"Github Projektseite\"\n\n#: ../guanako/guanako.vala:1116\nmsgid \"Guanako Completion\"\nmsgstr \"Guanako-Autovervollständigung\"\n\n#: ../src/common/args.vala:36\nmsgid \"Guanako syntax file.\"\nmsgstr \"Guanak-Syntaxdatei.\"\n\n#: ../src/ui_main.vala:464\nmsgid \"Help\"\nmsgstr \"Hilfe\"\n\n#: ../build/data/org.valama.gschema.xml.h:1\nmsgid \"Horizontal window size\"\nmsgstr \"Horizontale Fenstergröße\"\n\n#: ../build/data/valama.desktop.in.h:2\nmsgid \"IDE\"\nmsgstr \"IDE\"\n\n#: ../src/ui_main.vala:529\nmsgid \"IDE mode\"\nmsgstr \"IDE-Modus\"\n\n#. TRANSLATORS: insert input mode\n#: ../src/ui/source_viewer.vala:396 ../src/ui/source_viewer.vala:400\nmsgid \"INS\"\nmsgstr \"EINF\"\n\n#. TRANSLATORS: This is a technical information. So you might not\n#. want to translate \"IOChannel\".\n#: ../src/buildsystem/base.vala:590\n#, c-format\nmsgid \"IOChannel operation failed: %s\\n\"\nmsgstr \"IOChannel-Operation fehlgeschlagen: %s\\n\"\n\n#: ../src/project/project.vala:1282\n#, c-format\nmsgid \"Ignore project file loading error: %s\\n\"\nmsgstr \"Ignoriere Ladefehler der Projektdatei: %s\\n\"\n\n#: ../src/project/project_templates.vala:324\n#: ../src/project/project_templates.vala:331\n#, c-format\nmsgid \"Ignore substitution with missing '%s' property line %hu.\"\nmsgstr \"Ignoriere Ersetzen mit fehlender Eigenschaft '%s' in Zeile %hu.\"\n\n#: ../src/project/project_templates.vala:228\n#, c-format\nmsgid \"Ignore template file loading error: %s\\n\"\nmsgstr \"Ignoriere Vorlagendatei-Ladefehler: %s\\n\"\n\n#. TRANSLATORS: Context: ... for package `foobar' <= 0.42 found: ...\n#: ../src/buildsystem/base.vala:352\n#, c-format\nmsgid \"Incompatible version for package '%s' %s %s found: %s\\n\"\nmsgstr \"Inkompatible Version für Paket '%s' %s %s gefunden: %s\\n\"\n\n#: ../src/project/project.vala:709\nmsgid \"Initial buffer update\"\nmsgstr \"Erstmaliges Puffer-Update\"\n\n#: ../src/common/ui_helpers.vala:110\n#, c-format\nmsgid \"Invalid character: '%s' Please choose one from: %s\"\nmsgstr \"Ungültiges Zeichen: '%s' Bitte aus folgenden Zeichen wählen: %s\"\n\n#: ../src/ui/source_viewer.vala:335\nmsgid \"Language: \"\nmsgstr \"Sprache:\"\n\n#: ../src/project/build_project.vala:272\n#, c-format\nmsgid \"Launching application failed: %s\\n\"\nmsgstr \"Starten der Anwendung fehlgeschlagen: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:375\n#, c-format\nmsgid \"Layout '%s' saved to file: %s\\n\"\nmsgstr \"Layout '%s' in Datei gespeichert: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:329 ../src/common/ui_helpers.vala:331\n#, c-format\nmsgid \"Layout file does not exist: %s\\n\"\nmsgstr \"Layout-Datei existiert nicht: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:356\n#, c-format\nmsgid \"Layout loaded: %s\\n\"\nmsgstr \"Layout geladen: %s\\n\"\n\n#: ../src/common/ui_helpers.vala:338\n#, c-format\nmsgid \"Layouts loaded from file: %s\\n\"\nmsgstr \"Layouts von Datei geladen: %s\\n\"\n\n#: ../src/ui/breakpoints.vala:55 ../src/ui/search.vala:40\n#: ../src/ui/stylechecker.vala:35\nmsgid \"Line\"\nmsgstr \"Zeile\"\n\n#. TRANSLATORS: Short name for Line X, Column Y\n#: ../src/ui/source_viewer.vala:505\n#, c-format\nmsgid \"Ln %d, Col %d\"\nmsgstr \"Z. %d, Sp. %d\"\n\n#: ../src/ui_main.vala:736\n#, c-format\nmsgid \"Load Ui meta information: %s\\n\"\nmsgstr \"Lade Benutzeroberflächen-Metainformationen: %s\\n\"\n\n#: ../src/common/args.vala:44\nmsgid \"Load default layout.\"\nmsgstr \"Lade Standardlayout.\"\n\n#: ../src/common/ui_helpers.vala:334\nmsgid \"Load layout...\\n\"\nmsgstr \"Lade Layout...\\n\"\n\n#: ../src/project/project.vala:1800\n#, c-format\nmsgid \"Load new buffer: %s\\n\"\nmsgstr \"Lade neuen Buffer: %s\\n\"\n\n#: ../src/main.vala:168\n#, c-format\nmsgid \"Load pixmap: %s\\n\"\nmsgstr \"Lade Pixmap: %s\\n\"\n\n#: ../src/project/project.vala:557\n#, c-format\nmsgid \"Load project file: %s\\n\"\nmsgstr \"Projektdatei wird geladen: %s\\n\"\n\n#: ../src/common/args.vala:45\nmsgid \"Load project from file.\"\nmsgstr \"Lade Projektdatei von Datei.\"\n\n#: ../src/project/project.vala:1614\n#, c-format\nmsgid \"Load project meta information: %s\\n\"\nmsgstr \"Lade Projekt-Metainformationen: %s\\n\"\n\n#: ../guanako/guanako.vala:500\n#, c-format\nmsgid \"Load syntax file: %s\\n\"\nmsgstr \"Lade Syntaxdatei: %s\\n\"\n\n#: ../src/ui/symbol_browser.vala:64 ../src/ui/symbol_browser.vala:68\n#: ../src/ui/symbol_browser.vala:72 ../src/ui/symbol_browser.vala:76\nmsgid \"Loading\"\nmsgstr \"Laden\"\n\n#: ../src/dialogs/create_project.vala:561 ../src/ui/reports.vala:73\n#: ../src/ui/welcome_screen.vala:670\nmsgid \"Location\"\nmsgstr \"Ort\"\n\n#. TRANSLATORS: Lock user interface elements to prevent moving them around.\n#: ../src/ui_main.vala:363\nmsgid \"Lock elements\"\nmsgstr \"Sperre Elemente\"\n\n#: ../guanako/guanako.vala:835 ../guanako/guanako.vala:847\n#: ../guanako/guanako.vala:865 ../guanako/guanako.vala:935\n#, c-format\nmsgid \"Malformed rule: '%s'\\n\"\nmsgstr \"Fehler in Regel: '%s'\\n\"\n\n#: ../src/dialogs/missing_packages.vala:27\nmsgid \"Missing packages\"\nmsgstr \"Fehlende Pakete\"\n\n#: ../src/dialogs/create_project.vala:155\nmsgid \"Missing packages: \"\nmsgstr \"Fehlende Pakete: \"\n\n#: ../src/common/common.vala:485\n#, c-format\nmsgid \"Move from '%s' to '%s'.\\n\"\nmsgstr \"Von '%s' nach '%s' verschieben.\\n\"\n\n#: ../src/common/common.vala:359\nmsgid \"Moving finished.\\n\"\nmsgstr \"Verschiebevorgang beendet.\\n\"\n\n#: ../src/ui/source_viewer.vala:299 ../src/ui/source_viewer.vala:630\nmsgid \"New document\"\nmsgstr \"Neues Dokument\"\n\n#: ../src/dialogs/create_project.vala:565 ../src/ui/welcome_screen.vala:675\nmsgid \"New project location\"\nmsgstr \"Neuer Projektort\"\n\n#: ../src/ui/welcome_screen.vala:480\nmsgid \"Next\"\nmsgstr \"Weiter\"\n\n#: ../src/dialogs/about.vala:49\nmsgid \"Next generation Vala IDE\"\nmsgstr \"Next generation Vala IDE\"\n\n#. TRANSLATORS: E.g.: No `glib-2.0' package found.\n#: ../src/buildsystem/plain.vala:54\n#, c-format\nmsgid \"No '%s' package found.\\n\"\nmsgstr \"Paket '%s' nicht gefunden.\\n\"\n\n#: ../src/ui/current_symbol.vala:48 ../src/ui/current_symbol.vala:75\nmsgid \"No current symbol\"\nmsgstr \"Kein aktuelles Symbol\"\n\n#: ../src/buildsystem/cmake.vala:216 ../src/buildsystem/cmake.vala:250\nmsgid \"No data to clean.\\n\"\nmsgstr \"Nichts zum Aufräumen.\\n\"\n\n#. TRANSLATORS:\n#. A \"capturing group\" is used to group (and possibly mark) expressions\n#. within regular expressions for later use. Usually they are numbered\n#. so we can access them over an index.\n#: ../guanako/stylecheck.vala:456\n#, c-format\nmsgid \"No default capturing group ('matchgroup'). Set it to 0: %s\\n\"\nmsgstr \"Keine Standardfiltergruppe gewählt. Setze sie auf 0: %s\\n\"\n\n#: ../src/project/project.vala:1998\nmsgid \"No file selected.\\n\"\nmsgstr \"Keine Datei ausgewählt.\\n\"\n\n#: ../src/project/project.vala:1358\n#, c-format\nmsgid \"No packages to choose between: line %hu\\n\"\nmsgstr \"Keine Pakete zum Auswählen gegeben: Zeile %hu\\n\"\n\n#: ../src/ui/welcome_screen.vala:406\nmsgid \"No recent projects\"\nmsgstr \"Keine zuletzt geöffneten Projekte\"\n\n#: ../src/ui/source_viewer.vala:574\n#, c-format\nmsgid \"No such file found in opened buffers: %s\\n\"\nmsgstr \"Keine solche Datei in geöffneten Puffern gefunden: %s\\n\"\n\n#: ../src/common/common.vala:223\nmsgid \"No such file.\"\nmsgstr \"Datei nicht vorhanden.\"\n\n#: ../guanako/guanako.vala:119\n#, c-format\nmsgid \"Not a valid Vala version, will  not set VALA_X_Y defines: %s\\n\"\nmsgstr \"Keine gültige Vala-Version, setze nicht VALA_X_Y-Defines: %s\\n\"\n\n#: ../src/common/common.vala:310\n#, c-format\nmsgid \"Not enough space available: %lld < %lld\"\nmsgstr \"Nicht genügend freier Speicherplatz verfügbar: %lld < %lld\"\n\n#: ../guanako/reporter.vala:45\nmsgid \"Note\"\nmsgstr \"Bemerkung\"\n\n#. TRANSLATORS: overwrite input mode\n#: ../src/ui/source_viewer.vala:394 ../src/ui/source_viewer.vala:400\nmsgid \"OVR\"\nmsgstr \"ÜBS\"\n\n#: ../src/dialogs/project_settings.vala:27 ../src/ui/welcome_screen.vala:299\n#: ../src/ui/welcome_screen.vala:304 ../src/ui_main.vala:300\nmsgid \"Open project\"\nmsgstr \"Projekt öffnen\"\n\n#: ../src/ui/welcome_screen/main_screen.vala:108\n#, fuzzy\nmsgid \"Other project...\"\nmsgstr \"Projekt öffnen\"\n\n#: ../src/common/args.vala:41\nmsgid \"Output debug information.\"\nmsgstr \"Debug-Information ausgeben.\"\n\n#. TRANSLATORS:\n#. That means we know \"`package' >= \". Something is missing, isn't it?\n#: ../src/project/project.vala:2193\n#, c-format\nmsgid \"Package '%s' has relation information but no version: \"\nmsgstr \"Paket '%s' hat eine Relation, aber zu keiner Version:\"\n\n#: ../src/project/project.vala:942 ../src/project/project.vala:959\n#, c-format\nmsgid \"Package '%s' not in list, skip it.\\n\"\nmsgstr \"Paket '%s' nicht in der Liste, überspringe es.\\n\"\n\n#: ../src/dialogs/create_project.vala:419 ../src/ui/project_browser.vala:300\n#: ../src/ui/project_browser.vala:338\nmsgid \"Packages\"\nmsgstr \"Pakete\"\n\n#: ../guanako/guanako.vala:966\n#, c-format\nmsgid \"Parameter '%s' not found in '%s'\\n\"\nmsgstr \"Parameter '%s' nicht gefunden in '%s'\\n\"\n\n#: ../src/completion_provider.vala:252\nmsgid \"Parameters:\\n\"\nmsgstr \"Parameter:\\n\"\n\n#: ../src/common/args.vala:43\nmsgid \"Path to layout file.\"\nmsgstr \"Pfad zur Layout-Datei.\"\n\n#: ../src/main.vala:151\nmsgid \"Pixmap directory does not exist. No application icons can be used.\\n\"\nmsgstr \"\"\n\"Pixmap-Verzeichnis existiert nicht. Es können keine Anwendungssymbole \"\n\"verwendet werden.\\n\"\n\n#: ../src/main.vala:174\n#, c-format\nmsgid \"Pixmap loading failed: %s\\n\"\nmsgstr \"Laden des Pixmaps fehlgeschlagen: %s\\n\"\n\n#: ../src/ui/source_viewer.vala:53\nmsgid \"Plain text\"\nmsgstr \"Klartext\"\n\n#. TRANSLATORS: Very important string ;) . Thanks btw. for your translation!\n#: ../src/common/common.vala:742\n#, c-format\nmsgid \"Please report a bug!\\n\"\nmsgstr \"Bitte melden Sie diesen Fehler!\\n\"\n\n#: ../src/buildsystem/plain.vala:91\n#, c-format\nmsgid \"Prepare file for FrankenStein: %s\\n\"\nmsgstr \"Datei für FrankenStein vorbereiten: %s\\n\"\n\n#: ../src/ui/current_file_structure.vala:49\nmsgid \"Private\"\nmsgstr \"Privat\"\n\n#: ../src/dialogs/project_settings.vala:116 ../src/ui/project_browser.vala:41\n#: ../src/ui_main.vala:380\nmsgid \"Project\"\nmsgstr \"Projekt\"\n\n#: ../src/buildsystem/base.vala:374\n#, c-format\nmsgid \"Project already built but executable does not exist: %s\\n\"\nmsgstr \"Projekt schon kompiliert, aber ausführbare Datei existiert nicht: %s\\n\"\n\n#: ../src/ui_main.vala:173\nmsgid \"Project browser\"\nmsgstr \"Projektbrowser\"\n\n#: ../guanako/stylecheck.vala:374\n#, c-format\nmsgid \"Project file to old: %s < %s\\n\"\nmsgstr \"Projektdatei zu alt: %s < %s\\n\"\n\n#: ../src/project/project.vala:1276\n#, c-format\nmsgid \"Project file too old: %s < %s\"\nmsgstr \"Projektdatei zu alt: %s < %s\"\n\n#: ../src/dialogs/create_project.vala:540\n#: ../src/dialogs/create_project.vala:549 ../src/ui/welcome_screen.vala:651\n#: ../src/ui/welcome_screen.vala:658\nmsgid \"Project name\"\nmsgstr \"Projektname\"\n\n#: ../src/dialogs/project_settings.vala:123\nmsgid \"Project name:\"\nmsgstr \"Projektname:\"\n\n#: ../src/dialogs/project_settings.vala:101\nmsgid \"Project settings\"\nmsgstr \"Projekteinstellungen\"\n\n#. TRANSLATORS: Collector for completion proposals.\n#. This string is normally not visible.\n#: ../guanako/guanako.vala:570\nmsgid \"Proposal collector\"\nmsgstr \"Vorschlagsammler\"\n\n#: ../src/ui/welcome_screen.vala:312\nmsgid \"Quit\"\nmsgstr \"Schließen\"\n\n#: ../src/ui_main.vala:406\nmsgid \"Rebuild\"\nmsgstr \"Rekompilieren\"\n\n#: ../src/ui/breakpoints.vala:107\nmsgid \"Received invalid ID. Try to rebuild.\"\nmsgstr \"Ungültige ID empfangen. Erneutes Kompilieren könnte helfen.\"\n\n#: ../src/ui/welcome_screen.vala:279\nmsgid \"Recent projects\"\nmsgstr \"Zuletzt geöffnete Projekte\"\n\n#: ../src/ui_main.vala:522\nmsgid \"Redo last change\"\nmsgstr \"Letzte Änderung wiederholen\"\n\n#: ../src/project/project.vala:96\nmsgid \"Release\"\nmsgstr \"Release\"\n\n#: ../src/project/project.vala:1110\n#, c-format\nmsgid \"Remove build system file: %s\\n\"\nmsgstr \"Entferne Build-System-Datei: %s\\n\"\n\n#: ../src/project/project.vala:1165\n#, c-format\nmsgid \"Remove data file: %s\\n\"\nmsgstr \"Entferne Datendatei: %s\\n\"\n\n#: ../src/ui/project_browser.vala:204\nmsgid \"Remove file (from disk)\"\nmsgstr \"Entferne Datei (von Festplatte)\"\n\n#: ../src/ui/project_browser.vala:197\nmsgid \"Remove package\"\nmsgstr \"Entferne Paket\"\n\n#: ../src/project/project.vala:940 ../src/project/project.vala:957\n#, c-format\nmsgid \"Remove package: %s\\n\"\nmsgstr \"Entferne Paket: %s\\n\"\n\n#: ../src/project/project.vala:1053\nmsgid \"Remove source file\"\nmsgstr \"Entferne Quelldatei\"\n\n#: ../src/project/project.vala:1050\n#, c-format\nmsgid \"Remove source file: %s\\n\"\nmsgstr \"Entferne Quelldatei: %s\\n\"\n\n#: ../src/ui_main.vala:169\nmsgid \"Report widget\"\nmsgstr \"Reporter\"\n\n#. TRANSLATORS:\n#. Returns a return value (programming).\n#: ../src/completion_provider.vala:255\nmsgid \"Returns:\\n\"\nmsgstr \"Rückgabe:\\n\"\n\n#: ../src/ui_main.vala:432\nmsgid \"Run\"\nmsgstr \"Ausführen\"\n\n#. TRANSLATORS: E.g. \"Run project browser update!\"\n#: ../src/ui/breakpoints.vala:230 ../src/ui/current_file_structure.vala:102\n#: ../src/ui/current_symbol.vala:70 ../src/ui/project_browser.vala:275\n#: ../src/ui/reports.vala:154 ../src/ui/search.vala:245\n#: ../src/ui/source_viewer.vala:624 ../src/ui/symbol_browser.vala:120\n#, c-format\nmsgid \"Run %s update!\\n\"\nmsgstr \"Aktualisierung von %s wird gestartet!\\n\"\n\n#: ../src/common/args.vala:59\n#, c-format\nmsgid \"Run '%s --help' to see a full list of available command line options.\\n\"\nmsgstr \"\"\n\"'%s --help' ausführen, um eine vollständige Liste der verfügbaren \"\n\"Kommandozeilenoptionen zu sehen.\\n\"\n\n#: ../src/ui_main.vala:552\nmsgid \"Run application\"\nmsgstr \"Anwendung ausführen\"\n\n#: ../src/ui/build_output.vala:80\nmsgid \"Running...\"\nmsgstr \"Kompiliere...\"\n\n#: ../src/ui_main.vala:718\n#, c-format\nmsgid \"Save Ui meta information: %s\\n\"\nmsgstr \"Speichere Benutzeroberflächen-Metainformation: %s\\n\"\n\n#: ../src/ui_main.vala:308\nmsgid \"Save all\"\nmsgstr \"Alles speichern\"\n\n#: ../src/ui_main.vala:504\nmsgid \"Save current file\"\nmsgstr \"Aktuelle Datei speichern\"\n\n#: ../src/ui_main.vala:544\nmsgid \"Save current file and build project\"\nmsgstr \"Aktuelle Datei speichern und Projekt kompilieren\"\n\n#: ../src/project/project.vala:1496\nmsgid \"Save project file.\\n\"\nmsgstr \"Speichere Projektdatei.\\n\"\n\n#: ../src/project/project.vala:1597\n#, c-format\nmsgid \"Save project meta information: %s\\n\"\nmsgstr \"Speichere Projekt-Metainformationen: %s\\n\"\n\n#: ../src/ui/search.vala:59 ../src/ui_main.vala:185\nmsgid \"Search\"\nmsgstr \"Suchen\"\n\n#: ../src/ui/welcome_screen.vala:620\nmsgid \"Select Valama project file\"\nmsgstr \"Valama-Projektdatei auswählen\"\n\n#: ../src/ui/project_browser.vala:325\nmsgid \"Select new packages\"\nmsgstr \"Zusätzliche Pakete auswählen\"\n\n#: ../src/dialogs/create_project.vala:193\nmsgid \"Select template\"\nmsgstr \"Projektvorlage auswählen\"\n\n#: ../src/ui/project_browser.vala:100 ../src/ui_main.vala:386\nmsgid \"Settings\"\nmsgstr \"Einstellungen\"\n\n#: ../src/ui_main.vala:355\nmsgid \"Show application output\"\nmsgstr \"Anwendungsausgabe anzeigen\"\n\n#: ../src/ui_main.vala:356\nmsgid \"Show breakpoints\"\nmsgstr \"Haltepunkte anzeigen\"\n\n#: ../src/ui_main.vala:354\nmsgid \"Show build output\"\nmsgstr \"Kompilierausgabe anzeigen\"\n\n#: ../src/ui_main.vala:357\nmsgid \"Show current file structure\"\nmsgstr \"Aktuelle Dateistruktur anzeigen\"\n\n#: ../src/ui_main.vala:360\nmsgid \"Show current symbol\"\nmsgstr \"Aktuelles Symbol anzeigen\"\n\n#: ../src/ui_main.vala:353\nmsgid \"Show project browser\"\nmsgstr \"Projektbrowser anzeigen\"\n\n#: ../src/ui_main.vala:352\nmsgid \"Show reports\"\nmsgstr \"Reporter anzeigen\"\n\n#: ../src/ui_main.vala:351\nmsgid \"Show search\"\nmsgstr \"Suche anzeigen\"\n\n#: ../src/ui_main.vala:358\nmsgid \"Show style checker\"\nmsgstr \"Style-Checker anzeigen\"\n\n#: ../src/ui_main.vala:359\nmsgid \"Show symbol browser\"\nmsgstr \"Symbolbrowser anzeigen\"\n\n#: ../src/common/common.vala:443\n#, c-format\nmsgid \"Skip %s\\n\"\nmsgstr \"Überspringe %s\\n\"\n\n#: ../src/project/project.vala:1737 ../src/project/project.vala:1747\n#, c-format\nmsgid \"Skip '%s' choice.\\n\"\nmsgstr \"Überspringe '%s'-Auswahl.\\n\"\n\n#: ../src/project/project.vala:1035 ../src/project/project.vala:1097\n#: ../src/project/project.vala:1152\n#, c-format\nmsgid \"Skip already added file: %s\\n\"\nmsgstr \"Überspringe bereits hinzugefügte Datei: %s\\n\"\n\n#: ../src/dialogs/project_settings.vala:88\n#, c-format\nmsgid \"Skip already loaded project: %s\\n\"\nmsgstr \"Überspringe bereits geladenes Projekt: %s\\n\"\n\n#: ../src/common/common.vala:455\n#, c-format\nmsgid \"Skip overwrite from '%s' to '%s'.\\n\"\nmsgstr \"Überspringe Überschreiben von '%s' nach '%s'.\\n\"\n\n#: ../src/project/project.vala:1008\n#, c-format\nmsgid \"Source directory does not exist: %s\\n\"\nmsgstr \"Quellverzeichnis existiert nicht: %s\\n\"\n\n#: ../src/project/project.vala:1006\n#, c-format\nmsgid \"Source file does not exist: %s\\n\"\nmsgstr \"Quelldatei existiert nicht: %s\\n\"\n\n#: ../src/project/project.vala:668\nmsgid \"Source file update\"\nmsgstr \"Quelldatei-Update\"\n\n#: ../src/dialogs/create_project.vala:473\nmsgid \"Source files\"\nmsgstr \"Quellen\"\n\n#: ../src/ui_main.vala:165\nmsgid \"Source view\"\nmsgstr \"Quellansicht\"\n\n#: ../src/ui/source_viewer.vala:470\nmsgid \"Source view id out of range.\\n\"\nmsgstr \"Quelldatei id außerhalb der Reichweite.\\n\"\n\n#: ../src/ui/project_browser.vala:285\nmsgid \"Sources\"\nmsgstr \"Quellen\"\n\n#: ../src/dialogs/create_project.vala:726\n#, c-format\nmsgid \"Substitute: '@%s@'%s -> '%s': %s\\n\"\nmsgstr \"Ersetze:  '@%s@'%s -> '%s': %s\\n\"\n\n#: ../src/ui/build_output.vala:98\nmsgid \"Succeeded\"\nmsgstr \"Erfolgreich\"\n\n#: ../src/dialogs/create_project.vala:363\nmsgid \"Supported Vala versions\"\nmsgstr \"Unterstützte Vala-Versionen\"\n\n#: ../src/ui/symbol_browser.vala:44\nmsgid \"Symbol\"\nmsgstr \"Symbol\"\n\n#: ../src/ui_main.vala:201\nmsgid \"Symbol browser\"\nmsgstr \"Symbolbrowser\"\n\n#: ../src/project/project_templates.vala:221\n#, c-format\nmsgid \"Template file '%s' too old: %s < %s\"\nmsgstr \"Vorlagendatei '%s' ist zu alt: %s < %s\"\n\n#: ../src/project/project_templates.vala:306\n#, c-format\nmsgid \"Template has no description: line %hu\"\nmsgstr \"Vorlage hat keine Beschreibung: Zeile %hu\"\n\n#: ../src/project/project_templates.vala:299\n#, c-format\nmsgid \"Template has no name: line %hu\"\nmsgstr \"Vorlage hat keinen Namen: Zeile %hu\"\n\n#: ../src/dialogs/create_project.vala:79\nmsgid \"Template information\"\nmsgstr \"Vorlageninformationen\"\n\n#: ../src/dialogs/create_project.vala:125\nmsgid \"Templates\"\nmsgstr \"Vorlagen\"\n\n#: ../src/common/args.vala:37\nmsgid \"Templates directory.\"\nmsgstr \"Vorlagenverzeichnis\"\n\n#: ../src/dialogs/missing_packages.vala:36\nmsgid \"The following vala packages are not available on your system:\\n\"\nmsgstr \"Folgende Vala-Pakete sind auf diesem System nicht verfügbar:\\n\"\n\n#: ../src/ui/breakpoints.vala:67\nmsgid \"Time\"\nmsgstr \"Zeit\"\n\n#. TRANSLATORS: Type in programming context as data type.\n#: ../src/ui/symbol_browser.vala:48\nmsgid \"Type\"\nmsgstr \"Typ\"\n\n#: ../guanako/stylecheck.vala:575 ../guanako/stylecheck.vala:616\n#, c-format\nmsgid \"Type not implemented yet: %s\\n\"\nmsgstr \"Typ noch nicht implementiert: %s\\n\"\n\n#: ../src/ui/project_browser.vala:546\n#, c-format\nmsgid \"Unable to delete source file '%s': %s\\n\"\nmsgstr \"Löschen von Quelldatei '%s' nicht möglich: %s\\n\"\n\n#: ../src/buildsystem/base.vala:361\n#, c-format\nmsgid \"Unable to guess package for define: %s\\n\"\nmsgstr \"Konnte kein Paket für Define '%s' erraten.\\n\"\n\n#: ../src/ui_main.vala:515\nmsgid \"Undo last change\"\nmsgstr \"Letzte Änderung rückgängig machen\"\n\n#: ../src/dialogs/create_project.vala:397\n#: ../src/dialogs/project_settings.vala:207\n#, c-format\nmsgid \"Unexpected enum value: %s: %d\\n\"\nmsgstr \"Unerwarteter Wert: %s: %d\\n\"\n\n#: ../src/ui/project_browser.vala:467\n#, c-format\nmsgid \"Unexpected enum value: %s: %s\\n\"\nmsgstr \"Unerwarteter Wert: %s: %s\\n\"\n\n#: ../src/common/common.vala:500 ../src/dialogs/about.vala:66\n#: ../src/project/project.vala:274 ../src/project/project_templates.vala:108\n#: ../src/ui/project_browser.vala:145 ../src/ui/project_browser.vala:210\n#: ../src/ui/project_browser.vala:471 ../src/ui/project_browser.vala:554\n#, c-format\nmsgid \"Unexpected enum value: %s: %u\\n\"\nmsgstr \"Unerwarteter Wert: %s: %u\\n\"\n\n#: ../src/project/project.vala:1690 ../src/project/project.vala:2057\n#, c-format\nmsgid \"Unexpected response value: %s - %u\"\nmsgstr \"Unerwarteter Antwortwert: %s: %u\"\n\n#: ../src/ui/reports.vala:192 ../src/ui/source_viewer.vala:213\n#, c-format\nmsgid \"Unknown ReportType: %s\\n\"\nmsgstr \"Unbekannter Reporter-Typ: %s\\n\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:413 ../src/ui/project_browser.vala:451\n#: ../src/ui/project_browser.vala:533\n#, c-format\nmsgid \"Unknown TreePath start to add a new file: %s\\n\"\nmsgstr \"Unbekannter TreePath-Start, um eine neue Datei hinzuzufügen: %s\\n\"\n\n#: ../src/project/project.vala:1650 ../src/ui_main.vala:776\n#, c-format\nmsgid \"Unknown attribute for '%s' line %hu: %s\\n\"\nmsgstr \"Unbekannter Wert für '%s' in Zeile %hu: %s\\n\"\n\n#: ../src/project/project.vala:1310 ../src/project/project.vala:1351\n#: ../src/project/project.vala:1366 ../src/project/project.vala:1380\n#: ../src/project/project.vala:1394 ../src/project/project.vala:1408\n#: ../src/project/project.vala:1422 ../src/project/project.vala:1436\n#: ../src/project/project.vala:1450 ../src/project/project.vala:1464\n#: ../src/project/project.vala:1470 ../src/project/project.vala:1654\n#: ../src/project/project_templates.vala:290\n#: ../src/project/project_templates.vala:352\n#: ../src/project/project_templates.vala:358 ../src/ui_main.vala:782\n#, c-format\nmsgid \"Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"Unbekannter Konfigurationswert in Zeile %hu: %s\\n\"\n\n#: ../src/buildsystem/base.vala:343\n#, c-format\nmsgid \"Unknown package version relation: %s - %s\\n\"\nmsgstr \"Unbekannte Paketversionrelation: %s - %s\\n\"\n\n#: ../src/project/project.vala:1332 ../src/project/project.vala:2182\n#: ../src/project/project_templates.vala:263\n#, c-format\nmsgid \"Unknown property for '%s' line %hu: %s\\n\"\nmsgstr \"Unbekannte Eigenschaft für '%s' in Zeile %hu: %s\\n\"\n\n#: ../src/buildsystem/base.vala:152\n#, c-format\nmsgid \"Unknown status: %d - %s\\n\"\nmsgstr \"Unbekannter Status: %d - %s\\n\"\n\n#: ../src/project/project_templates.vala:344\n#, c-format\nmsgid \"Unknown value for substitution property '%s' line %hu (assume '%s'): %s\"\nmsgstr \"\"\n\"Unbekannter Wert für Ersetzungseigenschaft '%s' in Zeile %hu (vermute '%s'): \"\n\"%s\"\n\n#: ../src/ui/project_browser.vala:304\nmsgid \"User interface files\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:4\nmsgid \"Vala;IDE;Development;\"\nmsgstr \"Vala;IDE;Entwicklung;Entwicklungsumgebung;\"\n\n#: ../src/main.vala:104\nmsgid \"Valama\"\nmsgstr \"Valama\"\n\n#: ../src/dialogs/project_settings.vala:42 ../src/ui/welcome_screen.vala:583\nmsgid \"Valama project files (*.vlp)\"\nmsgstr \"Valama-Projektdateien (*.vlp)\"\n\n#: ../src/buildsystem/base.vala:100\nmsgid \"Valama project not initialized\"\nmsgstr \"Valama-Projekt nicht initialisiert\"\n\n#: ../src/buildsystem/cmake.vala:46\nmsgid \"Valama project not initialized.\"\nmsgstr \"Valama-Projekt nicht initialisiert.\"\n\n#: ../guanako/guanako.vala:287 ../guanako/guanako.vala:300\n#, c-format\nmsgid \"Vapi found: %s\\n\"\nmsgstr \"Vapi gefunden: %s\\n\"\n\n#: ../guanako/guanako.vala:876\n#, c-format\nmsgid \"Variable '%s' not found! >%s<\\n\"\nmsgstr \"Variable '%s' nicht gefunden! >%s<\\n\"\n\n#: ../src/dialogs/project_settings.vala:151\nmsgid \"Version:\"\nmsgstr \"Version:\"\n\n#: ../build/data/org.valama.gschema.xml.h:2\nmsgid \"Vertical window size\"\nmsgstr \"Vertikale Fenstergröße\"\n\n#: ../src/ui_main.vala:346\nmsgid \"View\"\nmsgstr \"Ansicht\"\n\n#: ../src/dialogs/project_settings.vala:38\nmsgid \"View all files (*)\"\nmsgstr \"Alle Dateien (*)\"\n\n#: ../guanako/reporter.vala:39\nmsgid \"Warning\"\nmsgstr \"Warnung\"\n\n#: ../src/common/common.vala:733\n#, c-format\nmsgid \"Warning: \"\nmsgstr \"Warnung:\"\n\n#. TRANSLATORS: This is a technical information. You migth not\n#. want to translate \"CheckType\".\n#: ../guanako/stylecheck.vala:473\n#, c-format\nmsgid \"Warning: No CheckType found, assume 'GLOBAL'.\\n\"\nmsgstr \"Warnung: Kein CheckType gefunden, nehme 'GLOBAL' an.\\n\"\n\n#: ../guanako/stylecheck.vala:467\n#, c-format\nmsgid \"Warning: No description found.\\n\"\nmsgstr \"Warnung: Keine Beschreibung gefunden.\\n\"\n\n#: ../guanako/stylecheck.vala:447\n#, c-format\nmsgid \"Warning: No regex to check.\\n\"\nmsgstr \"Warnung: Kein regulärer Ausdruck zum prüfen.\\n\"\n\n#: ../guanako/stylecheck.vala:397\n#, c-format\nmsgid \"Warning: Skip different description: '%s' - '%s'\\n\"\nmsgstr \"Warnung: Überspringe unterschiedliche Beschreibung: '%s' - '%s'\\n\"\n\n#: ../guanako/stylecheck.vala:437\n#, c-format\nmsgid \"Warning: Skip different match groups: '%d' - '%d'\\n\"\nmsgstr \"Warnung: Überspringe unterschiedliche Filtergruppen: '%d' - '%d'\\n\"\n\n#: ../guanako/stylecheck.vala:427\n#, c-format\nmsgid \"Warning: Skip different regexes: '%s' - '%s'\\n\"\nmsgstr \"\"\n\"Warnung: Überspringe unterschiedliche reguläre Ausdrücke: '%s' - '%s'\\n\"\n\n#: ../guanako/stylecheck.vala:410\n#, c-format\nmsgid \"Warning: Skip different type: '%s' - '%s'\\n\"\nmsgstr \"Warnung: Überspringe verschiedene Typen: '%s' - '%s'\\n\"\n\n#: ../guanako/stylecheck.vala:408\n#, c-format\nmsgid \"Warning: Unknown CheckType '%s', assume 'GLOBAL'.\\n\"\nmsgstr \"Warnung: Unbekannter CheckType '%s', nehme 'GLOBAL' an.\\n\"\n\n#: ../guanako/stylecheck.vala:619\n#, c-format\nmsgid \"Warning: Unknown CheckType: %s\\n\"\nmsgstr \"Warnung: Unbekannter CheckType: %s\\n\"\n\n#: ../guanako/stylecheck.vala:442 ../guanako/stylecheck.vala:461\n#, c-format\nmsgid \"Warning: Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"Warnung: Unbekannter Konfigurationswert in Zeile %hu: %s\\n\"\n\n#: ../guanako/guanako.vala:283 ../guanako/guanako.vala:296\n#, c-format\nmsgid \"Warning: Vapi for package %s not found.\\n\"\nmsgstr \"Warnung: Vapi für Paket %s nicht gefunden.\\n\"\n\n#: ../src/project/project.vala:1242\n#, c-format\nmsgid \"Will not add '%s' to file list: File not valid\\n\"\nmsgstr \"Werde '%s' nicht zur Dateiliste hinzufügen. Datei nicht gültig\\n\"\n\n#: ../src/common/args.vala:41\nmsgid \"[DEBUGLEVEL]\"\nmsgstr \"[DEBUGLEVEL]\"\n\n#: ../src/common/args.vala:45\nmsgid \"[FILE...]\"\nmsgstr \"[DATEI...]\"\n\n#: ../src/ui_main.vala:432\n#, fuzzy\nmsgid \"_Build\"\nmsgstr \"Kompiliere\"\n\n#: ../src/ui_main.vala:513\n#, fuzzy\nmsgid \"_Clean\"\nmsgstr \"Aufräumen\"\n\n#: ../src/ui_main.vala:417\n#, fuzzy\nmsgid \"_Project\"\nmsgstr \"Projekt\"\n\n#: ../src/ui_main.vala:422\n#, fuzzy\nmsgid \"_Settings\"\nmsgstr \"Einstellungen\"\n\n#. TRANSLATORS: Version relation: X > Y\n#: ../src/dialogs/create_project.vala:375\nmsgid \"after\"\nmsgstr \"nach\"\n\n#. TRANSLATORS: Version relation: X < Y\n#: ../src/dialogs/create_project.vala:387\nmsgid \"before\"\nmsgstr \"vor\"\n\n#: ../src/buildsystem/cmake.vala:166\nmsgid \"build command failed\"\nmsgstr \"Kompilierkommando fehlgeschlagen\"\n\n#. TRANSLATORS: Choice of different packages.\n#: ../src/project/project.vala:910\n#, c-format\nmsgid \"choice\"\nmsgstr \"Auswahl\"\n\n#: ../src/buildsystem/cmake.vala:226\nmsgid \"clean command failed\"\nmsgstr \"Kommando zum Aufräumen fehlgeschlagen\"\n\n#: ../src/buildsystem/cmake.vala:133\nmsgid \"configure command failed\"\nmsgstr \"Konfigurationskommando fehlgeschlagen\"\n\n#: ../src/buildsystem/base.vala:117\n#, c-format\nmsgid \"directory creation failed: %s\"\nmsgstr \"Anlegen eines neuen Verzeichnisses fehlgeschlagen: %s\"\n\n#: ../src/buildsystem/cmake.vala:260\n#, c-format\nmsgid \"distclean command failed: %s\"\nmsgstr \"Kommando zum vollständiges Aufräumen fehlgeschlagen: %s\"\n\n#: ../src/common/common.vala:525\nmsgid \"file does not exist\"\nmsgstr \"Datei existiert nicht.\"\n\n#: ../src/dialogs/create_file.vala:68\nmsgid \"filename\"\nmsgstr \"Dateiname\"\n\n#. TRANSLATORS:\n#. Context: Add new file to project (inside `foobar' directory)\n#: ../src/dialogs/create_file.vala:57\n#, c-format\nmsgid \"inside '%s' directory\"\nmsgstr \"in '%s'-Verzeichnis\"\n\n#: ../src/dialogs/create_file.vala:58\n#, c-format\nmsgid \"inside project root directory\"\nmsgstr \"in Projekt-Wurzelverzeichnis\"\n\n#: ../src/buildsystem/base.vala:385\nmsgid \"launching failed\"\nmsgstr \"Starten fehlgeschlagen\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:30\nmsgid \"make library\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:284\nmsgid \"no long description\"\nmsgstr \"keine ausführliche Beschreibung\"\n\n#: ../src/dialogs/create_project.vala:463\nmsgid \"no package required\"\nmsgstr \"kein Paket benötigt\"\n\n#: ../src/common/common.vala:552\nmsgid \"no regular file or directory\"\nmsgstr \"keine reguläre Datei oder Verzeichnis\"\n\n#: ../src/dialogs/create_project.vala:485\nmsgid \"no source files\"\nmsgstr \"keine Quelldateien\"\n\n#. TRANSLATORS: Context: Parameters: none\n#: ../src/completion_provider.vala:251\nmsgid \"none\"\nmsgstr \"keine\"\n\n#: ../src/dialogs/create_project.vala:437\nmsgid \"not available\"\nmsgstr \"nicht verfügbar\"\n\n#. TRANSLATORS: Version relation: X != Y\n#: ../src/dialogs/create_project.vala:394\nmsgid \"not supported\"\nmsgstr \"nicht unterstützt\"\n\n#: ../src/ui/welcome_screen/create_project_packages.vala:32\n#, fuzzy\nmsgid \"packages for current project\"\nmsgstr \"Keine zuletzt geöffneten Projekte\"\n\n#: ../guanako/guanako.vala:857\n#, c-format\nmsgid \"pop_cur symbol not found! '%s'\\n\"\nmsgstr \"pop_cur-Symbol nicht gefunden! '%s'\\n\"\n\n#: ../src/ui/welcome_screen/create_project_location.vala:69\n#, fuzzy\nmsgid \"project name\"\nmsgstr \"Projektname\"\n\n#. TRANSLATORS: Version relation: X >= Y\n#: ../src/dialogs/create_project.vala:379\nmsgid \"since\"\nmsgstr \"ab\"\n\n#. TRANSLATORS: Version relation: X <= Y\n#: ../src/dialogs/create_project.vala:383\nmsgid \"until\"\nmsgstr \"bis\"\n\n#: ../src/project/project.vala:396\nmsgid \"valama_project\"\nmsgstr \"Valama-Projekt\"\n"
  },
  {
    "path": "po/fr.po",
    "content": "# French translations for Valama package.\n# Copyright (C) 2012 THE Valama'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the Valama package.\n# Martin Lorang <martin@lorang.net>, 2012.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Valama 0.1.2\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2013-05-30 21:20+0200\\n\"\n\"PO-Revision-Date: 2013-07-21 17:30+0200\\n\"\n\"Last-Translator: Martin Lorang <martin@lorang.net>\\n\"\n\"Language-Team: French\\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@->>> (line)<<<- -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:673\n#: ../src/dialogs/create_project.vala:727\nmsgid \" (line)\"\nmsgstr \" (ligne)\"\n\n#: ../src/project/project.vala:621 ../src/project/project.vala:623\n#, c-format\nmsgid \"%s - Vala\"\nmsgstr \"%s - Vala\"\n\n#. TRANSLATORS:\n#. E.g.: Warning found: myfile.vala: 12(13)-12(17): unused variable `test'\n#: ../src/ui/reports.vala:231\n#, c-format\nmsgid \"%s found: %s: %d(%d)-%d(%d): %s\\n\"\nmsgstr \"%s trouvé : %s : %d(%d)-%d(%d) : %s\\n\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished ...\"\n#: ../src/ui/current_file_structure.vala:107\n#, c-format\nmsgid \"%s update finished (not a valid source buffer)!\\n\"\nmsgstr \"Mise à jour de %s terminé (pas une zone tampon source valide) !\\n\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished!\"\n#: ../src/ui/breakpoints.vala:297 ../src/ui/current_file_structure.vala:176\n#: ../src/ui/current_symbol.vala:153 ../src/ui/project_browser.vala:317\n#: ../src/ui/reports.vala:222 ../src/ui/search.vala:246\n#: ../src/ui/source_viewer.vala:625 ../src/ui/symbol_browser.vala:142\n#, c-format\nmsgid \"%s update finished!\\n\"\nmsgstr \"Mise à jour de %s terminée !\\n\"\n\n#. TRANSLATORS:\n#. E.g. \"CMake build failed: some error\" or \"Autotools build failed: some error\"\n#: ../src/project/build_project.vala:145\n#, c-format\nmsgid \"'%s' build failed: %s\\n\"\nmsgstr \"Construction de '%s' échouée : %s\\n\"\n\n#: ../src/project/build_project.vala:135 ../src/project/build_project.vala:186\n#: ../src/project/build_project.vala:222\n#, c-format\nmsgid \"'%s' cleaning failed: %s\\n\"\nmsgstr \"nettoyage de '%s' échoué : %s\\n\"\n\n#: ../src/project/build_project.vala:139\n#, c-format\nmsgid \"'%s' configuration failed: %s\\n\"\nmsgstr \"configuration de '%s' échouée : %s\\n\"\n\n#: ../src/project/build_project.vala:131 ../src/project/build_project.vala:182\n#: ../src/project/build_project.vala:218\n#, c-format\nmsgid \"'%s' initialization failed: %s\\n\"\nmsgstr \"initialisation de '%s' échoué : %s\\n\"\n\n#: ../src/common/args.vala:78\n#, c-format\nmsgid \"'%s' not a positive number\"\nmsgstr \"'%s' n'est pas un nombre positif\"\n\n#: ../src/project/build_project.vala:149\n#, c-format\nmsgid \"'%s' tests failed: %s\\n\"\nmsgstr \"tests de '%s' échoués : %s\\n\"\n\n#: ../src/project/build_project.vala:120\n#, c-format\nmsgid \"'Build' failed with exit status: %d\\n\"\nmsgstr \"'Construction' échouée avec le statut : %d\\n\"\n\n#: ../src/project/build_project.vala:106\n#, c-format\nmsgid \"'Clean' failed with exit status: %d\\n\"\nmsgstr \"'Nettoyage' échoué avec le statut : %d\\n\"\n\n#: ../src/project/build_project.vala:125\n#, c-format\nmsgid \"'Configure' failed with exit status: %d\\n\"\nmsgstr \"'Configure' échoué avec le statut : %d\\n\"\n\n#: ../src/project/build_project.vala:102 ../src/project/build_project.vala:177\n#: ../src/project/build_project.vala:213\n#, c-format\nmsgid \"'Distclean' failed with exit status: %d\\n\"\nmsgstr \"'Nettoyage clair' échoué avec le statut : %d\\n\"\n\n#: ../src/project/build_project.vala:97 ../src/project/build_project.vala:171\n#: ../src/project/build_project.vala:208\n#, c-format\nmsgid \"'Initialization' failed with exit status: %d\\n\"\nmsgstr \"'Initialisation' échouée avec le statut : %d\\n\"\n\n#: ../src/project/build_project.vala:115\n#, c-format\nmsgid \"'Tests' failed with exit status: %d\\n\"\nmsgstr \"'Tests' échoués avec le statut : %d\\n\"\n\n#: ../src/project/project.vala:1801\nmsgid \"(new file)\"\nmsgstr \"(nouveau fichier)\"\n\n#: ../src/common/args.vala:52\nmsgid \"- Valama: next generation Vala IDE\"\nmsgstr \"- Valama: L' EDI Vala nouvelle génération\"\n\n#: ../src/ui/project_browser.vala:190 ../src/ui/project_browser.vala:206\nmsgid \"Add new directory\"\nmsgstr \"Ajouter un nouveau répertoire\"\n\n#: ../src/ui/project_browser.vala:185 ../src/ui/project_browser.vala:202\nmsgid \"Add new file\"\nmsgstr \"Ajouter un nouveau fichier\"\n\n#. TRANSLATORS:\n#. E.g.: \"Add new file to project (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:51\n#, c-format\nmsgid \"Add new file to project (%s)\"\nmsgstr \"Ajouter un nouveau fichier au projet (%s)\"\n\n#: ../src/ui/project_browser.vala:177 ../src/ui/project_browser.vala:195\nmsgid \"Add new package\"\nmsgstr \"Ajouter un paquet\"\n\n#: ../src/project/project.vala:911 ../src/project/project.vala:922\n#, c-format\nmsgid \"Add package: %s\\n\"\nmsgstr \"Ajouter un paquet : %s\\n\"\n\n#: ../src/project/project.vala:726\n#, c-format\nmsgid \"Add project to recent manager: %s - %s\\n\"\nmsgstr \"Ajouter un projet au gestionnaire des récents : %s - %s\\n\"\n\n#: ../src/ui/search.vala:71\nmsgid \"All files\"\nmsgstr \"Tous les fichiers\"\n\n#. TRANSLATORS: (*) is a file filter (globbing) and matches all files.\n#: ../src/ui/welcome_screen.vala:590\nmsgid \"All files (*)\"\nmsgstr \"Tous les fichiers (*)\"\n\n#: ../src/project/project.vala:531 ../src/project/project.vala:585\n#, c-format\nmsgid \"An error occurred while loading new Guanako project: %s\\n\"\nmsgstr \"\"\n\"une erreur est survenue durant le chargement d'un nouveau projet Guanako : \"\n\"%s\\n\"\n\n#: ../src/ui/app_output.vala:39 ../src/ui_main.vala:181\nmsgid \"Application output\"\nmsgstr \"Sortie de l'application\"\n\n#: ../src/project/build_project.vala:250\n#, c-format\nmsgid \"Application received signal: %s\\n\"\nmsgstr \"L'application a reçu le signal : %s\\n\"\n\n#: ../src/project/build_project.vala:235\nmsgid \"Application still running. Quit it manually.\\n\"\nmsgstr \"L'application est toujours en cours. Quittez la manuellement.\\n\"\n\n#: ../src/project/build_project.vala:266\n#, c-format\nmsgid \"Application terminated with exit status '%d'.\\n\"\nmsgstr \"L'application s'est terminée avec le statut '%d'.\\n\"\n\n#: ../src/dialogs/create_project.vala:306\nmsgid \"Author\"\nmsgstr \"Auteur\"\n\n#: ../src/dialogs/create_project.vala:63\nmsgid \"Author information\"\nmsgstr \"Informations auteur\"\n\n#: ../src/dialogs/create_project.vala:308\nmsgid \"Authors\"\nmsgstr \"Auteurs\"\n\n#. TRANSLATORS: Of course not the body part ;) .\n#. Go to the previous window.\n#: ../src/ui/welcome_screen.vala:430 ../src/ui_main.vala:480\nmsgid \"Back\"\nmsgstr \"Retour\"\n\n#: ../src/ui_main.vala:189\nmsgid \"Breakpoints / Timers\"\nmsgstr \"Points d'arrêt / minuteurs\"\n\n#: ../src/project/project.vala:1911\nmsgid \"Buffer loaded.\\n\"\nmsgstr \"Zone tampon chargée.\\n\"\n\n#: ../src/project/project.vala:1929\nmsgid \"Buffer update\"\nmsgstr \"Mise à jour de la zone tampon\"\n\n#: ../src/ui_main.vala:393 ../src/ui_main.vala:399 ../src/ui_main.vala:542\nmsgid \"Build\"\nmsgstr \"Construire\"\n\n#: ../src/project/build_project.vala:70\n#, c-format\nmsgid \"Build command received signal: %s\\n\"\nmsgstr \"La commande construire a reçu le signal : %s\\n\"\n\n#. TRANSLATORS:\n#. The user has to choose a directory where to build the application\n#. so it might be undefined.\n#: ../src/buildsystem/base.vala:429 ../src/buildsystem/cmake.vala:44\nmsgid \"Build directory not set.\"\nmsgstr \"Répertoire de construction non paramétré.\"\n\n#: ../src/ui_main.vala:177\nmsgid \"Build output\"\nmsgstr \"Sortie de construction\"\n\n#: ../src/project/project_templates.vala:74\n#, c-format\nmsgid \"Build system '%s' currently not supported by template selector.\\n\"\nmsgstr \"\"\n\"Le système de construction '%s' n'est actuellement pas supporté par le \"\n\"selecteur de modèles.\\n\"\n\n#: ../src/project/project.vala:1715\n#, c-format\nmsgid \"Build system '%s' not supported.\\n\"\nmsgstr \"Système de construction '%s' non supporté.\\n\"\n\n#: ../src/project/project.vala:1078\n#, c-format\nmsgid \"Build system directory does not exist: %s\\n\"\nmsgstr \"Le répertoire du système de construction n'existe pas : %s\\n\"\n\n#: ../src/project/project.vala:1076\n#, c-format\nmsgid \"Build system file does not exist: %s\\n\"\nmsgstr \"Le fichier du système de construction n'existe pas : %s\\n\"\n\n#: ../src/ui/project_browser.vala:289\nmsgid \"Build system files\"\nmsgstr \"Fichiers du système de construction\"\n\n#: ../src/common/args.vala:40\nmsgid \"Build systems directory.\"\nmsgstr \"Répertoire des systèmes de construction\"\n\n#: ../src/buildsystem/base.vala:75\n#, c-format\nmsgid \"Buildsystem build finished: %s\\n\"\nmsgstr \"Construction du système de construction terminé : %s\\n\"\n\n#: ../src/buildsystem/base.vala:72\n#, c-format\nmsgid \"Buildsystem build started: %s\\n\"\nmsgstr \"Construction du système de construction démarré : %s\\n\"\n\n#: ../src/buildsystem/base.vala:81\n#, c-format\nmsgid \"Buildsystem cleaning finished: %s\\n\"\nmsgstr \"Nettoyage du système de construction terminé : %s\\n\"\n\n#: ../src/buildsystem/base.vala:78\n#, c-format\nmsgid \"Buildsystem cleaning started: %s\\n\"\nmsgstr \"Nettoyage du système de construction démarré : %s\\n\"\n\n#: ../src/buildsystem/base.vala:69\n#, c-format\nmsgid \"Buildsystem configuration finished: %s\\n\"\nmsgstr \"Configuration du système de construction terminée : %s\\n\"\n\n#: ../src/buildsystem/base.vala:66\n#, c-format\nmsgid \"Buildsystem configuration started: %s\\n\"\nmsgstr \"Configuration du système de construction démarrée : %s\\n\"\n\n#: ../src/buildsystem/base.vala:87\n#, c-format\nmsgid \"Buildsystem distcleaning finished: %s\\n\"\nmsgstr \"Nettoyage clair du système de construction terminé : %s\\n\"\n\n#: ../src/buildsystem/base.vala:84\n#, c-format\nmsgid \"Buildsystem distcleaning started: %s\\n\"\nmsgstr \"Nettoyage clair du système de construction démarré : %s\\n\"\n\n#: ../src/buildsystem/base.vala:63\n#, c-format\nmsgid \"Buildsystem initialization finished: %s\\n\"\nmsgstr \"Initialisation du système de construction terminée : %s\\n\"\n\n#: ../src/buildsystem/base.vala:60\n#, c-format\nmsgid \"Buildsystem initialization started: %s\\n\"\nmsgstr \"Initialisation du système de construction démarrée : %s\\n\"\n\n#: ../src/buildsystem/base.vala:93\n#, c-format\nmsgid \"Buildsystem tests finished: %s\\n\"\nmsgstr \"Tests du système de construction terminés : %s\\n\"\n\n#: ../src/buildsystem/base.vala:90\n#, c-format\nmsgid \"Buildsystem tests started: %s\\n\"\nmsgstr \"Tests du système de construction démarrés : %s\\n\"\n\n#: ../guanako/guanako.vala:943\n#, c-format\nmsgid \"Call '%s' not found in '%s'\\n\"\nmsgstr \"L'appel de '%s' non trouvé dans '%s'\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@ (line) -> 'barfoo'\"... or\n#. \"Cannot apply substitution @foobar@ -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:670\n#, c-format\nmsgid \"Cannot apply substitution '@%s@'%s -> '%s': %s does not exist\\n\"\nmsgstr \"\"\n\"Impossible d'appliquer la substitution '@%s@'%s -> '%s': %s n'existe pas\\n\"\n\n#: ../src/dialogs/create_project.vala:754\n#, c-format\nmsgid \"Cannot create temporary file '%s' to apply substitutions: %s\\n\"\nmsgstr \"\"\n\"Impossible de créer le fichier temporaire '%s' pour appliquer les \"\n\"substitutions : %s\\n\"\n\n#: ../src/project/project.vala:1264 ../src/project/project.vala:1620\n#: ../src/project/project_templates.vala:209 ../src/ui_main.vala:742\n#: ../guanako/stylecheck.vala:360\nmsgid \"Cannot parse file.\"\nmsgstr \"Impossible de parser le fichier.\"\n\n#: ../src/dialogs/create_project.vala:735\n#, c-format\nmsgid \"Cannot read file '%s': %s\\n\"\nmsgstr \"Impossible de lire le fichier '%s' : %s\\n\"\n\n#. TRANSLATORS: Change focus of source view to new file.\n#: ../src/ui/source_viewer.vala:66\n#, c-format\nmsgid \"Change current focus: %s\\n\"\nmsgstr \"Changer le focus actuel : %s\\n\"\n\n#: ../src/ui/stylechecker.vala:61\nmsgid \"Checker loaded.\\n\"\nmsgstr \"Vérificateur chargé.\\n\"\n\n#: ../src/project/project.vala:1734 ../src/project/project.vala:1744\n#, c-format\nmsgid \"Choose '%s' package.\\n\"\nmsgstr \"Choisir le paquet '%s'.\\n\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:45\nmsgid \"Choose Buildsystem\"\nmsgstr \"Choisissez le système de construction\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:46\nmsgid \"Choose a buildsystem for current project.\"\nmsgstr \"Choisissez un système de construction pour le projet actuel\"\n\n#: ../src/dialogs/create_file.vala:36\nmsgid \"Choose directory name\"\nmsgstr \"Choisissez un nom de répertoire\"\n\n#: ../src/dialogs/create_file.vala:35\nmsgid \"Choose filename\"\nmsgstr \"Choisissez un fichier\"\n\n#: ../src/ui/welcome_screen/create_project_packages.vala:31\nmsgid \"Choose packages\"\nmsgstr \"Choisissez les paquets\"\n\n#: ../src/dialogs/create_project.vala:522\nmsgid \"Choose project template\"\nmsgstr \"Choisissez un modèle de projet\"\n\n#: ../src/ui_main.vala:419\nmsgid \"Clean\"\nmsgstr \"Nettoyer\"\n\n#: ../src/ui_main.vala:425\nmsgid \"Clean all\"\nmsgstr \"Tout nettoyer\"\n\n#: ../src/ui_main.vala:412\nmsgid \"Clean build\"\nmsgstr \"Construction propre\"\n\n#: ../src/ui/app_output.vala:51\nmsgid \"Clear output\"\nmsgstr \"Effacer la sortie\"\n\n#: ../src/project/project.vala:2062\nmsgid \"Close buffer.\\n\"\nmsgstr \"Fermer la zone tampon.\\n\"\n\n#: ../src/ui_main.vala:482\nmsgid \"Close project\"\nmsgstr \"Fermer le projet\"\n\n#: ../src/ui/source_viewer.vala:278\n#, c-format\nmsgid \"Close view and buffer: %s\\n\"\nmsgstr \"Fermer la vue et la zone tampon : %s\\n\"\n\n#: ../src/ui_main.vala:197\nmsgid \"Coding style checker\"\nmsgstr \"Vérificateur de style de codage\"\n\n#: ../src/dialogs/missing_packages.vala:39\nmsgid \"Compiling and auto completion might fail!\"\nmsgstr \"La compilation et l'autocompletion peuvent échouer !\"\n\n#: ../src/completion_provider.vala:66\nmsgid \"Completion\"\nmsgstr \"Complètement\"\n\n#: ../src/common/common.vala:471\n#, c-format\nmsgid \"Copy from '%s' to '%s'.\\n\"\nmsgstr \"Copier de '%s' vers '%s'.\\n\"\n\n#: ../src/common/common.vala:348\nmsgid \"Copying finished.\\n\"\nmsgstr \"Copie terminée.\\n\"\n\n#: ../src/dialogs/about.vala:50\nmsgid \"Copyright © 2012, 2013 Valama development team\"\nmsgstr \"Copyright © 2012, 2013 L'équipe de développement Valama\"\n\n#: ../guanako/guanako_frankenstein.vala:31\n#, c-format\nmsgid \"Could not acquire name.\\n\"\nmsgstr \"Impossible d'acquérir le nom.\\n\"\n\n#: ../src/project/project.vala:732\nmsgid \"Could not add project to recent manager.\\n\"\nmsgstr \"Impossible d'ajouter au fichiers récents.\\n\"\n\n#. TRANSLATORS: Could not change source view focus to new file.\n#: ../src/ui/source_viewer.vala:236\n#, c-format\nmsgid \"Could not change focus to: %s\\n\"\nmsgstr \"Impossible de transférer le focus vers : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:759\n#: ../src/dialogs/create_project.vala:792\n#, c-format\nmsgid \"Could not close file descriptor for '%s': %s\\n\"\nmsgstr \"Impossible de fermer le descripteur de fichier pour '%s' : %s\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Could not close source view (mapping) for: myfile.vala\"\n#: ../src/project/project.vala:1190\n#, c-format\nmsgid \"Could not close source view (mapping) for: %s\\n\"\nmsgstr \"Impossible de fermer la vue source (mapping) pour : %s\\n\"\n\n#: ../src/ui/source_viewer.vala:274\n#, c-format\nmsgid \"Could not close view: %s\\n\"\nmsgstr \"Impossible de fermer la vue : %s\\n\"\n\n#: ../src/dialogs/project_settings.vala:69\n#, c-format\nmsgid \"Could not compare project files inodes: %s\\n\"\nmsgstr \"Impossible de comparer les inodes des fichiers du projet : %s\\n\"\n\n#: ../src/project/project.vala:135\n#, c-format\nmsgid \"Could not convert '%s' to '%s'.\\n\"\nmsgstr \"Impossible de convertir '%s' vers %s.\\n\"\n\n#: ../src/project/project.vala:66 ../src/project/project.vala:98\n#: ../src/project/project.vala:117\n#, c-format\nmsgid \"Could not convert '%s' to string: %u\\n\"\nmsgstr \"Impossible de convertir '%s' en chaîne : %u\\n\"\n\n#: ../src/buildsystem/base.vala:586\n#, c-format\nmsgid \"Could not convert all characters: %s\\n\"\nmsgstr \"Impossible de convertir tous les caractères : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:623\n#, c-format\nmsgid \"Could not copy templates for new project: %s\\n\"\nmsgstr \"Impossible de copier les modèles pour le nouveau projet : %s\\n\"\n\n#: ../src/ui_main.vala:278\n#, c-format\nmsgid \"Could not create cache directory: %s\\n\"\nmsgstr \"Impossible de créer le répertoire cache : %s\\n\"\n\n#: ../src/dialogs/create_file.vala:120\n#, c-format\nmsgid \"Could not create new directory: %s\\n\"\nmsgstr \"Impossible de créer le répertoire parent : %s\\n\"\n\n#: ../src/dialogs/create_file.vala:110\n#, c-format\nmsgid \"Could not create new file: %s\\n\"\nmsgstr \"Impossible de créer le nouveau fichier : %s\\n\"\n\n#: ../src/dialogs/create_file.vala:102\n#, c-format\nmsgid \"Could not create parent directory: %s\\n\"\nmsgstr \"Impossible de créer le répertoire parent : %s\\n\"\n\n#: ../src/project/project.vala:1942\n#, c-format\nmsgid \"Could not create thread to update buffer: %s\\n\"\nmsgstr \"\"\n\"Impossible de démarrer le processus pour la mise à jour de la zone tampon : \"\n\"%s\\n\"\n\n#: ../src/project/project.vala:679\n#, c-format\nmsgid \"Could not create thread to update source files: %s\\n\"\nmsgstr \"\"\n\"Impossible de démarrer le processus pour la mise à jour des fichiers \"\n\"sources : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:690\n#, c-format\nmsgid \"Could not determine file path: %s\\n\"\nmsgstr \"Impossible de déterminer le chemin du fichier : %s\\n\"\n\n#. TRANSLATORS: This is an technical information. You might not want\n#. to translate \"ScrolledWindow\".\n#: ../src/ui/source_viewer.vala:550\n#, c-format\nmsgid \"Could not find ScrolledWindow widget: %s\\n\"\nmsgstr \"Impossible de trouver le widget ScrolledWindow : %s\\n\"\n\n#: ../src/buildsystem/base.vala:316\n#, c-format\nmsgid \"Could not find pkg-config file for '%s'. \"\nmsgstr \"Impossible de trouver le fichier pkg-config pour '%s'. \"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:378 ../src/ui/project_browser.vala:481\n#, c-format\nmsgid \"Could not get current TreePath: %s\\n\"\nmsgstr \"Impossible d'obtenir le chemin de l'arborescence courant : %s\\n\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreeView\".\n#: ../src/ui/project_browser.vala:115 ../src/ui/project_browser.vala:127\n#: ../src/ui/project_browser.vala:166 ../src/ui/project_browser.vala:386\n#: ../src/ui/project_browser.vala:425 ../src/ui/project_browser.vala:487\n#: ../src/ui/project_browser.vala:505\n#, c-format\nmsgid \"Could not get iterator in TreeView: %s\\n\"\nmsgstr \"Impossible d'obtenir l'itérateur dans la vue de l'arborescence : %s\\n\"\n\n#: ../src/project/project.vala:595\n#, c-format\nmsgid \"Could not initialize build system: %s\\n\"\nmsgstr \"Impossible d'initialiser le système de construction : %s\\n\"\n\n#: ../src/ui/ui_elements.vala:118\nmsgid \"Could not initialize locking signals.\\n\"\nmsgstr \"Impossible de connecter les signaux de verrouillage.\\n\"\n\n#: ../src/completion_provider.vala:175\n#, c-format\nmsgid \"Could not launch completion thread successfully: %s\\n\"\nmsgstr \"Impossible de lancer le processus de complétion : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:701 ../src/main.vala:178\n#: ../src/project/project.vala:822 ../src/project/project.vala:866\n#, c-format\nmsgid \"Could not list or iterate through directory content of '%s': %s\\n\"\nmsgstr \"Impossible de parcourir le contenu du répertoire '%s' : %s\\n\"\n\n#: ../src/project/project.vala:1033\n#, c-format\nmsgid \"Could not load Vala source file: %s\\n\"\nmsgstr \"Impossible de charger le fichier source Vala : %s\\n\"\n\n#: ../src/ui/welcome_screen.vala:245\n#, c-format\nmsgid \"Could not load Valama text logo: %s\\n\"\nmsgstr \"Impossible de charger le logo texte Valama : %s\\n\"\n\n#: ../src/project/project.vala:1862 ../src/ui/source_viewer.vala:373\n#, c-format\nmsgid \"Could not load completion: %s\\n\"\nmsgstr \"Impossible de charger la complétion : %s\\n\"\n\n#: ../src/main.vala:279\n#, c-format\nmsgid \"Could not load file: %s\\n\"\nmsgstr \"Impossible de charger le fichier : %s\\n\"\n\n#: ../src/completion_provider.vala:185\n#, c-format\nmsgid \"Could not load icon theme: %s\\n\"\nmsgstr \"Impossible de charger le thème d'icônes : %s\\n\"\n\n#: ../src/project/project.vala:575 ../src/ui_main.vala:241\n#, c-format\nmsgid \"Could not load meta information: %s\\n\"\nmsgstr \"Impossible de charger les meta-informations : %s\\n\"\n\n#: ../src/dialogs/project_settings.vala:79 ../src/ui/welcome_screen.vala:372\n#, c-format\nmsgid \"Could not load new project: %s\\n\"\nmsgstr \"Impossible de charger le nouveau projet : %s\\n\"\n\n#: ../src/main.vala:170\n#, c-format\nmsgid \"Could not load pixmap: %s\\n\"\nmsgstr \"Impossible de charger l'image : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:143\n#, c-format\nmsgid \"Could not load project template: %s\\n\"\nmsgstr \"Impossible de charger le modèle de projet : %s\\n\"\n\n#: ../src/ui/welcome_screen.vala:631\n#, c-format\nmsgid \"Could not load project: %s\\n\"\nmsgstr \"Impossible de charger le projet : %s\\n\"\n\n#: ../src/project/project_templates.vala:231\n#, c-format\nmsgid \"Could not load template '%s': %s\\n\"\nmsgstr \"Impossible de charger le modèle '%s' : %s\\n\"\n\n#: ../src/project/project_templates.vala:198\n#, c-format\nmsgid \"Could not load template image: %s\\n\"\nmsgstr \"Impossible de charger l'image modèle : %s\\n\"\n\n#: ../guanako/guanako.vala:310\n#, c-format\nmsgid \"Could not load vapi: %s\\n\"\nmsgstr \"Impossible de charger vapi : %s\\n\"\n\n#: ../src/project/project.vala:1232\n#, c-format\nmsgid \"Could not open directory or file in '%s': %s\\n\"\nmsgstr \"Impossible d'ouvrir un répertoire ou un fichier dans '%s' : %s\\n\"\n\n#: ../src/buildsystem/plain.vala:104 ../src/common/common.vala:636\n#, c-format\nmsgid \"Could not open file writable: %s\\n\"\nmsgstr \"Impossible d'ouvrir un fichier en écriture : %s\\n\"\n\n#: ../src/buildsystem/cmake.vala:109\n#, c-format\nmsgid \"Could not open file: %s\\n\"\nmsgstr \"Impossible d'ouvrir le fichier : %s\\n\"\n\n#: ../src/main.vala:172\n#, c-format\nmsgid \"Could not open pixmaps file: %s\\n\"\nmsgstr \"Impossible d'ouvrir le fichier image : %s\\n\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:53\n#, c-format\nmsgid \"Could not operate on directory: %s\"\nmsgstr \"Impossible d'opérer dans le répertoire : %s\"\n\n#: ../src/project/project_templates.vala:366\n#, c-format\nmsgid \"Could not process files in template directory: %s\\n\"\nmsgstr \"Impossible de trouver les fichiers du répertoire modèle : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:786\n#, c-format\nmsgid \"Could not read file '%s' properly: %s\\n\"\nmsgstr \"Impossible de lire le fichier '%s' correctement : %s\\n\"\n\n#: ../src/buildsystem/plain.vala:79\n#, c-format\nmsgid \"Could not read file content of '%s': %s\\n\"\nmsgstr \"Impossible de lire le contenu de '%s' : %s\\n\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:51 ../guanako/guanako.vala:1294\n#, c-format\nmsgid \"Could not read file: %s\"\nmsgstr \"Impossible de lire le fichier : %s\"\n\n#: ../src/buildsystem/cmake.vala:107\n#, c-format\nmsgid \"Could not read file: %s\\n\"\nmsgstr \"Impossible de lire le fichier : %s\\n\"\n\n#: ../guanako/guanako.vala:1292\n#, c-format\nmsgid \"Could not read line: %s\"\nmsgstr \"Impossible de lire une ligne : %s\"\n\n#: ../src/project/project.vala:528 ../src/project/project.vala:582\n#, c-format\nmsgid \"Could not read syntax file: %s\\n\"\nmsgstr \"Impossible de lire le fichier de syntaxe : %s\\n\"\n\n#: ../guanako/guanako_frankenstein.vala:45\n#, c-format\nmsgid \"Could not register service.\\n\"\nmsgstr \"Impossible d'enregistrer le service.\\n\"\n\n#: ../src/project/project.vala:1481\nmsgid \"Could not select a package from choice.\\n\"\nmsgstr \"Impossible de sélectionner un paquet du choix\\n\"\n\n#: ../src/ui/source_viewer.vala:74\n#, c-format\nmsgid \"Could not select current source view: %s\\n\"\nmsgstr \"Impossible de sélectionner la vue source courante : %s\\n\"\n\n#: ../src/buildsystem/base.vala:675\n#, c-format\nmsgid \"Could not spawn pkg-config package existence check: %s\\n\"\nmsgstr \"\"\n\"Impossible de soumettre la vérification d'existence du paquet pkg-config : \"\n\"%s\\n\"\n\n#: ../src/buildsystem/base.vala:553\n#, c-format\nmsgid \"Could not spawn subprocess: %s\\n\"\nmsgstr \"Impossible de soumettre le sous-processus : %s\\n\"\n\n#: ../src/ui/source_viewer.vala:366\n#, c-format\nmsgid \"Could not unload completion: %s\\n\"\nmsgstr \"Impossible de désactiver la complétion : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:796\n#, c-format\nmsgid \"\"\n\"Could not update file '%s' with '%s' (temporary file may still exist): %s\\n\"\nmsgstr \"\"\n\"Impossible de mettre à jour le fichier '%s' avec '%s' (le fichier temporaire \"\n\"existe peut-être encore) : %s\\n\"\n\n#: ../src/buildsystem/plain.vala:101 ../src/common/common.vala:634\n#, c-format\nmsgid \"Could not update file: %s\\n\"\nmsgstr \"Impossible de mettre à jour le fichier : %s\\n\"\n\n#: ../guanako/guanako_helpers.vala:45\n#, c-format\nmsgid \"Could not update vapi files: %s\\n\"\nmsgstr \"Impossible de mettre à jour les fichiers vapi : %s\\n\"\n\n#: ../src/dialogs/create_file.vala:107\n#, c-format\nmsgid \"Could not write to new file: %s\\n\"\nmsgstr \"Impossible d'écrire dans le nouveau fichier : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:781\n#, c-format\nmsgid \"Could not write to temporary file '%s': %s\\n\"\nmsgstr \"Impossible d'écrire dans le fichier temporaire '%s' : %s\\n\"\n\n#: ../src/main.vala:72\n#, c-format\nmsgid \"Couldn't load Valama project: %s\\n\"\nmsgstr \"Impossible de charger le projet Valama : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:340\n#, c-format\nmsgid \"Couldn't load layout file: %s\\n\"\nmsgstr \"Impossible de charger le fichier d'agencement : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:354\n#, c-format\nmsgid \"Couldn't load layout: %s\\n\"\nmsgstr \"Impossible de charger l'agencement : %s\\n\"\n\n#: ../src/dialogs/create_project.vala:639\n#, c-format\nmsgid \"Couldn't load new project: %s\\n\"\nmsgstr \"Impossible de charger le nouveau projet : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:373\n#, c-format\nmsgid \"Couldn't save layout to file: %s\\n\"\nmsgstr \"Impossible de sauvegarder l'agencement : %s\\n\"\n\n#: ../src/project/project.vala:2010\n#, c-format\nmsgid \"Couldn't save project file: %s\\n\"\nmsgstr \"Impossible de sauvegarder le fichier projet : %s\\n\"\n\n#: ../build/data/valama.desktop.in.h:3\nmsgid \"Create Vala projects.\"\nmsgstr \"Créer un projet Vala.\"\n\n#: ../src/ui_main.vala:492\nmsgid \"Create new file\"\nmsgstr \"Créer nouveau fichier\"\n\n#: ../src/ui/welcome_screen.vala:287\nmsgid \"Create new project\"\nmsgstr \"Créer un nouveau projet\"\n\n#. TRANSLATORS:\n#. E.g.: \"Create new subdirectory (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:54\n#, c-format\nmsgid \"Create new subdirectory (%s)\"\nmsgstr \"Créer nouveau répertoire (%s)\"\n\n#: ../src/ui/welcome_screen.vala:293\nmsgid \"Create project\"\nmsgstr \"Créer un projet\"\n\n#: ../src/ui/current_file_structure.vala:39 ../src/ui_main.vala:193\nmsgid \"Current file\"\nmsgstr \"Fichier en cours\"\n\n#. TRANSLATORS:\n#. \"Symbol\" in programming context as primitive data type used to name\n#. variables and functions.\n#: ../src/ui/current_symbol.vala:38 ../src/ui_main.vala:205\nmsgid \"Current symbol\"\nmsgstr \"Symbole en cours\"\n\n#. TRANSLATORS: Uppercase for variables in command line options.\n#: ../src/common/args.vala:39 ../src/common/args.vala:40\nmsgid \"DIRECTORY\"\nmsgstr \"RÉPERTOIRE\"\n\n#: ../src/project/project.vala:1133\n#, c-format\nmsgid \"Data directory does not exist: %s\\n\"\nmsgstr \"Répertoire de données inexistant : %s\\n\"\n\n#: ../src/project/project.vala:1131\n#, c-format\nmsgid \"Data file does not exist: %s\\n\"\nmsgstr \"Fichier de données inexistant : %s\\n\"\n\n#. TRANSLATORS:\n#. \"Data files\" means the file is neighter a (Vala) source file nor a\n#. build system file - it's an other file or data file.\n#: ../src/ui/project_browser.vala:296\nmsgid \"Data files\"\nmsgstr \"Fichiers de données\"\n\n#: ../src/project/project.vala:94\nmsgid \"Debug\"\nmsgstr \"Debug\"\n\n#: ../guanako/reporter.vala:41\nmsgid \"Deprecated\"\nmsgstr \"Obsolète\"\n\n#: ../src/dialogs/create_project.vala:70\nmsgid \"Detailed information\"\nmsgstr \"Information détaillée\"\n\n#. TRANSLATORS:\n#. A \"define\" is a preprocessor symbol which is either set or unset:\n#. #if FOOBAR || BARFOO   <- where FOOBAR and BARFOO are defines\n#: ../src/buildsystem/base.vala:170\n#, c-format\nmsgid \"Disable define: %s\\n\"\nmsgstr \"Désactiver une définition : %s\\n\"\n\n#: ../src/ui/reports.vala:116\nmsgid \"Display all\"\nmsgstr \"Afficher tout\"\n\n#: ../src/common/args.vala:35\nmsgid \"Display version number.\"\nmsgstr \"Afficher le numéro de version.\"\n\n#: ../src/ui/project_browser.vala:517\nmsgid \"Do you want to delete this file?\"\nmsgstr \"Voulez-vous effacer ce fichier ?\"\n\n#: ../src/dialogs/create_file.vala:86\nmsgid \"Don't let this field empty. Name a file.\"\nmsgstr \"Ne laissez pas ce champ vide. Donnez un nom de fichier.\"\n\n#: ../src/ui_main.vala:326\nmsgid \"Edit\"\nmsgstr \"Edition\"\n\n#: ../src/buildsystem/base.vala:160\n#, c-format\nmsgid \"Enable define for package '%s': %s\\n\"\nmsgstr \"Activer une définition pour le paquet '%s' : %s\\n\"\n\n#: ../guanako/guanako.vala:723\n#, c-format\nmsgid \"Entry point '%s' not found in syntax file. Trying to segfault me, huh??\"\nmsgstr \"\"\n\"Le point d'entrée '%s' introuvable dans le fichier de syntaxe. Tentative de \"\n\"me segfaulter, hein ?\"\n\n#: ../src/ui/reports.vala:79 ../guanako/reporter.vala:37\nmsgid \"Error\"\nmsgstr \"Erreur\"\n\n#: ../src/common/common.vala:737\n#, c-format\nmsgid \"Error: \"\nmsgstr \"Erreur : \"\n\n#: ../src/common/args.vala:58\n#, c-format\nmsgid \"Error: %s\\n\"\nmsgstr \"Erreur : %s\\n\"\n\n#. TRANSLATORS: Notes aren't notices but comments/remarks.\n#: ../src/ui/reports.vala:215\n#, c-format\nmsgid \"\"\n\"Errors: %d, Warnings: %d, Deprecated: %d, Experimental: %d, Notes: %d  -  \"\n\"%d\\n\"\nmsgstr \"\"\n\"Erreurs : %d, Alertes : %d, Obsolète : %d, Expérimental : %d, Notes : %d - \"\n\"%d\\n\"\n\n#: ../src/ui_main.vala:438 ../src/ui_main.vala:550\nmsgid \"Execute\"\nmsgstr \"Exécuter\"\n\n#: ../guanako/reporter.vala:43\nmsgid \"Experimental\"\nmsgstr \"Expérimental\"\n\n#: ../src/common/args.vala:36 ../src/common/args.vala:43\nmsgid \"FILE\"\nmsgstr \"FICHIER\"\n\n#: ../src/ui/build_output.vala:102\nmsgid \"Failed\"\nmsgstr \"Échoué\"\n\n#: ../src/ui/breakpoints.vala:61 ../src/ui/reports.vala:67\n#: ../src/ui_main.vala:289\nmsgid \"File\"\nmsgstr \"Fichier\"\n\n#: ../src/project/project.vala:1024 ../src/project/project.vala:1093\nmsgid \"File already a data file. Skip it.\\n\"\nmsgstr \"Le fichier est déjà un fichier de données : ignoré.\\n\"\n\n#: ../src/project/project.vala:1090 ../src/project/project.vala:1145\nmsgid \"File already a source file. Skip it.\\n\"\nmsgstr \"Le fichier est déjà un fichier source : ignoré.\\n\"\n\n#: ../src/project/project.vala:1021 ../src/project/project.vala:1148\nmsgid \"File already registered for build system. Skip it.\\n\"\nmsgstr \"\"\n\"Le fichier est déjà enregistré pour le système de construction : ignoré.\\n\"\n\n#: ../src/common/common.vala:422\nmsgid \"File copying cancelled.\"\nmsgstr \"Copie de fichier annulée.\"\n\n#: ../src/project/project_templates.vala:215\nmsgid \"File does not contain enough information\"\nmsgstr \"Le fichier ne contient pas assez d'informations\"\n\n#: ../src/project/project.vala:1270 ../src/project/project.vala:1626\n#: ../src/ui_main.vala:748 ../guanako/stylecheck.vala:366\nmsgid \"File does not contain enough information.\"\nmsgstr \"Le fichier ne contient pas assez d'informations.\"\n\n#: ../guanako/stylecheck.vala:355\nmsgid \"File does not exist.\"\nmsgstr \"Le fichier n'existe pas.\"\n\n#: ../src/project/project.vala:2045\nmsgid \"File is modified. Do you want to save it?\"\nmsgstr \"Le fichier a été modifié. Voulez-vous le sauvegarder ?\"\n\n#. TRANSLATORS:\n#. File has to be registered with Valama (loaded) to check if the\n#. buffer was modified.\n#: ../src/project/project.vala:2030\n#, c-format\nmsgid \"File not registered in project to check if buffer is dirty: %s\\n\"\nmsgstr \"\"\n\"Le fichier non enregistré dans le projet pour vérifier l'état de la zone \"\n\"tampon : %s\\n\"\n\n#: ../src/common/common.vala:631\n#, c-format\nmsgid \"File saved: %s\\n\"\nmsgstr \"Fichier sauvegardé : %s\\n\"\n\n#. TRANSLATORS:\n#. Focus docking widget (Gdl.DockItem): long name / file name (short name)\n#: ../src/ui_main.vala:797\n#, c-format\nmsgid \"Focus dock item: %s (%s)\\n\"\nmsgstr \"Focus sur l'élément du dock : %s (%s)\\n\"\n\n#: ../src/project/project.vala:1680\nmsgid \"Following files are modified. Do you want to save them?\"\nmsgstr \"Les fichiers suivants ont été modifiés. Voulez-vous les sauvegarder ?\"\n\n#: ../src/common/args.vala:42\nmsgid \"Force loading of possibly incompatible template or project files.\"\nmsgstr \"\"\n\"Chargement forcé d'un fichier modèle ou projet probablement incompatible.\"\n\n#: ../src/project/project.vala:1088\n#, c-format\nmsgid \"Found build system file: %s\\n\"\nmsgstr \"Trouvé le fichier de système de construction : %s\\n\"\n\n#: ../src/project/project.vala:1143\n#, c-format\nmsgid \"Found data file: %s\\n\"\nmsgstr \"Trouvé le fichier de données : %s\\n\"\n\n#: ../src/project/project.vala:1018\n#, c-format\nmsgid \"Found source file: %s\\n\"\nmsgstr \"Trouvé fichier source : %s\\n\"\n\n#: ../src/dialogs/about.vala:45\n#, c-format\nmsgid \"French\"\nmsgstr \"Français\"\n\n#: ../src/dialogs/about.vala:46\n#, c-format\nmsgid \"German\"\nmsgstr \"Allemand\"\n\n#: ../src/dialogs/about.vala:57\nmsgid \"Github project page\"\nmsgstr \"Page projet Github\"\n\n#: ../guanako/guanako.vala:1116\nmsgid \"Guanako Completion\"\nmsgstr \"Complétion Guanako\"\n\n#: ../src/common/args.vala:36\nmsgid \"Guanako syntax file.\"\nmsgstr \"Fichier de syntaxe Guanako.\"\n\n#: ../src/ui_main.vala:464\nmsgid \"Help\"\nmsgstr \"Aide\"\n\n#: ../build/data/org.valama.gschema.xml.h:1\nmsgid \"Horizontal window size\"\nmsgstr \"Taille horizontale de la fenêtre\"\n\n#: ../build/data/valama.desktop.in.h:2\nmsgid \"IDE\"\nmsgstr \"EDI\"\n\n#: ../src/ui_main.vala:529\nmsgid \"IDE mode\"\nmsgstr \"Mode EDI\"\n\n#. TRANSLATORS: insert input mode\n#: ../src/ui/source_viewer.vala:396 ../src/ui/source_viewer.vala:400\nmsgid \"INS\"\nmsgstr \"INS\"\n\n#. TRANSLATORS: This is a technical information. So you might not\n#. want to translate \"IOChannel\".\n#: ../src/buildsystem/base.vala:590\n#, c-format\nmsgid \"IOChannel operation failed: %s\\n\"\nmsgstr \"Opération IOChannel échouée : %s\\n\"\n\n#: ../src/project/project.vala:1282\n#, c-format\nmsgid \"Ignore project file loading error: %s\\n\"\nmsgstr \"Ignorer l'erreur de chargement du fichier projet : %s\\n\"\n\n#: ../src/project/project_templates.vala:324\n#: ../src/project/project_templates.vala:331\n#, c-format\nmsgid \"Ignore substitution with missing '%s' property line %hu.\"\nmsgstr \"Ignorer la substitution avec '%s' manquant ligne de propriété %hu.\"\n\n#: ../src/project/project_templates.vala:228\n#, c-format\nmsgid \"Ignore template file loading error: %s\\n\"\nmsgstr \"Ignorer l'erreur de chargement du fichier modèle : %s\\n\"\n\n#. TRANSLATORS: Context: ... for package `foobar' <= 0.42 found: ...\n#: ../src/buildsystem/base.vala:352\n#, c-format\nmsgid \"Incompatible version for package '%s' %s %s found: %s\\n\"\nmsgstr \"Version incompatible du paquet '%s' %s %s trouvé : %s\\n\"\n\n#: ../src/project/project.vala:709\nmsgid \"Initial buffer update\"\nmsgstr \"Mise à jour initiale de la zone tampon\"\n\n#: ../src/common/ui_helpers.vala:110\n#, c-format\nmsgid \"Invalid character: '%s' Please choose one from: %s\"\nmsgstr \"Caractère invalide : '%s' Sélectionner un parmi : %s\"\n\n#: ../src/ui/source_viewer.vala:335\nmsgid \"Language: \"\nmsgstr \"Langage : \"\n\n#: ../src/project/build_project.vala:272\n#, c-format\nmsgid \"Launching application failed: %s\\n\"\nmsgstr \"Lancement de l'application échoué : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:375\n#, c-format\nmsgid \"Layout '%s' saved to file: %s\\n\"\nmsgstr \"Agencement '%s' sauvegarder dans le fichier : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:329 ../src/common/ui_helpers.vala:331\n#, c-format\nmsgid \"Layout file does not exist: %s\\n\"\nmsgstr \"Le fichier d'agencement inexistant : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:356\n#, c-format\nmsgid \"Layout loaded: %s\\n\"\nmsgstr \"Agencement charge : %s\\n\"\n\n#: ../src/common/ui_helpers.vala:338\n#, c-format\nmsgid \"Layouts loaded from file: %s\\n\"\nmsgstr \"Agencements charger du fichier : %s\\n\"\n\n#: ../src/ui/breakpoints.vala:55 ../src/ui/search.vala:40\n#: ../src/ui/stylechecker.vala:35\nmsgid \"Line\"\nmsgstr \"Ligne\"\n\n#. TRANSLATORS: Short name for Line X, Column Y\n#: ../src/ui/source_viewer.vala:505\n#, c-format\nmsgid \"Ln %d, Col %d\"\nmsgstr \"Lg %d, Col %d\"\n\n#: ../src/ui_main.vala:736\n#, c-format\nmsgid \"Load Ui meta information: %s\\n\"\nmsgstr \"Charger les meta-informations de l'IU : %s\\n\"\n\n#: ../src/common/args.vala:44\nmsgid \"Load default layout.\"\nmsgstr \"Charger l'agencement par defaut.\"\n\n#: ../src/common/ui_helpers.vala:334\nmsgid \"Load layout...\\n\"\nmsgstr \"Charger l'agencement...\\n\"\n\n#: ../src/project/project.vala:1800\n#, c-format\nmsgid \"Load new buffer: %s\\n\"\nmsgstr \"Charger la nouvelle zone tampon : %s\\n\"\n\n#: ../src/main.vala:168\n#, c-format\nmsgid \"Load pixmap: %s\\n\"\nmsgstr \"Charger l'image : %s\\n\"\n\n#: ../src/project/project.vala:557\n#, c-format\nmsgid \"Load project file: %s\\n\"\nmsgstr \"Charger le fichier projet : %s\\n\"\n\n#: ../src/common/args.vala:45\nmsgid \"Load project from file.\"\nmsgstr \"Charger le projet depuis un fichier.\"\n\n#: ../src/project/project.vala:1614\n#, c-format\nmsgid \"Load project meta information: %s\\n\"\nmsgstr \"Charger les méta-information du projet : %s\\n\"\n\n#: ../guanako/guanako.vala:500\n#, c-format\nmsgid \"Load syntax file: %s\\n\"\nmsgstr \"Charger le fichier syntaxe : %s\\n\"\n\n#: ../src/ui/symbol_browser.vala:64 ../src/ui/symbol_browser.vala:68\n#: ../src/ui/symbol_browser.vala:72 ../src/ui/symbol_browser.vala:76\nmsgid \"Loading\"\nmsgstr \"Chargement\"\n\n#: ../src/dialogs/create_project.vala:561 ../src/ui/reports.vala:73\n#: ../src/ui/welcome_screen.vala:670\nmsgid \"Location\"\nmsgstr \"Lieu\"\n\n#. TRANSLATORS: Lock user interface elements to prevent moving them around.\n#: ../src/ui_main.vala:363\nmsgid \"Lock elements\"\nmsgstr \"Verrouiller les éléments\"\n\n#: ../guanako/guanako.vala:835 ../guanako/guanako.vala:847\n#: ../guanako/guanako.vala:865 ../guanako/guanako.vala:935\n#, c-format\nmsgid \"Malformed rule: '%s'\\n\"\nmsgstr \"Règle malformée : '%s'\\n\"\n\n#: ../src/dialogs/missing_packages.vala:27\nmsgid \"Missing packages\"\nmsgstr \"Paquets manquants\"\n\n#: ../src/dialogs/create_project.vala:155\nmsgid \"Missing packages: \"\nmsgstr \"Paquets manquants : \"\n\n#: ../src/common/common.vala:485\n#, c-format\nmsgid \"Move from '%s' to '%s'.\\n\"\nmsgstr \"Déplacement de '%s' vers '%s'.\\n\"\n\n#: ../src/common/common.vala:359\nmsgid \"Moving finished.\\n\"\nmsgstr \"Déplacement terminé.\\n\"\n\n#: ../src/ui/source_viewer.vala:299 ../src/ui/source_viewer.vala:630\nmsgid \"New document\"\nmsgstr \"Nouveau document\"\n\n#: ../src/dialogs/create_project.vala:565 ../src/ui/welcome_screen.vala:675\nmsgid \"New project location\"\nmsgstr \"Nouveau lieu pour le projet\"\n\n#: ../src/ui/welcome_screen.vala:480\nmsgid \"Next\"\nmsgstr \"Suivant\"\n\n#: ../src/dialogs/about.vala:49\nmsgid \"Next generation Vala IDE\"\nmsgstr \"Next generation Vala IDE\"\n\n#. TRANSLATORS: E.g.: No `glib-2.0' package found.\n#: ../src/buildsystem/plain.vala:54\n#, c-format\nmsgid \"No '%s' package found.\\n\"\nmsgstr \"Le paquet '%s' n'a pas été trouvé.\\n\"\n\n#: ../src/ui/current_symbol.vala:48 ../src/ui/current_symbol.vala:75\nmsgid \"No current symbol\"\nmsgstr \"Pas de symbole courant\"\n\n#: ../src/buildsystem/cmake.vala:216 ../src/buildsystem/cmake.vala:250\nmsgid \"No data to clean.\\n\"\nmsgstr \"Pas de données à nettoyer.\\n\"\n\n#. TRANSLATORS:\n#. A \"capturing group\" is used to group (and possibly mark) expressions\n#. within regular expressions for later use. Usually they are numbered\n#. so we can access them over an index.\n#: ../guanako/stylecheck.vala:456\n#, c-format\nmsgid \"No default capturing group ('matchgroup'). Set it to 0: %s\\n\"\nmsgstr \"Pas de groupe de capture par default ('matchgroup'). Mis à 0 : %s\\n\"\n\n#: ../src/project/project.vala:1998\nmsgid \"No file selected.\\n\"\nmsgstr \"Pas de fichier sélectionné.\\n\"\n\n#: ../src/project/project.vala:1358\n#, c-format\nmsgid \"No packages to choose between: line %hu\\n\"\nmsgstr \"Pas de paquets à choisir entre : ligne %hu\\n\"\n\n#: ../src/ui/welcome_screen.vala:406\nmsgid \"No recent projects\"\nmsgstr \"Pas de projets recents\"\n\n#: ../src/ui/source_viewer.vala:574\n#, c-format\nmsgid \"No such file found in opened buffers: %s\\n\"\nmsgstr \"Fichier non trouvé dans les zones tampons ouvertes : %s\\n\"\n\n#: ../src/common/common.vala:223\nmsgid \"No such file.\"\nmsgstr \"Fichier inexistant.\"\n\n#: ../guanako/guanako.vala:119\n#, c-format\nmsgid \"Not a valid Vala version, will  not set VALA_X_Y defines: %s\\n\"\nmsgstr \"\"\n\"Pas une version valide de Vala, les defines VALA_X_Y ne seront pas définis : \"\n\"%s\\n\"\n\n#: ../src/common/common.vala:310\n#, c-format\nmsgid \"Not enough space available: %lld < %lld\"\nmsgstr \"Pas assez de place disponible : %lld < %lld\"\n\n#: ../guanako/reporter.vala:45\nmsgid \"Note\"\nmsgstr \"Note\"\n\n#. TRANSLATORS: overwrite input mode\n#: ../src/ui/source_viewer.vala:394 ../src/ui/source_viewer.vala:400\nmsgid \"OVR\"\nmsgstr \"REMPL\"\n\n#: ../src/dialogs/project_settings.vala:27 ../src/ui/welcome_screen.vala:299\n#: ../src/ui/welcome_screen.vala:304 ../src/ui_main.vala:300\nmsgid \"Open project\"\nmsgstr \"Ouvrir projet\"\n\n#: ../src/ui/welcome_screen/main_screen.vala:108\nmsgid \"Other project...\"\nmsgstr \"Autre projet...\"\n\n#: ../src/common/args.vala:41\nmsgid \"Output debug information.\"\nmsgstr \"Afficher information de debug.\"\n\n#. TRANSLATORS:\n#. That means we know \"`package' >= \". Something is missing, isn't it?\n#: ../src/project/project.vala:2193\n#, c-format\nmsgid \"Package '%s' has relation information but no version: \"\nmsgstr \"Le paquet '%s' des information de relation mais pas de version : \"\n\n#: ../src/project/project.vala:942 ../src/project/project.vala:959\n#, c-format\nmsgid \"Package '%s' not in list, skip it.\\n\"\nmsgstr \"Le paquet '%s' n'est pas dans la liste : ignoré.\\n\"\n\n#: ../src/dialogs/create_project.vala:419 ../src/ui/project_browser.vala:300\n#: ../src/ui/project_browser.vala:338\nmsgid \"Packages\"\nmsgstr \"Paquets\"\n\n#: ../guanako/guanako.vala:966\n#, c-format\nmsgid \"Parameter '%s' not found in '%s'\\n\"\nmsgstr \"Paramètre '%s' introuvable dans '%s'\\n\"\n\n#: ../src/completion_provider.vala:252\nmsgid \"Parameters:\\n\"\nmsgstr \"Paramètres :\\n\"\n\n#: ../src/common/args.vala:43\nmsgid \"Path to layout file.\"\nmsgstr \"Chemin vers le fichier d'agencement.\"\n\n#: ../src/main.vala:151\nmsgid \"Pixmap directory does not exist. No application icons can be used.\\n\"\nmsgstr \"\"\n\"Répertoire d'images inexistant. Aucune icones d'application ne peut être \"\n\"utilisée.\\n\"\n\n#: ../src/main.vala:174\n#, c-format\nmsgid \"Pixmap loading failed: %s\\n\"\nmsgstr \"Chargement de l'image échoué : %s\\n\"\n\n#: ../src/ui/source_viewer.vala:53\nmsgid \"Plain text\"\nmsgstr \"Simple texte\"\n\n#. TRANSLATORS: Very important string ;) . Thanks btw. for your translation!\n#: ../src/common/common.vala:742\n#, c-format\nmsgid \"Please report a bug!\\n\"\nmsgstr \"Signaler un bug SVP !\\n\"\n\n#: ../src/buildsystem/plain.vala:91\n#, c-format\nmsgid \"Prepare file for FrankenStein: %s\\n\"\nmsgstr \"Préparation du fichier pour FrankenStein : %s\\n\"\n\n#: ../src/ui/current_file_structure.vala:49\nmsgid \"Private\"\nmsgstr \"Privé\"\n\n#: ../src/dialogs/project_settings.vala:116 ../src/ui/project_browser.vala:41\n#: ../src/ui_main.vala:380\nmsgid \"Project\"\nmsgstr \"Projet\"\n\n#: ../src/buildsystem/base.vala:374\n#, c-format\nmsgid \"Project already built but executable does not exist: %s\\n\"\nmsgstr \"Projet construit mais l'exécutable n'existe pas : %s\\n\"\n\n#: ../src/ui_main.vala:173\nmsgid \"Project browser\"\nmsgstr \"Navigateur de projet\"\n\n#: ../guanako/stylecheck.vala:374\n#, c-format\nmsgid \"Project file to old: %s < %s\\n\"\nmsgstr \"Fichier projet trop vieux : %s < %s\\n\"\n\n#: ../src/project/project.vala:1276\n#, c-format\nmsgid \"Project file too old: %s < %s\"\nmsgstr \"Fichier projet trop vieux : %s < %s\"\n\n#: ../src/dialogs/create_project.vala:540\n#: ../src/dialogs/create_project.vala:549 ../src/ui/welcome_screen.vala:651\n#: ../src/ui/welcome_screen.vala:658\nmsgid \"Project name\"\nmsgstr \"Nom du projet\"\n\n#: ../src/dialogs/project_settings.vala:123\nmsgid \"Project name:\"\nmsgstr \"Nom du projet : \"\n\n#: ../src/dialogs/project_settings.vala:101\nmsgid \"Project settings\"\nmsgstr \"Paramètres du projet\"\n\n#. TRANSLATORS: Collector for completion proposals.\n#. This string is normally not visible.\n#: ../guanako/guanako.vala:570\nmsgid \"Proposal collector\"\nmsgstr \"Collecteur de propositions\"\n\n#: ../src/ui/welcome_screen.vala:312\nmsgid \"Quit\"\nmsgstr \"Quitter\"\n\n#: ../src/ui_main.vala:406\nmsgid \"Rebuild\"\nmsgstr \"Reconstruire\"\n\n#: ../src/ui/breakpoints.vala:107\nmsgid \"Received invalid ID. Try to rebuild.\"\nmsgstr \"Reçu un ID non valide. Essai de reconstruire.\"\n\n#: ../src/ui/welcome_screen.vala:279\nmsgid \"Recent projects\"\nmsgstr \"Projets récents\"\n\n#: ../src/ui_main.vala:522\nmsgid \"Redo last change\"\nmsgstr \"Rétablir\"\n\n#: ../src/project/project.vala:96\nmsgid \"Release\"\nmsgstr \"Release\"\n\n#: ../src/project/project.vala:1110\n#, c-format\nmsgid \"Remove build system file: %s\\n\"\nmsgstr \"Effacer le fichier du système de construction : %s\\n\"\n\n#: ../src/project/project.vala:1165\n#, c-format\nmsgid \"Remove data file: %s\\n\"\nmsgstr \"Effacer le fichier de données : %s\\n\"\n\n#: ../src/ui/project_browser.vala:204\nmsgid \"Remove file (from disk)\"\nmsgstr \"Supprimer le fichier (du disque)\"\n\n#: ../src/ui/project_browser.vala:197\nmsgid \"Remove package\"\nmsgstr \"Efacer le paquet\"\n\n#: ../src/project/project.vala:940 ../src/project/project.vala:957\n#, c-format\nmsgid \"Remove package: %s\\n\"\nmsgstr \"Efacer le paquet : %s\\n\"\n\n#: ../src/project/project.vala:1053\nmsgid \"Remove source file\"\nmsgstr \"Effacer le fichier source\"\n\n#: ../src/project/project.vala:1050\n#, c-format\nmsgid \"Remove source file: %s\\n\"\nmsgstr \"Effacer le fichier source : %s\\n\"\n\n#: ../src/ui_main.vala:169\nmsgid \"Report widget\"\nmsgstr \"Rapport\"\n\n#. TRANSLATORS:\n#. Returns a return value (programming).\n#: ../src/completion_provider.vala:255\nmsgid \"Returns:\\n\"\nmsgstr \"Retours chariots:\\n\"\n\n#: ../src/ui_main.vala:432\nmsgid \"Run\"\nmsgstr \"Executer\"\n\n#. TRANSLATORS: E.g. \"Run project browser update!\"\n#: ../src/ui/breakpoints.vala:230 ../src/ui/current_file_structure.vala:102\n#: ../src/ui/current_symbol.vala:70 ../src/ui/project_browser.vala:275\n#: ../src/ui/reports.vala:154 ../src/ui/search.vala:245\n#: ../src/ui/source_viewer.vala:624 ../src/ui/symbol_browser.vala:120\n#, c-format\nmsgid \"Run %s update!\\n\"\nmsgstr \"Exécute la mise à jour de %s !\\n\"\n\n#: ../src/common/args.vala:59\n#, c-format\nmsgid \"Run '%s --help' to see a full list of available command line options.\\n\"\nmsgstr \"\"\n\"Exécuter '%s --help' pour voir la liste complète des options disponibles de \"\n\"la ligne de commande.\\n\"\n\n#: ../src/ui_main.vala:552\nmsgid \"Run application\"\nmsgstr \"Exécuter l'application\"\n\n#: ../src/ui/build_output.vala:80\nmsgid \"Running...\"\nmsgstr \"Exécution...\"\n\n#: ../src/ui_main.vala:718\n#, c-format\nmsgid \"Save Ui meta information: %s\\n\"\nmsgstr \"Sauvegarder les méta-informations de l'IU : %s\\n\"\n\n#: ../src/ui_main.vala:308\nmsgid \"Save all\"\nmsgstr \"Sauvegarder tout\"\n\n#: ../src/ui_main.vala:504\nmsgid \"Save current file\"\nmsgstr \"Sauvegarder le fichier courant\"\n\n#: ../src/ui_main.vala:544\nmsgid \"Save current file and build project\"\nmsgstr \"Sauvegarder le fichier courant et construire le projet\"\n\n#: ../src/project/project.vala:1496\nmsgid \"Save project file.\\n\"\nmsgstr \"Sauvegarder le fichier projet.\\n\"\n\n#: ../src/project/project.vala:1597\n#, c-format\nmsgid \"Save project meta information: %s\\n\"\nmsgstr \"Sauvegarder les méta-information du projet : %s\\n\"\n\n#: ../src/ui/search.vala:59 ../src/ui_main.vala:185\nmsgid \"Search\"\nmsgstr \"Chercher\"\n\n#: ../src/ui/welcome_screen.vala:620\nmsgid \"Select Valama project file\"\nmsgstr \"Sélectionner un fichier projet Valama\"\n\n#: ../src/ui/project_browser.vala:325\nmsgid \"Select new packages\"\nmsgstr \"Sélectionner de nouveaux paquets\"\n\n#: ../src/dialogs/create_project.vala:193\nmsgid \"Select template\"\nmsgstr \"Sélectionner un modèle\"\n\n#: ../src/ui/project_browser.vala:100 ../src/ui_main.vala:386\nmsgid \"Settings\"\nmsgstr \"Paramètres\"\n\n#: ../src/ui_main.vala:355\nmsgid \"Show application output\"\nmsgstr \"Sortie de l'application\"\n\n#: ../src/ui_main.vala:356\nmsgid \"Show breakpoints\"\nmsgstr \"Points d'arrêt\"\n\n#: ../src/ui_main.vala:354\nmsgid \"Show build output\"\nmsgstr \"Sortie du processus de construction\"\n\n#: ../src/ui_main.vala:357\nmsgid \"Show current file structure\"\nmsgstr \"Structure du fichier courant\"\n\n#: ../src/ui_main.vala:360\nmsgid \"Show current symbol\"\nmsgstr \"Symbole courant\"\n\n#: ../src/ui_main.vala:353\nmsgid \"Show project browser\"\nmsgstr \"Navigateur de projet\"\n\n#: ../src/ui_main.vala:352\nmsgid \"Show reports\"\nmsgstr \"Rapports\"\n\n#: ../src/ui_main.vala:351\nmsgid \"Show search\"\nmsgstr \"Recherches\"\n\n#: ../src/ui_main.vala:358\nmsgid \"Show style checker\"\nmsgstr \"Vérificateur de style\"\n\n#: ../src/ui_main.vala:359\nmsgid \"Show symbol browser\"\nmsgstr \"Navigateur de symboles\"\n\n#: ../src/common/common.vala:443\n#, c-format\nmsgid \"Skip %s\\n\"\nmsgstr \"Ignorer %s\\n\"\n\n#: ../src/project/project.vala:1737 ../src/project/project.vala:1747\n#, c-format\nmsgid \"Skip '%s' choice.\\n\"\nmsgstr \"Ignorer le choix '%s'.\\n\"\n\n#: ../src/project/project.vala:1035 ../src/project/project.vala:1097\n#: ../src/project/project.vala:1152\n#, c-format\nmsgid \"Skip already added file: %s\\n\"\nmsgstr \"Ignorer le fichier déjà ajouté : %s\\n\"\n\n#: ../src/dialogs/project_settings.vala:88\n#, c-format\nmsgid \"Skip already loaded project: %s\\n\"\nmsgstr \"Ignorer le projet déjà chargé : %s\\n\"\n\n#: ../src/common/common.vala:455\n#, c-format\nmsgid \"Skip overwrite from '%s' to '%s'.\\n\"\nmsgstr \"Ignorer écrasement de '%s' sur '%s'.\\n\"\n\n#: ../src/project/project.vala:1008\n#, c-format\nmsgid \"Source directory does not exist: %s\\n\"\nmsgstr \"Répertoire source inexistant : %s\\n\"\n\n#: ../src/project/project.vala:1006\n#, c-format\nmsgid \"Source file does not exist: %s\\n\"\nmsgstr \"Fichier source inexistant : %s\\n\"\n\n#: ../src/project/project.vala:668\nmsgid \"Source file update\"\nmsgstr \"Mise à jour fichier source\"\n\n#: ../src/dialogs/create_project.vala:473\nmsgid \"Source files\"\nmsgstr \"Fichier source\"\n\n#: ../src/ui_main.vala:165\nmsgid \"Source view\"\nmsgstr \"Vue source\"\n\n#: ../src/ui/source_viewer.vala:470\nmsgid \"Source view id out of range.\\n\"\nmsgstr \"Id de vue source hors de portée.\\n\"\n\n#: ../src/ui/project_browser.vala:285\nmsgid \"Sources\"\nmsgstr \"Sources\"\n\n#: ../src/dialogs/create_project.vala:726\n#, c-format\nmsgid \"Substitute: '@%s@'%s -> '%s': %s\\n\"\nmsgstr \"Substituer : '@%s@'%s -> '%s': %s\\n\"\n\n#: ../src/ui/build_output.vala:98\nmsgid \"Succeeded\"\nmsgstr \"Réussi\"\n\n#: ../src/dialogs/create_project.vala:363\nmsgid \"Supported Vala versions\"\nmsgstr \"Versions Vala supportées\"\n\n#: ../src/ui/symbol_browser.vala:44\nmsgid \"Symbol\"\nmsgstr \"Symbole\"\n\n#: ../src/ui_main.vala:201\nmsgid \"Symbol browser\"\nmsgstr \"Navigateur de symboles\"\n\n#: ../src/project/project_templates.vala:221\n#, c-format\nmsgid \"Template file '%s' too old: %s < %s\"\nmsgstr \"Fichier modèle '%s' trop vieux : %s < %s\"\n\n#: ../src/project/project_templates.vala:306\n#, c-format\nmsgid \"Template has no description: line %hu\"\nmsgstr \"Le modèle n'a pas de description : ligne %hu\"\n\n#: ../src/project/project_templates.vala:299\n#, c-format\nmsgid \"Template has no name: line %hu\"\nmsgstr \"Le modèle n'a pas de nom : ligne %hu\"\n\n#: ../src/dialogs/create_project.vala:79\nmsgid \"Template information\"\nmsgstr \"Informations du modèle\"\n\n#: ../src/dialogs/create_project.vala:125\nmsgid \"Templates\"\nmsgstr \"Modèles\"\n\n#: ../src/common/args.vala:37\nmsgid \"Templates directory.\"\nmsgstr \"Répertoire des modèles.\"\n\n#: ../src/dialogs/missing_packages.vala:36\nmsgid \"The following vala packages are not available on your system:\\n\"\nmsgstr \"Les paquets suivants sont indisponibles sur votre système :\\n\"\n\n#: ../src/ui/breakpoints.vala:67\nmsgid \"Time\"\nmsgstr \"Heure\"\n\n#. TRANSLATORS: Type in programming context as data type.\n#: ../src/ui/symbol_browser.vala:48\nmsgid \"Type\"\nmsgstr \"Type\"\n\n#: ../guanako/stylecheck.vala:575 ../guanako/stylecheck.vala:616\n#, c-format\nmsgid \"Type not implemented yet: %s\\n\"\nmsgstr \"Type pas encore implémenté : %s\\n\"\n\n#: ../src/ui/project_browser.vala:546\n#, c-format\nmsgid \"Unable to delete source file '%s': %s\\n\"\nmsgstr \"Impossible d'effacer le fichier source '%s' : %s\\n\"\n\n#: ../src/buildsystem/base.vala:361\n#, c-format\nmsgid \"Unable to guess package for define: %s\\n\"\nmsgstr \"Impossible de deviner le paquet pour la définition : %s\\n\"\n\n#: ../src/ui_main.vala:515\nmsgid \"Undo last change\"\nmsgstr \"Annuler le dernier changement\"\n\n#: ../src/dialogs/create_project.vala:397\n#: ../src/dialogs/project_settings.vala:207\n#, c-format\nmsgid \"Unexpected enum value: %s: %d\\n\"\nmsgstr \"énumération inattendue : %s : %d\\n\"\n\n#: ../src/ui/project_browser.vala:467\n#, c-format\nmsgid \"Unexpected enum value: %s: %s\\n\"\nmsgstr \"énumération inattendue : %s : %s\\n\"\n\n#: ../src/common/common.vala:500 ../src/dialogs/about.vala:66\n#: ../src/project/project.vala:274 ../src/project/project_templates.vala:108\n#: ../src/ui/project_browser.vala:145 ../src/ui/project_browser.vala:210\n#: ../src/ui/project_browser.vala:471 ../src/ui/project_browser.vala:554\n#, c-format\nmsgid \"Unexpected enum value: %s: %u\\n\"\nmsgstr \"énumération inattendue : %s : %u\\n\"\n\n#: ../src/project/project.vala:1690 ../src/project/project.vala:2057\n#, c-format\nmsgid \"Unexpected response value: %s - %u\"\nmsgstr \"Valeur réponse inattendue : %s - %u\"\n\n#: ../src/ui/reports.vala:192 ../src/ui/source_viewer.vala:213\n#, c-format\nmsgid \"Unknown ReportType: %s\\n\"\nmsgstr \"ReportType inconnu : %s\\n\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:413 ../src/ui/project_browser.vala:451\n#: ../src/ui/project_browser.vala:533\n#, c-format\nmsgid \"Unknown TreePath start to add a new file: %s\\n\"\nmsgstr \"\"\n\"Début de chemin d'arborescence inconnu pour ajouter un nouveau fichier : %s\\n\"\n\n#: ../src/project/project.vala:1650 ../src/ui_main.vala:776\n#, c-format\nmsgid \"Unknown attribute for '%s' line %hu: %s\\n\"\nmsgstr \"Attribut inconnu pour '%s' ligne %hu : %s\\n\"\n\n#: ../src/project/project.vala:1310 ../src/project/project.vala:1351\n#: ../src/project/project.vala:1366 ../src/project/project.vala:1380\n#: ../src/project/project.vala:1394 ../src/project/project.vala:1408\n#: ../src/project/project.vala:1422 ../src/project/project.vala:1436\n#: ../src/project/project.vala:1450 ../src/project/project.vala:1464\n#: ../src/project/project.vala:1470 ../src/project/project.vala:1654\n#: ../src/project/project_templates.vala:290\n#: ../src/project/project_templates.vala:352\n#: ../src/project/project_templates.vala:358 ../src/ui_main.vala:782\n#, c-format\nmsgid \"Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"Valeur de fichier de configuration inconnue ligne %hu : %s\\n\"\n\n#: ../src/buildsystem/base.vala:343\n#, c-format\nmsgid \"Unknown package version relation: %s - %s\\n\"\nmsgstr \"Relation de vertion de paquet inconnue : %s - %s\\n\"\n\n#: ../src/project/project.vala:1332 ../src/project/project.vala:2182\n#: ../src/project/project_templates.vala:263\n#, c-format\nmsgid \"Unknown property for '%s' line %hu: %s\\n\"\nmsgstr \"Propriété inconnue pour '%s' ligne %hu : %s\\n\"\n\n#: ../src/buildsystem/base.vala:152\n#, c-format\nmsgid \"Unknown status: %d - %s\\n\"\nmsgstr \"Statut inconnu : %d - %s\\n\"\n\n#: ../src/project/project_templates.vala:344\n#, c-format\nmsgid \"Unknown value for substitution property '%s' line %hu (assume '%s'): %s\"\nmsgstr \"\"\n\"Valeur de propriété de substitution '%s' inconnue ligne %hu (suppose '%s') : \"\n\"%s\"\n\n#: ../src/ui/project_browser.vala:304\nmsgid \"User interface files\"\nmsgstr \"Interfaces utilisateur\"\n\n#: ../build/data/valama.desktop.in.h:4\nmsgid \"Vala;IDE;Development;\"\nmsgstr \"Vala;EDI;Développement\"\n\n#: ../src/main.vala:104\nmsgid \"Valama\"\nmsgstr \"Valama\"\n\n#: ../src/dialogs/project_settings.vala:42 ../src/ui/welcome_screen.vala:583\nmsgid \"Valama project files (*.vlp)\"\nmsgstr \"Fichiers projet Valama (*.vlp)\"\n\n#: ../src/buildsystem/base.vala:100\nmsgid \"Valama project not initialized\"\nmsgstr \"Projet Valama non initialisé\"\n\n#: ../src/buildsystem/cmake.vala:46\nmsgid \"Valama project not initialized.\"\nmsgstr \"Projet Valama non initialisé.\"\n\n#: ../guanako/guanako.vala:287 ../guanako/guanako.vala:300\n#, c-format\nmsgid \"Vapi found: %s\\n\"\nmsgstr \"Vapi trouvée : %s\\n\"\n\n#: ../guanako/guanako.vala:876\n#, c-format\nmsgid \"Variable '%s' not found! >%s<\\n\"\nmsgstr \"Variable '%s' non trouvé ! >%s<\\n\"\n\n#: ../src/dialogs/project_settings.vala:151\nmsgid \"Version:\"\nmsgstr \"Version : \"\n\n#: ../build/data/org.valama.gschema.xml.h:2\nmsgid \"Vertical window size\"\nmsgstr \"Taille verticale de la fenêtre\"\n\n#: ../src/ui_main.vala:346\nmsgid \"View\"\nmsgstr \"Affichage\"\n\n#: ../src/dialogs/project_settings.vala:38\nmsgid \"View all files (*)\"\nmsgstr \"Afficher tous les fichiers (*)\"\n\n#: ../guanako/reporter.vala:39\nmsgid \"Warning\"\nmsgstr \"Attention\"\n\n#: ../src/common/common.vala:733\n#, c-format\nmsgid \"Warning: \"\nmsgstr \"Attention : \"\n\n#. TRANSLATORS: This is a technical information. You migth not\n#. want to translate \"CheckType\".\n#: ../guanako/stylecheck.vala:473\n#, c-format\nmsgid \"Warning: No CheckType found, assume 'GLOBAL'.\\n\"\nmsgstr \"Attention : pas de type de contrôle trouvé, suppose 'GLOBAL'.\\n\"\n\n#: ../guanako/stylecheck.vala:467\n#, c-format\nmsgid \"Warning: No description found.\\n\"\nmsgstr \"Attention : Pas de description trouvée.\\n\"\n\n#: ../guanako/stylecheck.vala:447\n#, c-format\nmsgid \"Warning: No regex to check.\\n\"\nmsgstr \"Attention : Pas de regec à vérifier.\\n\"\n\n#: ../guanako/stylecheck.vala:397\n#, c-format\nmsgid \"Warning: Skip different description: '%s' - '%s'\\n\"\nmsgstr \"Attention : ignore descriptions différentes : '%s' - '%s'\\n\"\n\n#: ../guanako/stylecheck.vala:437\n#, c-format\nmsgid \"Warning: Skip different match groups: '%d' - '%d'\\n\"\nmsgstr \"Attention : ignore différents match groups : '%d' - '%d'\\n\"\n\n#: ../guanako/stylecheck.vala:427\n#, c-format\nmsgid \"Warning: Skip different regexes: '%s' - '%s'\\n\"\nmsgstr \"Attention : ignore différentes regex : '%s' - '%s'\\n\"\n\n#: ../guanako/stylecheck.vala:410\n#, c-format\nmsgid \"Warning: Skip different type: '%s' - '%s'\\n\"\nmsgstr \"Attention : ignore differents types : '%s' - '%s'\\n\"\n\n#: ../guanako/stylecheck.vala:408\n#, c-format\nmsgid \"Warning: Unknown CheckType '%s', assume 'GLOBAL'.\\n\"\nmsgstr \"Attention : type de contrôle '%s' inconnu, suppose 'GLOBAL'.\\n\"\n\n#: ../guanako/stylecheck.vala:619\n#, c-format\nmsgid \"Warning: Unknown CheckType: %s\\n\"\nmsgstr \"Attention : type de vérification inconnu : %s\\n\"\n\n#: ../guanako/stylecheck.vala:442 ../guanako/stylecheck.vala:461\n#, c-format\nmsgid \"Warning: Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"\"\n\"Attention : valeur de fichier de configuration inconnue à la ligne %hu : %s\\n\"\n\n#: ../guanako/guanako.vala:283 ../guanako/guanako.vala:296\n#, c-format\nmsgid \"Warning: Vapi for package %s not found.\\n\"\nmsgstr \"Attention : Vapi introuvable pour le paquet %s.\\n\"\n\n#: ../src/project/project.vala:1242\n#, c-format\nmsgid \"Will not add '%s' to file list: File not valid\\n\"\nmsgstr \"'%s' non ajouté à la liste des fichiers : fichier non valide\\n\"\n\n#: ../src/common/args.vala:41\nmsgid \"[DEBUGLEVEL]\"\nmsgstr \"[NIVEAU DE DEBOGAGE]\"\n\n#: ../src/common/args.vala:45\nmsgid \"[FILE...]\"\nmsgstr \"[FICHIER...]\"\n\n#: ../src/ui_main.vala:432\nmsgid \"_Build\"\nmsgstr \"Construire\"\n\n#: ../src/ui_main.vala:513\nmsgid \"_Clean\"\nmsgstr \"Nettoyer\"\n\n#: ../src/ui_main.vala:417\nmsgid \"_Project\"\nmsgstr \"Projet\"\n\n#: ../src/ui_main.vala:422\nmsgid \"_Settings\"\nmsgstr \"Réglages\"\n\n#. TRANSLATORS: Version relation: X > Y\n#: ../src/dialogs/create_project.vala:375\nmsgid \"after\"\nmsgstr \"après\"\n\n#. TRANSLATORS: Version relation: X < Y\n#: ../src/dialogs/create_project.vala:387\nmsgid \"before\"\nmsgstr \"avant\"\n\n#: ../src/buildsystem/cmake.vala:166\nmsgid \"build command failed\"\nmsgstr \"Construction échouée\"\n\n#. TRANSLATORS: Choice of different packages.\n#: ../src/project/project.vala:910\n#, c-format\nmsgid \"choice\"\nmsgstr \"choix\"\n\n#\n#: ../src/buildsystem/cmake.vala:226\nmsgid \"clean command failed\"\nmsgstr \"Commande nettoyage échouée\"\n\n#: ../src/buildsystem/cmake.vala:133\nmsgid \"configure command failed\"\nmsgstr \"configuration échouée\"\n\n#: ../src/buildsystem/base.vala:117\n#, c-format\nmsgid \"directory creation failed: %s\"\nmsgstr \"création de répertoire échoué : %s\"\n\n#: ../src/buildsystem/cmake.vala:260\n#, c-format\nmsgid \"distclean command failed: %s\"\nmsgstr \"Commande distclean échouée : %s\"\n\n#: ../src/common/common.vala:525\nmsgid \"file does not exist\"\nmsgstr \"Le fichier n'existe pas.\"\n\n#: ../src/dialogs/create_file.vala:68\nmsgid \"filename\"\nmsgstr \"nom de fichier\"\n\n#. TRANSLATORS:\n#. Context: Add new file to project (inside `foobar' directory)\n#: ../src/dialogs/create_file.vala:57\n#, c-format\nmsgid \"inside '%s' directory\"\nmsgstr \"dans le répertoire '%s'\"\n\n#: ../src/dialogs/create_file.vala:58\n#, c-format\nmsgid \"inside project root directory\"\nmsgstr \"dans le répertoire racine du projet\"\n\n#: ../src/buildsystem/base.vala:385\nmsgid \"launching failed\"\nmsgstr \"lancement échoué\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:30\nmsgid \"make library\"\nmsgstr \"construire une bibliothèque\"\n\n#: ../src/dialogs/create_project.vala:284\nmsgid \"no long description\"\nmsgstr \"pas de description longue\"\n\n#: ../src/dialogs/create_project.vala:463\nmsgid \"no package required\"\nmsgstr \"pas de paquet requis\"\n\n#: ../src/common/common.vala:552\nmsgid \"no regular file or directory\"\nmsgstr \"pas de fichier ou répertoire normal\"\n\n#: ../src/dialogs/create_project.vala:485\nmsgid \"no source files\"\nmsgstr \"pas de fichiers sources\"\n\n#. TRANSLATORS: Context: Parameters: none\n#: ../src/completion_provider.vala:251\nmsgid \"none\"\nmsgstr \"aucun\"\n\n#: ../src/dialogs/create_project.vala:437\nmsgid \"not available\"\nmsgstr \"indisponible\"\n\n#. TRANSLATORS: Version relation: X != Y\n#: ../src/dialogs/create_project.vala:394\nmsgid \"not supported\"\nmsgstr \"non supporté\"\n\n#: ../src/ui/welcome_screen/create_project_packages.vala:32\nmsgid \"packages for current project\"\nmsgstr \"paquets pour le projet courant\"\n\n#: ../guanako/guanako.vala:857\n#, c-format\nmsgid \"pop_cur symbol not found! '%s'\\n\"\nmsgstr \"Symbole pop_cur non trouvé : '%s'\\n\"\n\n#: ../src/ui/welcome_screen/create_project_location.vala:69\nmsgid \"project name\"\nmsgstr \"nom du projet\"\n\n#. TRANSLATORS: Version relation: X >= Y\n#: ../src/dialogs/create_project.vala:379\nmsgid \"since\"\nmsgstr \"depuis\"\n\n#. TRANSLATORS: Version relation: X <= Y\n#: ../src/dialogs/create_project.vala:383\nmsgid \"until\"\nmsgstr \"jusqu'à\"\n\n#: ../src/project/project.vala:396\nmsgid \"valama_project\"\nmsgstr \"projet_valama\"\n"
  },
  {
    "path": "po/valama.pot",
    "content": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n#\n#, fuzzy\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Valama 0.1.2\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2013-05-30 21:20+0200\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@->>> (line)<<<- -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:673\n#: ../src/dialogs/create_project.vala:727\nmsgid \" (line)\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:621 ../src/project/project.vala:623\n#, c-format\nmsgid \"%s - Vala\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. E.g.: Warning found: myfile.vala: 12(13)-12(17): unused variable `test'\n#: ../src/ui/reports.vala:231\n#, c-format\nmsgid \"%s found: %s: %d(%d)-%d(%d): %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished ...\"\n#: ../src/ui/current_file_structure.vala:107\n#, c-format\nmsgid \"%s update finished (not a valid source buffer)!\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished!\"\n#: ../src/ui/breakpoints.vala:297 ../src/ui/current_file_structure.vala:176\n#: ../src/ui/current_symbol.vala:153 ../src/ui/project_browser.vala:317\n#: ../src/ui/reports.vala:222 ../src/ui/search.vala:246\n#: ../src/ui/source_viewer.vala:625 ../src/ui/symbol_browser.vala:142\n#, c-format\nmsgid \"%s update finished!\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. E.g. \"CMake build failed: some error\" or \"Autotools build failed: some error\"\n#: ../src/project/build_project.vala:145\n#, c-format\nmsgid \"'%s' build failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:135 ../src/project/build_project.vala:186\n#: ../src/project/build_project.vala:222\n#, c-format\nmsgid \"'%s' cleaning failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:139\n#, c-format\nmsgid \"'%s' configuration failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:131 ../src/project/build_project.vala:182\n#: ../src/project/build_project.vala:218\n#, c-format\nmsgid \"'%s' initialization failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:78\n#, c-format\nmsgid \"'%s' not a positive number\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:149\n#, c-format\nmsgid \"'%s' tests failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:120\n#, c-format\nmsgid \"'Build' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:106\n#, c-format\nmsgid \"'Clean' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:125\n#, c-format\nmsgid \"'Configure' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:102 ../src/project/build_project.vala:177\n#: ../src/project/build_project.vala:213\n#, c-format\nmsgid \"'Distclean' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:97 ../src/project/build_project.vala:171\n#: ../src/project/build_project.vala:208\n#, c-format\nmsgid \"'Initialization' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:115\n#, c-format\nmsgid \"'Tests' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1801\nmsgid \"(new file)\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:52\nmsgid \"- Valama: next generation Vala IDE\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:190 ../src/ui/project_browser.vala:206\nmsgid \"Add new directory\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:185 ../src/ui/project_browser.vala:202\nmsgid \"Add new file\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. E.g.: \"Add new file to project (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:51\n#, c-format\nmsgid \"Add new file to project (%s)\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:177 ../src/ui/project_browser.vala:195\nmsgid \"Add new package\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:911 ../src/project/project.vala:922\n#, c-format\nmsgid \"Add package: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:726\n#, c-format\nmsgid \"Add project to recent manager: %s - %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/search.vala:71\nmsgid \"All files\"\nmsgstr \"\"\n\n#. TRANSLATORS: (*) is a file filter (globbing) and matches all files.\n#: ../src/ui/welcome_screen.vala:590\nmsgid \"All files (*)\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:531 ../src/project/project.vala:585\n#, c-format\nmsgid \"An error occurred while loading new Guanako project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/app_output.vala:39 ../src/ui_main.vala:181\nmsgid \"Application output\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:250\n#, c-format\nmsgid \"Application received signal: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:235\nmsgid \"Application still running. Quit it manually.\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:266\n#, c-format\nmsgid \"Application terminated with exit status '%d'.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:306\nmsgid \"Author\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:63\nmsgid \"Author information\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:308\nmsgid \"Authors\"\nmsgstr \"\"\n\n#. TRANSLATORS: Of course not the body part ;) .\n#. Go to the previous window.\n#: ../src/ui/welcome_screen.vala:430 ../src/ui_main.vala:480\nmsgid \"Back\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:189\nmsgid \"Breakpoints / Timers\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1911\nmsgid \"Buffer loaded.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1929\nmsgid \"Buffer update\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:393 ../src/ui_main.vala:399 ../src/ui_main.vala:542\nmsgid \"Build\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:70\n#, c-format\nmsgid \"Build command received signal: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. The user has to choose a directory where to build the application\n#. so it might be undefined.\n#: ../src/buildsystem/base.vala:429 ../src/buildsystem/cmake.vala:44\nmsgid \"Build directory not set.\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:177\nmsgid \"Build output\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:74\n#, c-format\nmsgid \"Build system '%s' currently not supported by template selector.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1715\n#, c-format\nmsgid \"Build system '%s' not supported.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1078\n#, c-format\nmsgid \"Build system directory does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1076\n#, c-format\nmsgid \"Build system file does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:289\nmsgid \"Build system files\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:40\nmsgid \"Build systems directory.\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:75\n#, c-format\nmsgid \"Buildsystem build finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:72\n#, c-format\nmsgid \"Buildsystem build started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:81\n#, c-format\nmsgid \"Buildsystem cleaning finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:78\n#, c-format\nmsgid \"Buildsystem cleaning started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:69\n#, c-format\nmsgid \"Buildsystem configuration finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:66\n#, c-format\nmsgid \"Buildsystem configuration started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:87\n#, c-format\nmsgid \"Buildsystem distcleaning finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:84\n#, c-format\nmsgid \"Buildsystem distcleaning started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:63\n#, c-format\nmsgid \"Buildsystem initialization finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:60\n#, c-format\nmsgid \"Buildsystem initialization started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:93\n#, c-format\nmsgid \"Buildsystem tests finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:90\n#, c-format\nmsgid \"Buildsystem tests started: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:943\n#, c-format\nmsgid \"Call '%s' not found in '%s'\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@ (line) -> 'barfoo'\"... or\n#. \"Cannot apply substitution @foobar@ -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:670\n#, c-format\nmsgid \"Cannot apply substitution '@%s@'%s -> '%s': %s does not exist\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:754\n#, c-format\nmsgid \"Cannot create temporary file '%s' to apply substitutions: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1264 ../src/project/project.vala:1620\n#: ../src/project/project_templates.vala:209 ../src/ui_main.vala:742\n#: ../guanako/stylecheck.vala:360\nmsgid \"Cannot parse file.\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:735\n#, c-format\nmsgid \"Cannot read file '%s': %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Change focus of source view to new file.\n#: ../src/ui/source_viewer.vala:66\n#, c-format\nmsgid \"Change current focus: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/stylechecker.vala:61\nmsgid \"Checker loaded.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1734 ../src/project/project.vala:1744\n#, c-format\nmsgid \"Choose '%s' package.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:36\nmsgid \"Choose directory name\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:35\nmsgid \"Choose filename\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:522\nmsgid \"Choose project template\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:419\nmsgid \"Clean\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:425\nmsgid \"Clean all\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:412\nmsgid \"Clean build\"\nmsgstr \"\"\n\n#: ../src/ui/app_output.vala:51\nmsgid \"Clear output\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:2062\nmsgid \"Close buffer.\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:482\nmsgid \"Close project\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:278\n#, c-format\nmsgid \"Close view and buffer: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:197\nmsgid \"Coding style checker\"\nmsgstr \"\"\n\n#: ../src/dialogs/missing_packages.vala:39\nmsgid \"Compiling and auto completion might fail!\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:66\nmsgid \"Completion\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:471\n#, c-format\nmsgid \"Copy from '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:348\nmsgid \"Copying finished.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:50\nmsgid \"Copyright © 2012, 2013 Valama development team\"\nmsgstr \"\"\n\n#: ../guanako/guanako_frankenstein.vala:31\n#, c-format\nmsgid \"Could not acquire name.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:732\nmsgid \"Could not add project to recent manager.\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Could not change source view focus to new file.\n#: ../src/ui/source_viewer.vala:236\n#, c-format\nmsgid \"Could not change focus to: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:759\n#: ../src/dialogs/create_project.vala:792\n#, c-format\nmsgid \"Could not close file descriptor for '%s': %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Context: \"Could not close source view (mapping) for: myfile.vala\"\n#: ../src/project/project.vala:1190\n#, c-format\nmsgid \"Could not close source view (mapping) for: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:274\n#, c-format\nmsgid \"Could not close view: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:69\n#, c-format\nmsgid \"Could not compare project files inodes: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:135\n#, c-format\nmsgid \"Could not convert '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:66 ../src/project/project.vala:98\n#: ../src/project/project.vala:117\n#, c-format\nmsgid \"Could not convert '%s' to string: %u\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:586\n#, c-format\nmsgid \"Could not convert all characters: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:623\n#, c-format\nmsgid \"Could not copy templates for new project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:278\n#, c-format\nmsgid \"Could not create cache directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:120\n#, c-format\nmsgid \"Could not create new directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:110\n#, c-format\nmsgid \"Could not create new file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:102\n#, c-format\nmsgid \"Could not create parent directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1942\n#, c-format\nmsgid \"Could not create thread to update buffer: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:679\n#, c-format\nmsgid \"Could not create thread to update source files: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:690\n#, c-format\nmsgid \"Could not determine file path: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is an technical information. You might not want\n#. to translate \"ScrolledWindow\".\n#: ../src/ui/source_viewer.vala:550\n#, c-format\nmsgid \"Could not find ScrolledWindow widget: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:316\n#, c-format\nmsgid \"Could not find pkg-config file for '%s'. \"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:378 ../src/ui/project_browser.vala:481\n#, c-format\nmsgid \"Could not get current TreePath: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreeView\".\n#: ../src/ui/project_browser.vala:115 ../src/ui/project_browser.vala:127\n#: ../src/ui/project_browser.vala:166 ../src/ui/project_browser.vala:386\n#: ../src/ui/project_browser.vala:425 ../src/ui/project_browser.vala:487\n#: ../src/ui/project_browser.vala:505\n#, c-format\nmsgid \"Could not get iterator in TreeView: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:595\n#, c-format\nmsgid \"Could not initialize build system: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/ui_elements.vala:118\nmsgid \"Could not initialize locking signals.\\n\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:175\n#, c-format\nmsgid \"Could not launch completion thread successfully: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:701 ../src/main.vala:178\n#: ../src/project/project.vala:822 ../src/project/project.vala:866\n#, c-format\nmsgid \"Could not list or iterate through directory content of '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1033\n#, c-format\nmsgid \"Could not load Vala source file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:245\n#, c-format\nmsgid \"Could not load Valama text logo: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1862 ../src/ui/source_viewer.vala:373\n#, c-format\nmsgid \"Could not load completion: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:279\n#, c-format\nmsgid \"Could not load file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:185\n#, c-format\nmsgid \"Could not load icon theme: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:575 ../src/ui_main.vala:241\n#, c-format\nmsgid \"Could not load meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:79 ../src/ui/welcome_screen.vala:372\n#, c-format\nmsgid \"Could not load new project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:170\n#, c-format\nmsgid \"Could not load pixmap: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:143\n#, c-format\nmsgid \"Could not load project template: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:631\n#, c-format\nmsgid \"Could not load project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:231\n#, c-format\nmsgid \"Could not load template '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:198\n#, c-format\nmsgid \"Could not load template image: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:310\n#, c-format\nmsgid \"Could not load vapi: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1232\n#, c-format\nmsgid \"Could not open directory or file in '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:104 ../src/common/common.vala:636\n#, c-format\nmsgid \"Could not open file writable: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:109\n#, c-format\nmsgid \"Could not open file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:172\n#, c-format\nmsgid \"Could not open pixmaps file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:53\n#, c-format\nmsgid \"Could not operate on directory: %s\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:366\n#, c-format\nmsgid \"Could not process files in template directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:786\n#, c-format\nmsgid \"Could not read file '%s' properly: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:79\n#, c-format\nmsgid \"Could not read file content of '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:51 ../guanako/guanako.vala:1294\n#, c-format\nmsgid \"Could not read file: %s\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:107\n#, c-format\nmsgid \"Could not read file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:1292\n#, c-format\nmsgid \"Could not read line: %s\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:528 ../src/project/project.vala:582\n#, c-format\nmsgid \"Could not read syntax file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_frankenstein.vala:45\n#, c-format\nmsgid \"Could not register service.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1481\nmsgid \"Could not select a package from choice.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:74\n#, c-format\nmsgid \"Could not select current source view: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:675\n#, c-format\nmsgid \"Could not spawn pkg-config package existence check: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:553\n#, c-format\nmsgid \"Could not spawn subprocess: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:366\n#, c-format\nmsgid \"Could not unload completion: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:796\n#, c-format\nmsgid \"\"\n\"Could not update file '%s' with '%s' (temporary file may still exist): %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:101 ../src/common/common.vala:634\n#, c-format\nmsgid \"Could not update file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_helpers.vala:45\n#, c-format\nmsgid \"Could not update vapi files: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:107\n#, c-format\nmsgid \"Could not write to new file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:781\n#, c-format\nmsgid \"Could not write to temporary file '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:72\n#, c-format\nmsgid \"Couldn't load Valama project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:340\n#, c-format\nmsgid \"Couldn't load layout file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:354\n#, c-format\nmsgid \"Couldn't load layout: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:639\n#, c-format\nmsgid \"Couldn't load new project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:373\n#, c-format\nmsgid \"Couldn't save layout to file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:2010\n#, c-format\nmsgid \"Couldn't save project file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:492\nmsgid \"Create new file\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:287\nmsgid \"Create new project\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. E.g.: \"Create new subdirectory (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:54\n#, c-format\nmsgid \"Create new subdirectory (%s)\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:293\nmsgid \"Create project\"\nmsgstr \"\"\n\n#: ../src/ui/current_file_structure.vala:39 ../src/ui_main.vala:193\nmsgid \"Current file\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. \"Symbol\" in programming context as primitive data type used to name\n#. variables and functions.\n#: ../src/ui/current_symbol.vala:38 ../src/ui_main.vala:205\nmsgid \"Current symbol\"\nmsgstr \"\"\n\n#. TRANSLATORS: Uppercase for variables in command line options.\n#: ../src/common/args.vala:39 ../src/common/args.vala:40\nmsgid \"DIRECTORY\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1133\n#, c-format\nmsgid \"Data directory does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1131\n#, c-format\nmsgid \"Data file does not exist: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. \"Data files\" means the file is neighter a (Vala) source file nor a\n#. build system file - it's an other file or data file.\n#: ../src/ui/project_browser.vala:296\nmsgid \"Data files\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:94\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: ../guanako/reporter.vala:41\nmsgid \"Deprecated\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:70\nmsgid \"Detailed information\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. A \"define\" is a preprocessor symbol which is either set or unset:\n#. #if FOOBAR || BARFOO   <- where FOOBAR and BARFOO are defines\n#: ../src/buildsystem/base.vala:170\n#, c-format\nmsgid \"Disable define: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/reports.vala:116\nmsgid \"Display all\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:35\nmsgid \"Display version number.\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:517\nmsgid \"Do you want to delete this file?\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:86\nmsgid \"Don't let this field empty. Name a file.\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:326\nmsgid \"Edit\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:160\n#, c-format\nmsgid \"Enable define for package '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:723\n#, c-format\nmsgid \"Entry point '%s' not found in syntax file. Trying to segfault me, huh??\"\nmsgstr \"\"\n\n#: ../src/ui/reports.vala:79 ../guanako/reporter.vala:37\nmsgid \"Error\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:737\n#, c-format\nmsgid \"Error: \"\nmsgstr \"\"\n\n#: ../src/common/args.vala:58\n#, c-format\nmsgid \"Error: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Notes aren't notices but comments/remarks.\n#: ../src/ui/reports.vala:215\n#, c-format\nmsgid \"\"\n\"Errors: %d, Warnings: %d, Deprecated: %d, Experimental: %d, Notes: %d  -  \"\n\"%d\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:438 ../src/ui_main.vala:550\nmsgid \"Execute\"\nmsgstr \"\"\n\n#: ../guanako/reporter.vala:43\nmsgid \"Experimental\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:36 ../src/common/args.vala:43\nmsgid \"FILE\"\nmsgstr \"\"\n\n#: ../src/ui/build_output.vala:102\nmsgid \"Failed\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:61 ../src/ui/reports.vala:67\n#: ../src/ui_main.vala:289\nmsgid \"File\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1024 ../src/project/project.vala:1093\nmsgid \"File already a data file. Skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1090 ../src/project/project.vala:1145\nmsgid \"File already a source file. Skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1021 ../src/project/project.vala:1148\nmsgid \"File already registered for build system. Skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:422\nmsgid \"File copying cancelled.\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:215\nmsgid \"File does not contain enough information\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1270 ../src/project/project.vala:1626\n#: ../src/ui_main.vala:748 ../guanako/stylecheck.vala:366\nmsgid \"File does not contain enough information.\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:355\nmsgid \"File does not exist.\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:2045\nmsgid \"File is modified. Do you want to save it?\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. File has to be registered with Valama (loaded) to check if the\n#. buffer was modified.\n#: ../src/project/project.vala:2030\n#, c-format\nmsgid \"File not registered in project to check if buffer is dirty: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:631\n#, c-format\nmsgid \"File saved: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Focus docking widget (Gdl.DockItem): long name / file name (short name)\n#: ../src/ui_main.vala:797\n#, c-format\nmsgid \"Focus dock item: %s (%s)\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1680\nmsgid \"Following files are modified. Do you want to save them?\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:42\nmsgid \"Force loading of possibly incompatible template or project files.\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1088\n#, c-format\nmsgid \"Found build system file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1143\n#, c-format\nmsgid \"Found data file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1018\n#, c-format\nmsgid \"Found source file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:45\n#, c-format\nmsgid \"French\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:46\n#, c-format\nmsgid \"German\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:57\nmsgid \"Github project page\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:1116\nmsgid \"Guanako Completion\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:36\nmsgid \"Guanako syntax file.\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:464\nmsgid \"Help\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:529\nmsgid \"IDE mode\"\nmsgstr \"\"\n\n#. TRANSLATORS: insert input mode\n#: ../src/ui/source_viewer.vala:396 ../src/ui/source_viewer.vala:400\nmsgid \"INS\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. So you might not\n#. want to translate \"IOChannel\".\n#: ../src/buildsystem/base.vala:590\n#, c-format\nmsgid \"IOChannel operation failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1282\n#, c-format\nmsgid \"Ignore project file loading error: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:324\n#: ../src/project/project_templates.vala:331\n#, c-format\nmsgid \"Ignore substitution with missing '%s' property line %hu.\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:228\n#, c-format\nmsgid \"Ignore template file loading error: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Context: ... for package `foobar' <= 0.42 found: ...\n#: ../src/buildsystem/base.vala:352\n#, c-format\nmsgid \"Incompatible version for package '%s' %s %s found: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:709\nmsgid \"Initial buffer update\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:110\n#, c-format\nmsgid \"Invalid character: '%s' Please choose one from: %s\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:335\nmsgid \"Language: \"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:272\n#, c-format\nmsgid \"Launching application failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:375\n#, c-format\nmsgid \"Layout '%s' saved to file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:329 ../src/common/ui_helpers.vala:331\n#, c-format\nmsgid \"Layout file does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:356\n#, c-format\nmsgid \"Layout loaded: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:338\n#, c-format\nmsgid \"Layouts loaded from file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:55 ../src/ui/search.vala:40\n#: ../src/ui/stylechecker.vala:35\nmsgid \"Line\"\nmsgstr \"\"\n\n#. TRANSLATORS: Short name for Line X, Column Y\n#: ../src/ui/source_viewer.vala:505\n#, c-format\nmsgid \"Ln %d, Col %d\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:736\n#, c-format\nmsgid \"Load Ui meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:44\nmsgid \"Load default layout.\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:334\nmsgid \"Load layout...\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1800\n#, c-format\nmsgid \"Load new buffer: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:168\n#, c-format\nmsgid \"Load pixmap: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:557\n#, c-format\nmsgid \"Load project file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:45\nmsgid \"Load project from file.\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1614\n#, c-format\nmsgid \"Load project meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:500\n#, c-format\nmsgid \"Load syntax file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/symbol_browser.vala:64 ../src/ui/symbol_browser.vala:68\n#: ../src/ui/symbol_browser.vala:72 ../src/ui/symbol_browser.vala:76\nmsgid \"Loading\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:561 ../src/ui/reports.vala:73\n#: ../src/ui/welcome_screen.vala:670\nmsgid \"Location\"\nmsgstr \"\"\n\n#. TRANSLATORS: Lock user interface elements to prevent moving them around.\n#: ../src/ui_main.vala:363\nmsgid \"Lock elements\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:835 ../guanako/guanako.vala:847\n#: ../guanako/guanako.vala:865 ../guanako/guanako.vala:935\n#, c-format\nmsgid \"Malformed rule: '%s'\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/missing_packages.vala:27\nmsgid \"Missing packages\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:155\nmsgid \"Missing packages: \"\nmsgstr \"\"\n\n#: ../src/common/common.vala:485\n#, c-format\nmsgid \"Move from '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:359\nmsgid \"Moving finished.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:299 ../src/ui/source_viewer.vala:630\nmsgid \"New document\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:565 ../src/ui/welcome_screen.vala:675\nmsgid \"New project location\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:480\nmsgid \"Next\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:49\nmsgid \"Next generation Vala IDE\"\nmsgstr \"\"\n\n#. TRANSLATORS: E.g.: No `glib-2.0' package found.\n#: ../src/buildsystem/plain.vala:54\n#, c-format\nmsgid \"No '%s' package found.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/current_symbol.vala:48 ../src/ui/current_symbol.vala:75\nmsgid \"No current symbol\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:216 ../src/buildsystem/cmake.vala:250\nmsgid \"No data to clean.\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. A \"capturing group\" is used to group (and possibly mark) expressions\n#. within regular expressions for later use. Usually they are numbered\n#. so we can access them over an index.\n#: ../guanako/stylecheck.vala:456\n#, c-format\nmsgid \"No default capturing group ('matchgroup'). Set it to 0: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1998\nmsgid \"No file selected.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1358\n#, c-format\nmsgid \"No packages to choose between: line %hu\\n\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:406\nmsgid \"No recent projects\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:574\n#, c-format\nmsgid \"No such file found in opened buffers: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:223\nmsgid \"No such file.\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:119\n#, c-format\nmsgid \"Not a valid Vala version, will  not set VALA_X_Y defines: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:310\n#, c-format\nmsgid \"Not enough space available: %lld < %lld\"\nmsgstr \"\"\n\n#: ../guanako/reporter.vala:45\nmsgid \"Note\"\nmsgstr \"\"\n\n#. TRANSLATORS: overwrite input mode\n#: ../src/ui/source_viewer.vala:394 ../src/ui/source_viewer.vala:400\nmsgid \"OVR\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:27 ../src/ui/welcome_screen.vala:299\n#: ../src/ui/welcome_screen.vala:304 ../src/ui_main.vala:300\nmsgid \"Open project\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:41\nmsgid \"Output debug information.\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. That means we know \"`package' >= \". Something is missing, isn't it?\n#: ../src/project/project.vala:2193\n#, c-format\nmsgid \"Package '%s' has relation information but no version: \"\nmsgstr \"\"\n\n#: ../src/project/project.vala:942 ../src/project/project.vala:959\n#, c-format\nmsgid \"Package '%s' not in list, skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:419 ../src/ui/project_browser.vala:300\n#: ../src/ui/project_browser.vala:338\nmsgid \"Packages\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:966\n#, c-format\nmsgid \"Parameter '%s' not found in '%s'\\n\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:252\nmsgid \"Parameters:\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:43\nmsgid \"Path to layout file.\"\nmsgstr \"\"\n\n#: ../src/main.vala:151\nmsgid \"Pixmap directory does not exist. No application icons can be used.\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:174\n#, c-format\nmsgid \"Pixmap loading failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:53\nmsgid \"Plain text\"\nmsgstr \"\"\n\n#. TRANSLATORS: Very important string ;) . Thanks btw. for your translation!\n#: ../src/common/common.vala:742\n#, c-format\nmsgid \"Please report a bug!\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:91\n#, c-format\nmsgid \"Prepare file for FrankenStein: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/current_file_structure.vala:49\nmsgid \"Private\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:116 ../src/ui/project_browser.vala:41\n#: ../src/ui_main.vala:380\nmsgid \"Project\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:374\n#, c-format\nmsgid \"Project already built but executable does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:173\nmsgid \"Project browser\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:374\n#, c-format\nmsgid \"Project file to old: %s < %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1276\n#, c-format\nmsgid \"Project file too old: %s < %s\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:540\n#: ../src/dialogs/create_project.vala:549 ../src/ui/welcome_screen.vala:651\n#: ../src/ui/welcome_screen.vala:658\nmsgid \"Project name\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:123\nmsgid \"Project name:\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:101\nmsgid \"Project settings\"\nmsgstr \"\"\n\n#. TRANSLATORS: Collector for completion proposals.\n#. This string is normally not visible.\n#: ../guanako/guanako.vala:570\nmsgid \"Proposal collector\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:312\nmsgid \"Quit\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:406\nmsgid \"Rebuild\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:107\nmsgid \"Received invalid ID. Try to rebuild.\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:279\nmsgid \"Recent projects\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:522\nmsgid \"Redo last change\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:96\nmsgid \"Release\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1110\n#, c-format\nmsgid \"Remove build system file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1165\n#, c-format\nmsgid \"Remove data file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:204\nmsgid \"Remove file (from disk)\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:197\nmsgid \"Remove package\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:940 ../src/project/project.vala:957\n#, c-format\nmsgid \"Remove package: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1053\nmsgid \"Remove source file\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1050\n#, c-format\nmsgid \"Remove source file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:169\nmsgid \"Report widget\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Returns a return value (programming).\n#: ../src/completion_provider.vala:255\nmsgid \"Returns:\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:432\nmsgid \"Run\"\nmsgstr \"\"\n\n#. TRANSLATORS: E.g. \"Run project browser update!\"\n#: ../src/ui/breakpoints.vala:230 ../src/ui/current_file_structure.vala:102\n#: ../src/ui/current_symbol.vala:70 ../src/ui/project_browser.vala:275\n#: ../src/ui/reports.vala:154 ../src/ui/search.vala:245\n#: ../src/ui/source_viewer.vala:624 ../src/ui/symbol_browser.vala:120\n#, c-format\nmsgid \"Run %s update!\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:59\n#, c-format\nmsgid \"Run '%s --help' to see a full list of available command line options.\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:552\nmsgid \"Run application\"\nmsgstr \"\"\n\n#: ../src/ui/build_output.vala:80\nmsgid \"Running...\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:718\n#, c-format\nmsgid \"Save Ui meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:308\nmsgid \"Save all\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:504\nmsgid \"Save current file\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:544\nmsgid \"Save current file and build project\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1496\nmsgid \"Save project file.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1597\n#, c-format\nmsgid \"Save project meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/search.vala:59 ../src/ui_main.vala:185\nmsgid \"Search\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:620\nmsgid \"Select Valama project file\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:325\nmsgid \"Select new packages\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:193\nmsgid \"Select template\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:100 ../src/ui_main.vala:386\nmsgid \"Settings\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:355\nmsgid \"Show application output\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:356\nmsgid \"Show breakpoints\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:354\nmsgid \"Show build output\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:357\nmsgid \"Show current file structure\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:360\nmsgid \"Show current symbol\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:353\nmsgid \"Show project browser\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:352\nmsgid \"Show reports\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:351\nmsgid \"Show search\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:358\nmsgid \"Show style checker\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:359\nmsgid \"Show symbol browser\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:443\n#, c-format\nmsgid \"Skip %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1737 ../src/project/project.vala:1747\n#, c-format\nmsgid \"Skip '%s' choice.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1035 ../src/project/project.vala:1097\n#: ../src/project/project.vala:1152\n#, c-format\nmsgid \"Skip already added file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:88\n#, c-format\nmsgid \"Skip already loaded project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:455\n#, c-format\nmsgid \"Skip overwrite from '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1008\n#, c-format\nmsgid \"Source directory does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1006\n#, c-format\nmsgid \"Source file does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:668\nmsgid \"Source file update\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:473\nmsgid \"Source files\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:165\nmsgid \"Source view\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:470\nmsgid \"Source view id out of range.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:285\nmsgid \"Sources\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:726\n#, c-format\nmsgid \"Substitute: '@%s@'%s -> '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/build_output.vala:98\nmsgid \"Succeeded\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:363\nmsgid \"Supported Vala versions\"\nmsgstr \"\"\n\n#: ../src/ui/symbol_browser.vala:44\nmsgid \"Symbol\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:201\nmsgid \"Symbol browser\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:221\n#, c-format\nmsgid \"Template file '%s' too old: %s < %s\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:306\n#, c-format\nmsgid \"Template has no description: line %hu\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:299\n#, c-format\nmsgid \"Template has no name: line %hu\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:79\nmsgid \"Template information\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:125\nmsgid \"Templates\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:37\nmsgid \"Templates directory.\"\nmsgstr \"\"\n\n#: ../src/dialogs/missing_packages.vala:36\nmsgid \"The following vala packages are not available on your system:\\n\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:67\nmsgid \"Time\"\nmsgstr \"\"\n\n#. TRANSLATORS: Type in programming context as data type.\n#: ../src/ui/symbol_browser.vala:48\nmsgid \"Type\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:575 ../guanako/stylecheck.vala:616\n#, c-format\nmsgid \"Type not implemented yet: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:546\n#, c-format\nmsgid \"Unable to delete source file '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:361\n#, c-format\nmsgid \"Unable to guess package for define: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:515\nmsgid \"Undo last change\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:397\n#: ../src/dialogs/project_settings.vala:207\n#, c-format\nmsgid \"Unexpected enum value: %s: %d\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:467\n#, c-format\nmsgid \"Unexpected enum value: %s: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:500 ../src/dialogs/about.vala:66\n#: ../src/project/project.vala:274 ../src/project/project_templates.vala:108\n#: ../src/ui/project_browser.vala:145 ../src/ui/project_browser.vala:210\n#: ../src/ui/project_browser.vala:471 ../src/ui/project_browser.vala:554\n#, c-format\nmsgid \"Unexpected enum value: %s: %u\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1690 ../src/project/project.vala:2057\n#, c-format\nmsgid \"Unexpected response value: %s - %u\"\nmsgstr \"\"\n\n#: ../src/ui/reports.vala:192 ../src/ui/source_viewer.vala:213\n#, c-format\nmsgid \"Unknown ReportType: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:413 ../src/ui/project_browser.vala:451\n#: ../src/ui/project_browser.vala:533\n#, c-format\nmsgid \"Unknown TreePath start to add a new file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1650 ../src/ui_main.vala:776\n#, c-format\nmsgid \"Unknown attribute for '%s' line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1310 ../src/project/project.vala:1351\n#: ../src/project/project.vala:1366 ../src/project/project.vala:1380\n#: ../src/project/project.vala:1394 ../src/project/project.vala:1408\n#: ../src/project/project.vala:1422 ../src/project/project.vala:1436\n#: ../src/project/project.vala:1450 ../src/project/project.vala:1464\n#: ../src/project/project.vala:1470 ../src/project/project.vala:1654\n#: ../src/project/project_templates.vala:290\n#: ../src/project/project_templates.vala:352\n#: ../src/project/project_templates.vala:358 ../src/ui_main.vala:782\n#, c-format\nmsgid \"Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:343\n#, c-format\nmsgid \"Unknown package version relation: %s - %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1332 ../src/project/project.vala:2182\n#: ../src/project/project_templates.vala:263\n#, c-format\nmsgid \"Unknown property for '%s' line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:152\n#, c-format\nmsgid \"Unknown status: %d - %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:344\n#, c-format\nmsgid \"Unknown value for substitution property '%s' line %hu (assume '%s'): %s\"\nmsgstr \"\"\n\n#: ../src/main.vala:104\nmsgid \"Valama\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:42 ../src/ui/welcome_screen.vala:583\nmsgid \"Valama project files (*.vlp)\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:100\nmsgid \"Valama project not initialized\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:46\nmsgid \"Valama project not initialized.\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:287 ../guanako/guanako.vala:300\n#, c-format\nmsgid \"Vapi found: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:876\n#, c-format\nmsgid \"Variable '%s' not found! >%s<\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:151\nmsgid \"Version:\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:346\nmsgid \"View\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:38\nmsgid \"View all files (*)\"\nmsgstr \"\"\n\n#: ../guanako/reporter.vala:39\nmsgid \"Warning\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:733\n#, c-format\nmsgid \"Warning: \"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You migth not\n#. want to translate \"CheckType\".\n#: ../guanako/stylecheck.vala:473\n#, c-format\nmsgid \"Warning: No CheckType found, assume 'GLOBAL'.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:467\n#, c-format\nmsgid \"Warning: No description found.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:447\n#, c-format\nmsgid \"Warning: No regex to check.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:397\n#, c-format\nmsgid \"Warning: Skip different description: '%s' - '%s'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:437\n#, c-format\nmsgid \"Warning: Skip different match groups: '%d' - '%d'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:427\n#, c-format\nmsgid \"Warning: Skip different regexes: '%s' - '%s'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:410\n#, c-format\nmsgid \"Warning: Skip different type: '%s' - '%s'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:408\n#, c-format\nmsgid \"Warning: Unknown CheckType '%s', assume 'GLOBAL'.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:619\n#, c-format\nmsgid \"Warning: Unknown CheckType: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:442 ../guanako/stylecheck.vala:461\n#, c-format\nmsgid \"Warning: Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:283 ../guanako/guanako.vala:296\n#, c-format\nmsgid \"Warning: Vapi for package %s not found.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1242\n#, c-format\nmsgid \"Will not add '%s' to file list: File not valid\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:41\nmsgid \"[DEBUGLEVEL]\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:45\nmsgid \"[FILE...]\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X > Y\n#: ../src/dialogs/create_project.vala:375\nmsgid \"after\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X < Y\n#: ../src/dialogs/create_project.vala:387\nmsgid \"before\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:166\nmsgid \"build command failed\"\nmsgstr \"\"\n\n#. TRANSLATORS: Choice of different packages.\n#: ../src/project/project.vala:910\n#, c-format\nmsgid \"choice\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:226\nmsgid \"clean command failed\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:133\nmsgid \"configure command failed\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:117\n#, c-format\nmsgid \"directory creation failed: %s\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:260\n#, c-format\nmsgid \"distclean command failed: %s\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:525\nmsgid \"file does not exist\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:68\nmsgid \"filename\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Context: Add new file to project (inside `foobar' directory)\n#: ../src/dialogs/create_file.vala:57\n#, c-format\nmsgid \"inside '%s' directory\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:58\n#, c-format\nmsgid \"inside project root directory\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:385\nmsgid \"launching failed\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:284\nmsgid \"no long description\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:463\nmsgid \"no package required\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:552\nmsgid \"no regular file or directory\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:485\nmsgid \"no source files\"\nmsgstr \"\"\n\n#. TRANSLATORS: Context: Parameters: none\n#: ../src/completion_provider.vala:251\nmsgid \"none\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:437\nmsgid \"not available\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X != Y\n#: ../src/dialogs/create_project.vala:394\nmsgid \"not supported\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:857\n#, c-format\nmsgid \"pop_cur symbol not found! '%s'\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X >= Y\n#: ../src/dialogs/create_project.vala:379\nmsgid \"since\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X <= Y\n#: ../src/dialogs/create_project.vala:383\nmsgid \"until\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:396\nmsgid \"valama_project\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:3\nmsgid \"Create Vala projects.\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:2\nmsgid \"IDE\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:4\nmsgid \"Vala;IDE;Development;\"\nmsgstr \"\"\n\n#: ../build/data/org.valama.gschema.xml.h:1\nmsgid \"Horizontal window size\"\nmsgstr \"\"\n\n#: ../build/data/org.valama.gschema.xml.h:2\nmsgid \"Vertical window size\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/main_screen.vala:108\nmsgid \"Other project...\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/create_project_location.vala:69\nmsgid \"project name\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/create_project_packages.vala:31\nmsgid \"Choose packages\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/create_project_packages.vala:32\nmsgid \"packages for current project\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:45\nmsgid \"Choose Buildsystem\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:46\nmsgid \"Choose a buildsystem for current project.\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen/create_project_buildsystem.vala:30\nmsgid \"make library\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:432\nmsgid \"_Build\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:513\nmsgid \"_Clean\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:417\nmsgid \"_Project\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:422\nmsgid \"_Settings\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:304\nmsgid \"User interface files\"\nmsgstr \"\"\n\n\n"
  },
  {
    "path": "po/zh_TW.po",
    "content": "# Chinese translations for Valama package\n# traditional Chinese translation for Valama.\n# Copyright (C) 2013 THE Valama'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the Valama package.\n# sli53 <zylix666@gmail.com>, 2013.\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Valama 0.1.2\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2013-05-30 21:20+0200\\n\"\n\"PO-Revision-Date: 2013-06-11 16:10+0800\\n\"\n\"Last-Translator: sli53 <zylix666@gmail.com>\\n\"\n\"Language-Team: Chinese (traditional)\\n\"\n\"Language: zh_TW\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@->>> (line)<<<- -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:673\n#: ../src/dialogs/create_project.vala:727\nmsgid \" (line)\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:621 ../src/project/project.vala:623\n#, c-format\nmsgid \"%s - Vala\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. E.g.: Warning found: myfile.vala: 12(13)-12(17): unused variable `test'\n#: ../src/ui/reports.vala:231\n#, c-format\nmsgid \"%s found: %s: %d(%d)-%d(%d): %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished ...\"\n#: ../src/ui/current_file_structure.vala:107\n#, c-format\nmsgid \"%s update finished (not a valid source buffer)!\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: E.g. \"Project browser update finished!\"\n#: ../src/ui/breakpoints.vala:297 ../src/ui/current_file_structure.vala:176\n#: ../src/ui/current_symbol.vala:153 ../src/ui/project_browser.vala:317\n#: ../src/ui/reports.vala:222 ../src/ui/search.vala:246\n#: ../src/ui/source_viewer.vala:625 ../src/ui/symbol_browser.vala:142\n#, c-format\nmsgid \"%s update finished!\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. E.g. \"CMake build failed: some error\" or \"Autotools build failed: some error\"\n#: ../src/project/build_project.vala:145\n#, c-format\nmsgid \"'%s' build failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:135 ../src/project/build_project.vala:186\n#: ../src/project/build_project.vala:222\n#, c-format\nmsgid \"'%s' cleaning failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:139\n#, c-format\nmsgid \"'%s' configuration failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:131 ../src/project/build_project.vala:182\n#: ../src/project/build_project.vala:218\n#, c-format\nmsgid \"'%s' initialization failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:78\n#, c-format\nmsgid \"'%s' not a positive number\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:149\n#, c-format\nmsgid \"'%s' tests failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:120\n#, c-format\nmsgid \"'Build' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:106\n#, c-format\nmsgid \"'Clean' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:125\n#, c-format\nmsgid \"'Configure' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:102 ../src/project/build_project.vala:177\n#: ../src/project/build_project.vala:213\n#, c-format\nmsgid \"'Distclean' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:97 ../src/project/build_project.vala:171\n#: ../src/project/build_project.vala:208\n#, c-format\nmsgid \"'Initialization' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:115\n#, c-format\nmsgid \"'Tests' failed with exit status: %d\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1801\nmsgid \"(new file)\"\nmsgstr \"(新檔案)\"\n\n#: ../src/common/args.vala:52\nmsgid \"- Valama: next generation Vala IDE\"\nmsgstr \"- Valama: 新一代的Vala IDE\"\n\n#: ../src/ui/project_browser.vala:190 ../src/ui/project_browser.vala:206\nmsgid \"Add new directory\"\nmsgstr \"加入新資料夾\"\n\n#: ../src/ui/project_browser.vala:185 ../src/ui/project_browser.vala:202\nmsgid \"Add new file\"\nmsgstr \"加入新檔案\"\n\n#. TRANSLATORS:\n#. E.g.: \"Add new file to project (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:51\n#, c-format\nmsgid \"Add new file to project (%s)\"\nmsgstr \"加入新檔案至專案 (%s)\"\n\n#: ../src/ui/project_browser.vala:177 ../src/ui/project_browser.vala:195\nmsgid \"Add new package\"\nmsgstr \"加入新的package\"\n\n#: ../src/project/project.vala:911 ../src/project/project.vala:922\n#, c-format\nmsgid \"Add package: %s\\n\"\nmsgstr \"加入package: %s\\n\"\n\n#: ../src/project/project.vala:726\n#, c-format\nmsgid \"Add project to recent manager: %s - %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/search.vala:71\nmsgid \"All files\"\nmsgstr \"所有檔案\"\n\n#. TRANSLATORS: (*) is a file filter (globbing) and matches all files.\n#: ../src/ui/welcome_screen.vala:590\nmsgid \"All files (*)\"\nmsgstr \"所有檔案 (*)\"\n\n#: ../src/project/project.vala:531 ../src/project/project.vala:585\n#, c-format\nmsgid \"An error occurred while loading new Guanako project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/app_output.vala:39 ../src/ui_main.vala:181\nmsgid \"Application output\"\nmsgstr \"應用程式結果輸出\"\n\n#: ../src/project/build_project.vala:250\n#, c-format\nmsgid \"Application received signal: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:235\nmsgid \"Application still running. Quit it manually.\\n\"\nmsgstr \"\"\n\n#: ../src/project/build_project.vala:266\n#, c-format\nmsgid \"Application terminated with exit status '%d'.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:306\nmsgid \"Author\"\nmsgstr \"作者\"\n\n#: ../src/dialogs/create_project.vala:63\nmsgid \"Author information\"\nmsgstr \"作者資料\"\n\n#: ../src/dialogs/create_project.vala:308\nmsgid \"Authors\"\nmsgstr \"作者們\"\n\n#. TRANSLATORS: Of course not the body part ;) .\n#. Go to the previous window.\n#: ../src/ui/welcome_screen.vala:430 ../src/ui_main.vala:480\nmsgid \"Back\"\nmsgstr \"返回\"\n\n#: ../src/ui_main.vala:189\nmsgid \"Breakpoints / Timers\"\nmsgstr \"中斷點 / 計時器\"\n\n#: ../src/project/project.vala:1911\nmsgid \"Buffer loaded.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1929\nmsgid \"Buffer update\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:393 ../src/ui_main.vala:399 ../src/ui_main.vala:542\nmsgid \"Build\"\nmsgstr \"建置\"\n\n#: ../src/project/build_project.vala:70\n#, c-format\nmsgid \"Build command received signal: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. The user has to choose a directory where to build the application\n#. so it might be undefined.\n#: ../src/buildsystem/base.vala:429 ../src/buildsystem/cmake.vala:44\nmsgid \"Build directory not set.\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:177\nmsgid \"Build output\"\nmsgstr \"建置結果輸出\"\n\n#: ../src/project/project_templates.vala:74\n#, c-format\nmsgid \"Build system '%s' currently not supported by template selector.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1715\n#, c-format\nmsgid \"Build system '%s' not supported.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1078\n#, c-format\nmsgid \"Build system directory does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1076\n#, c-format\nmsgid \"Build system file does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:289\nmsgid \"Build system files\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:40\nmsgid \"Build systems directory.\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:75\n#, c-format\nmsgid \"Buildsystem build finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:72\n#, c-format\nmsgid \"Buildsystem build started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:81\n#, c-format\nmsgid \"Buildsystem cleaning finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:78\n#, c-format\nmsgid \"Buildsystem cleaning started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:69\n#, c-format\nmsgid \"Buildsystem configuration finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:66\n#, c-format\nmsgid \"Buildsystem configuration started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:87\n#, c-format\nmsgid \"Buildsystem distcleaning finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:84\n#, c-format\nmsgid \"Buildsystem distcleaning started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:63\n#, c-format\nmsgid \"Buildsystem initialization finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:60\n#, c-format\nmsgid \"Buildsystem initialization started: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:93\n#, c-format\nmsgid \"Buildsystem tests finished: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:90\n#, c-format\nmsgid \"Buildsystem tests started: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:943\n#, c-format\nmsgid \"Call '%s' not found in '%s'\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Context: \"Cannot apply substitution @foobar@ (line) -> 'barfoo'\"... or\n#. \"Cannot apply substitution @foobar@ -> 'barfoo'\"...\n#: ../src/dialogs/create_project.vala:670\n#, c-format\nmsgid \"Cannot apply substitution '@%s@'%s -> '%s': %s does not exist\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:754\n#, c-format\nmsgid \"Cannot create temporary file '%s' to apply substitutions: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1264 ../src/project/project.vala:1620\n#: ../src/project/project_templates.vala:209 ../src/ui_main.vala:742\n#: ../guanako/stylecheck.vala:360\nmsgid \"Cannot parse file.\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:735\n#, c-format\nmsgid \"Cannot read file '%s': %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Change focus of source view to new file.\n#: ../src/ui/source_viewer.vala:66\n#, c-format\nmsgid \"Change current focus: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/stylechecker.vala:61\nmsgid \"Checker loaded.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1734 ../src/project/project.vala:1744\n#, c-format\nmsgid \"Choose '%s' package.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:36\nmsgid \"Choose directory name\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:35\nmsgid \"Choose filename\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:522\nmsgid \"Choose project template\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:419\nmsgid \"Clean\"\nmsgstr \"清除\"\n\n#: ../src/ui_main.vala:425\nmsgid \"Clean all\"\nmsgstr \"全部清理\"\n\n#: ../src/ui_main.vala:412\nmsgid \"Clean build\"\nmsgstr \"全部重新建置\"\n\n#: ../src/ui/app_output.vala:51\nmsgid \"Clear output\"\nmsgstr \"清除輸出\"\n\n#: ../src/project/project.vala:2062\nmsgid \"Close buffer.\\n\"\nmsgstr \"關閉緩衝區. \\n\"\n\n#: ../src/ui_main.vala:482\nmsgid \"Close project\"\nmsgstr \"關閉專案\"\n\n#: ../src/ui/source_viewer.vala:278\n#, c-format\nmsgid \"Close view and buffer: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:197\nmsgid \"Coding style checker\"\nmsgstr \"\"\n\n#: ../src/dialogs/missing_packages.vala:39\nmsgid \"Compiling and auto completion might fail!\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:66\nmsgid \"Completion\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:471\n#, c-format\nmsgid \"Copy from '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:348\nmsgid \"Copying finished.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:50\nmsgid \"Copyright © 2012, 2013 Valama development team\"\nmsgstr \"\"\n\n#: ../guanako/guanako_frankenstein.vala:31\n#, c-format\nmsgid \"Could not acquire name.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:732\nmsgid \"Could not add project to recent manager.\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Could not change source view focus to new file.\n#: ../src/ui/source_viewer.vala:236\n#, c-format\nmsgid \"Could not change focus to: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:759\n#: ../src/dialogs/create_project.vala:792\n#, c-format\nmsgid \"Could not close file descriptor for '%s': %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Context: \"Could not close source view (mapping) for: myfile.vala\"\n#: ../src/project/project.vala:1190\n#, c-format\nmsgid \"Could not close source view (mapping) for: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:274\n#, c-format\nmsgid \"Could not close view: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:69\n#, c-format\nmsgid \"Could not compare project files inodes: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:135\n#, c-format\nmsgid \"Could not convert '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:66 ../src/project/project.vala:98\n#: ../src/project/project.vala:117\n#, c-format\nmsgid \"Could not convert '%s' to string: %u\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:586\n#, c-format\nmsgid \"Could not convert all characters: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:623\n#, c-format\nmsgid \"Could not copy templates for new project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:278\n#, c-format\nmsgid \"Could not create cache directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:120\n#, c-format\nmsgid \"Could not create new directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:110\n#, c-format\nmsgid \"Could not create new file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:102\n#, c-format\nmsgid \"Could not create parent directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1942\n#, c-format\nmsgid \"Could not create thread to update buffer: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:679\n#, c-format\nmsgid \"Could not create thread to update source files: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:690\n#, c-format\nmsgid \"Could not determine file path: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is an technical information. You might not want\n#. to translate \"ScrolledWindow\".\n#: ../src/ui/source_viewer.vala:550\n#, c-format\nmsgid \"Could not find ScrolledWindow widget: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:316\n#, c-format\nmsgid \"Could not find pkg-config file for '%s'. \"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:378 ../src/ui/project_browser.vala:481\n#, c-format\nmsgid \"Could not get current TreePath: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreeView\".\n#: ../src/ui/project_browser.vala:115 ../src/ui/project_browser.vala:127\n#: ../src/ui/project_browser.vala:166 ../src/ui/project_browser.vala:386\n#: ../src/ui/project_browser.vala:425 ../src/ui/project_browser.vala:487\n#: ../src/ui/project_browser.vala:505\n#, c-format\nmsgid \"Could not get iterator in TreeView: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:595\n#, c-format\nmsgid \"Could not initialize build system: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/ui_elements.vala:118\nmsgid \"Could not initialize locking signals.\\n\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:175\n#, c-format\nmsgid \"Could not launch completion thread successfully: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:701 ../src/main.vala:178\n#: ../src/project/project.vala:822 ../src/project/project.vala:866\n#, c-format\nmsgid \"Could not list or iterate through directory content of '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1033\n#, c-format\nmsgid \"Could not load Vala source file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:245\n#, c-format\nmsgid \"Could not load Valama text logo: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1862 ../src/ui/source_viewer.vala:373\n#, c-format\nmsgid \"Could not load completion: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:279\n#, c-format\nmsgid \"Could not load file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:185\n#, c-format\nmsgid \"Could not load icon theme: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:575 ../src/ui_main.vala:241\n#, c-format\nmsgid \"Could not load meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:79 ../src/ui/welcome_screen.vala:372\n#, c-format\nmsgid \"Could not load new project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:170\n#, c-format\nmsgid \"Could not load pixmap: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:143\n#, c-format\nmsgid \"Could not load project template: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:631\n#, c-format\nmsgid \"Could not load project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:231\n#, c-format\nmsgid \"Could not load template '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:198\n#, c-format\nmsgid \"Could not load template image: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:310\n#, c-format\nmsgid \"Could not load vapi: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1232\n#, c-format\nmsgid \"Could not open directory or file in '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:104 ../src/common/common.vala:636\n#, c-format\nmsgid \"Could not open file writable: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:109\n#, c-format\nmsgid \"Could not open file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:172\n#, c-format\nmsgid \"Could not open pixmaps file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:53\n#, c-format\nmsgid \"Could not operate on directory: %s\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:366\n#, c-format\nmsgid \"Could not process files in template directory: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:786\n#, c-format\nmsgid \"Could not read file '%s' properly: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:79\n#, c-format\nmsgid \"Could not read file content of '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_vapi_discoverer.vala:51 ../guanako/guanako.vala:1294\n#, c-format\nmsgid \"Could not read file: %s\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:107\n#, c-format\nmsgid \"Could not read file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:1292\n#, c-format\nmsgid \"Could not read line: %s\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:528 ../src/project/project.vala:582\n#, c-format\nmsgid \"Could not read syntax file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_frankenstein.vala:45\n#, c-format\nmsgid \"Could not register service.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1481\nmsgid \"Could not select a package from choice.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:74\n#, c-format\nmsgid \"Could not select current source view: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:675\n#, c-format\nmsgid \"Could not spawn pkg-config package existence check: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:553\n#, c-format\nmsgid \"Could not spawn subprocess: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:366\n#, c-format\nmsgid \"Could not unload completion: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:796\n#, c-format\nmsgid \"\"\n\"Could not update file '%s' with '%s' (temporary file may still exist): %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/plain.vala:101 ../src/common/common.vala:634\n#, c-format\nmsgid \"Could not update file: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako_helpers.vala:45\n#, c-format\nmsgid \"Could not update vapi files: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:107\n#, c-format\nmsgid \"Could not write to new file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:781\n#, c-format\nmsgid \"Could not write to temporary file '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:72\n#, c-format\nmsgid \"Couldn't load Valama project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:340\n#, c-format\nmsgid \"Couldn't load layout file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:354\n#, c-format\nmsgid \"Couldn't load layout: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:639\n#, c-format\nmsgid \"Couldn't load new project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:373\n#, c-format\nmsgid \"Couldn't save layout to file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:2010\n#, c-format\nmsgid \"Couldn't save project file: %s\\n\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:3\nmsgid \"Create Vala projects.\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:492\nmsgid \"Create new file\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:287\nmsgid \"Create new project\"\nmsgstr \"建立新專案\"\n\n#. TRANSLATORS:\n#. E.g.: \"Create new subdirectory (inside 'src/' directory)\"\n#: ../src/dialogs/create_file.vala:54\n#, c-format\nmsgid \"Create new subdirectory (%s)\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:293\nmsgid \"Create project\"\nmsgstr \"建立專案\"\n\n#: ../src/ui/current_file_structure.vala:39 ../src/ui_main.vala:193\nmsgid \"Current file\"\nmsgstr \"目前檔案\"\n\n#. TRANSLATORS:\n#. \"Symbol\" in programming context as primitive data type used to name\n#. variables and functions.\n#: ../src/ui/current_symbol.vala:38 ../src/ui_main.vala:205\nmsgid \"Current symbol\"\nmsgstr \"目前的標誌\"\n\n#. TRANSLATORS: Uppercase for variables in command line options.\n#: ../src/common/args.vala:39 ../src/common/args.vala:40\nmsgid \"DIRECTORY\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1133\n#, c-format\nmsgid \"Data directory does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1131\n#, c-format\nmsgid \"Data file does not exist: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. \"Data files\" means the file is neighter a (Vala) source file nor a\n#. build system file - it's an other file or data file.\n#: ../src/ui/project_browser.vala:296\nmsgid \"Data files\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:94\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: ../guanako/reporter.vala:41\nmsgid \"Deprecated\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:70\nmsgid \"Detailed information\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. A \"define\" is a preprocessor symbol which is either set or unset:\n#. #if FOOBAR || BARFOO   <- where FOOBAR and BARFOO are defines\n#: ../src/buildsystem/base.vala:170\n#, c-format\nmsgid \"Disable define: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/reports.vala:116\nmsgid \"Display all\"\nmsgstr \"顯示全部\"\n\n#: ../src/common/args.vala:35\nmsgid \"Display version number.\"\nmsgstr \"顯示版本編號\"\n\n#: ../src/ui/project_browser.vala:517\nmsgid \"Do you want to delete this file?\"\nmsgstr \"確定要刪除檔案?\"\n\n#: ../src/dialogs/create_file.vala:86\nmsgid \"Don't let this field empty. Name a file.\"\nmsgstr \"這個欄位不能為空白. 請給予檔名.\"\n\n#: ../src/ui_main.vala:326\nmsgid \"Edit\"\nmsgstr \"編輯\"\n\n#: ../src/buildsystem/base.vala:160\n#, c-format\nmsgid \"Enable define for package '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:723\n#, c-format\nmsgid \"Entry point '%s' not found in syntax file. Trying to segfault me, huh??\"\nmsgstr \"\"\n\n#: ../src/ui/reports.vala:79 ../guanako/reporter.vala:37\nmsgid \"Error\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:737\n#, c-format\nmsgid \"Error: \"\nmsgstr \"\"\n\n#: ../src/common/args.vala:58\n#, c-format\nmsgid \"Error: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Notes aren't notices but comments/remarks.\n#: ../src/ui/reports.vala:215\n#, c-format\nmsgid \"\"\n\"Errors: %d, Warnings: %d, Deprecated: %d, Experimental: %d, Notes: %d  -  \"\n\"%d\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:438 ../src/ui_main.vala:550\nmsgid \"Execute\"\nmsgstr \"執行\"\n\n#: ../guanako/reporter.vala:43\nmsgid \"Experimental\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:36 ../src/common/args.vala:43\nmsgid \"FILE\"\nmsgstr \"檔案\"\n\n#: ../src/ui/build_output.vala:102\nmsgid \"Failed\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:61 ../src/ui/reports.vala:67\n#: ../src/ui_main.vala:289\nmsgid \"File\"\nmsgstr \"檔案\"\n\n#: ../src/project/project.vala:1024 ../src/project/project.vala:1093\nmsgid \"File already a data file. Skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1090 ../src/project/project.vala:1145\nmsgid \"File already a source file. Skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1021 ../src/project/project.vala:1148\nmsgid \"File already registered for build system. Skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:422\nmsgid \"File copying cancelled.\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:215\nmsgid \"File does not contain enough information\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1270 ../src/project/project.vala:1626\n#: ../src/ui_main.vala:748 ../guanako/stylecheck.vala:366\nmsgid \"File does not contain enough information.\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:355\nmsgid \"File does not exist.\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:2045\nmsgid \"File is modified. Do you want to save it?\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. File has to be registered with Valama (loaded) to check if the\n#. buffer was modified.\n#: ../src/project/project.vala:2030\n#, c-format\nmsgid \"File not registered in project to check if buffer is dirty: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:631\n#, c-format\nmsgid \"File saved: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Focus docking widget (Gdl.DockItem): long name / file name (short name)\n#: ../src/ui_main.vala:797\n#, c-format\nmsgid \"Focus dock item: %s (%s)\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1680\nmsgid \"Following files are modified. Do you want to save them?\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:42\nmsgid \"Force loading of possibly incompatible template or project files.\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1088\n#, c-format\nmsgid \"Found build system file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1143\n#, c-format\nmsgid \"Found data file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1018\n#, c-format\nmsgid \"Found source file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:45\n#, c-format\nmsgid \"French\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:46\n#, c-format\nmsgid \"German\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:57\nmsgid \"Github project page\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:1116\nmsgid \"Guanako Completion\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:36\nmsgid \"Guanako syntax file.\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:464\nmsgid \"Help\"\nmsgstr \"幫助\"\n\n#: ../build/data/apps.valama.gschema.xml.h:1\nmsgid \"Horizontal window size\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:2\nmsgid \"IDE\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:529\nmsgid \"IDE mode\"\nmsgstr \"\"\n\n#. TRANSLATORS: insert input mode\n#: ../src/ui/source_viewer.vala:396 ../src/ui/source_viewer.vala:400\nmsgid \"INS\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. So you might not\n#. want to translate \"IOChannel\".\n#: ../src/buildsystem/base.vala:590\n#, c-format\nmsgid \"IOChannel operation failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1282\n#, c-format\nmsgid \"Ignore project file loading error: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:324\n#: ../src/project/project_templates.vala:331\n#, c-format\nmsgid \"Ignore substitution with missing '%s' property line %hu.\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:228\n#, c-format\nmsgid \"Ignore template file loading error: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Context: ... for package `foobar' <= 0.42 found: ...\n#: ../src/buildsystem/base.vala:352\n#, c-format\nmsgid \"Incompatible version for package '%s' %s %s found: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:709\nmsgid \"Initial buffer update\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:110\n#, c-format\nmsgid \"Invalid character: '%s' Please choose one from: %s\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:335\nmsgid \"Language: \"\nmsgstr \"語言: \"\n\n#: ../src/project/build_project.vala:272\n#, c-format\nmsgid \"Launching application failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:375\n#, c-format\nmsgid \"Layout '%s' saved to file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:329 ../src/common/ui_helpers.vala:331\n#, c-format\nmsgid \"Layout file does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:356\n#, c-format\nmsgid \"Layout loaded: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:338\n#, c-format\nmsgid \"Layouts loaded from file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:55 ../src/ui/search.vala:40\n#: ../src/ui/stylechecker.vala:35\nmsgid \"Line\"\nmsgstr \"行\"\n\n#. TRANSLATORS: Short name for Line X, Column Y\n#: ../src/ui/source_viewer.vala:505\n#, c-format\nmsgid \"Ln %d, Col %d\"\nmsgstr \"行 %d, Col %d\"\n\n#: ../src/ui_main.vala:736\n#, c-format\nmsgid \"Load Ui meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:44\nmsgid \"Load default layout.\"\nmsgstr \"\"\n\n#: ../src/common/ui_helpers.vala:334\nmsgid \"Load layout...\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1800\n#, c-format\nmsgid \"Load new buffer: %s\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:168\n#, c-format\nmsgid \"Load pixmap: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:557\n#, c-format\nmsgid \"Load project file: %s\\n\"\nmsgstr \"載入專案檔: %S\\n\"\n\n#: ../src/common/args.vala:45\nmsgid \"Load project from file.\"\nmsgstr \"從檔案載入專案.\"\n\n#: ../src/project/project.vala:1614\n#, c-format\nmsgid \"Load project meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:500\n#, c-format\nmsgid \"Load syntax file: %s\\n\"\nmsgstr \"載入語法檔案: %s\\n\"\n\n#: ../src/ui/symbol_browser.vala:64 ../src/ui/symbol_browser.vala:68\n#: ../src/ui/symbol_browser.vala:72 ../src/ui/symbol_browser.vala:76\nmsgid \"Loading\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:561 ../src/ui/reports.vala:73\n#: ../src/ui/welcome_screen.vala:670\nmsgid \"Location\"\nmsgstr \"專案路徑\"\n\n#. TRANSLATORS: Lock user interface elements to prevent moving them around.\n#: ../src/ui_main.vala:363\nmsgid \"Lock elements\"\nmsgstr \"鎖定板面\"\n\n#: ../guanako/guanako.vala:835 ../guanako/guanako.vala:847\n#: ../guanako/guanako.vala:865 ../guanako/guanako.vala:935\n#, c-format\nmsgid \"Malformed rule: '%s'\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/missing_packages.vala:27\nmsgid \"Missing packages\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:155\nmsgid \"Missing packages: \"\nmsgstr \"\"\n\n#: ../src/common/common.vala:485\n#, c-format\nmsgid \"Move from '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:359\nmsgid \"Moving finished.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:299 ../src/ui/source_viewer.vala:630\nmsgid \"New document\"\nmsgstr \"新文件\"\n\n#: ../src/dialogs/create_project.vala:565 ../src/ui/welcome_screen.vala:675\nmsgid \"New project location\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:480\nmsgid \"Next\"\nmsgstr \"\"\n\n#: ../src/dialogs/about.vala:49\nmsgid \"Next generation Vala IDE\"\nmsgstr \"新一代的 Vala IDE\"\n\n#. TRANSLATORS: E.g.: No `glib-2.0' package found.\n#: ../src/buildsystem/plain.vala:54\n#, c-format\nmsgid \"No '%s' package found.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/current_symbol.vala:48 ../src/ui/current_symbol.vala:75\nmsgid \"No current symbol\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:216 ../src/buildsystem/cmake.vala:250\nmsgid \"No data to clean.\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. A \"capturing group\" is used to group (and possibly mark) expressions\n#. within regular expressions for later use. Usually they are numbered\n#. so we can access them over an index.\n#: ../guanako/stylecheck.vala:456\n#, c-format\nmsgid \"No default capturing group ('matchgroup'). Set it to 0: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1998\nmsgid \"No file selected.\\n\"\nmsgstr \"沒有被選擇的檔案.\\n\"\n\n#: ../src/project/project.vala:1358\n#, c-format\nmsgid \"No packages to choose between: line %hu\\n\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:406\nmsgid \"No recent projects\"\nmsgstr \"沒有最近開啟的專案\"\n\n#: ../src/ui/source_viewer.vala:574\n#, c-format\nmsgid \"No such file found in opened buffers: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:223\nmsgid \"No such file.\"\nmsgstr \"找不到這個檔案.\"\n\n#: ../guanako/guanako.vala:119\n#, c-format\nmsgid \"Not a valid Vala version, will  not set VALA_X_Y defines: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:310\n#, c-format\nmsgid \"Not enough space available: %lld < %lld\"\nmsgstr \"儲存空間不足: %lld < %lld\"\n\n#: ../guanako/reporter.vala:45\nmsgid \"Note\"\nmsgstr \"\"\n\n#. TRANSLATORS: overwrite input mode\n#: ../src/ui/source_viewer.vala:394 ../src/ui/source_viewer.vala:400\nmsgid \"OVR\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:27 ../src/ui/welcome_screen.vala:299\n#: ../src/ui/welcome_screen.vala:304 ../src/ui_main.vala:300\nmsgid \"Open project\"\nmsgstr \"開啟專案\"\n\n#: ../src/common/args.vala:41\nmsgid \"Output debug information.\"\nmsgstr \"輸出除錯資訊\"\n\n#. TRANSLATORS:\n#. That means we know \"`package' >= \". Something is missing, isn't it?\n#: ../src/project/project.vala:2193\n#, c-format\nmsgid \"Package '%s' has relation information but no version: \"\nmsgstr \"\"\n\n#: ../src/project/project.vala:942 ../src/project/project.vala:959\n#, c-format\nmsgid \"Package '%s' not in list, skip it.\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:419 ../src/ui/project_browser.vala:300\n#: ../src/ui/project_browser.vala:338\nmsgid \"Packages\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:966\n#, c-format\nmsgid \"Parameter '%s' not found in '%s'\\n\"\nmsgstr \"\"\n\n#: ../src/completion_provider.vala:252\nmsgid \"Parameters:\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:43\nmsgid \"Path to layout file.\"\nmsgstr \"\"\n\n#: ../src/main.vala:151\nmsgid \"Pixmap directory does not exist. No application icons can be used.\\n\"\nmsgstr \"\"\n\n#: ../src/main.vala:174\n#, c-format\nmsgid \"Pixmap loading failed: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:53\nmsgid \"Plain text\"\nmsgstr \"\"\n\n#. TRANSLATORS: Very important string ;) . Thanks btw. for your translation!\n#: ../src/common/common.vala:742\n#, c-format\nmsgid \"Please report a bug!\\n\"\nmsgstr \"請回報臭蟲!\\n\"\n\n#: ../src/buildsystem/plain.vala:91\n#, c-format\nmsgid \"Prepare file for FrankenStein: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/current_file_structure.vala:49\nmsgid \"Private\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:116 ../src/ui/project_browser.vala:41\n#: ../src/ui_main.vala:380\nmsgid \"Project\"\nmsgstr \"專案\"\n\n#: ../src/buildsystem/base.vala:374\n#, c-format\nmsgid \"Project already built but executable does not exist: %s\\n\"\nmsgstr \"專案巳經建罝但執行檔並不存在: %s\\n\"\n\n#: ../src/ui_main.vala:173\nmsgid \"Project browser\"\nmsgstr \"專案流灠器\"\n\n#: ../guanako/stylecheck.vala:374\n#, c-format\nmsgid \"Project file to old: %s < %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1276\n#, c-format\nmsgid \"Project file too old: %s < %s\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:540\n#: ../src/dialogs/create_project.vala:549 ../src/ui/welcome_screen.vala:651\n#: ../src/ui/welcome_screen.vala:658\nmsgid \"Project name\"\nmsgstr \"專案名稱\"\n\n#: ../src/dialogs/project_settings.vala:123\nmsgid \"Project name:\"\nmsgstr \"專案名稱\"\n\n#: ../src/dialogs/project_settings.vala:101\nmsgid \"Project settings\"\nmsgstr \"專案設定\"\n\n#. TRANSLATORS: Collector for completion proposals.\n#. This string is normally not visible.\n#: ../guanako/guanako.vala:570\nmsgid \"Proposal collector\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:312\nmsgid \"Quit\"\nmsgstr \"離開\"\n\n#: ../src/ui_main.vala:406\nmsgid \"Rebuild\"\nmsgstr \"重新建置\"\n\n#: ../src/ui/breakpoints.vala:107\nmsgid \"Received invalid ID. Try to rebuild.\"\nmsgstr \"\"\n\n#: ../src/ui/welcome_screen.vala:279\nmsgid \"Recent projects\"\nmsgstr \"最近的專案\"\n\n#: ../src/ui_main.vala:522\nmsgid \"Redo last change\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:96\nmsgid \"Release\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1110\n#, c-format\nmsgid \"Remove build system file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1165\n#, c-format\nmsgid \"Remove data file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:204\nmsgid \"Remove file (from disk)\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:197\nmsgid \"Remove package\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:940 ../src/project/project.vala:957\n#, c-format\nmsgid \"Remove package: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1053\nmsgid \"Remove source file\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1050\n#, c-format\nmsgid \"Remove source file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:169\nmsgid \"Report widget\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Returns a return value (programming).\n#: ../src/completion_provider.vala:255\nmsgid \"Returns:\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:432\nmsgid \"Run\"\nmsgstr \"執行\"\n\n#. TRANSLATORS: E.g. \"Run project browser update!\"\n#: ../src/ui/breakpoints.vala:230 ../src/ui/current_file_structure.vala:102\n#: ../src/ui/current_symbol.vala:70 ../src/ui/project_browser.vala:275\n#: ../src/ui/reports.vala:154 ../src/ui/search.vala:245\n#: ../src/ui/source_viewer.vala:624 ../src/ui/symbol_browser.vala:120\n#, c-format\nmsgid \"Run %s update!\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:59\n#, c-format\nmsgid \"Run '%s --help' to see a full list of available command line options.\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:552\nmsgid \"Run application\"\nmsgstr \"\"\n\n#: ../src/ui/build_output.vala:80\nmsgid \"Running...\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:718\n#, c-format\nmsgid \"Save Ui meta information: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:308\nmsgid \"Save all\"\nmsgstr \"全部儲存\"\n\n#: ../src/ui_main.vala:504\nmsgid \"Save current file\"\nmsgstr \"儲存目前檔案\"\n\n#: ../src/ui_main.vala:544\nmsgid \"Save current file and build project\"\nmsgstr \"儲存目前檔案並建置專案\"\n\n#: ../src/project/project.vala:1496\nmsgid \"Save project file.\\n\"\nmsgstr \"儲存專案檔. \\n\"\n\n#: ../src/project/project.vala:1597\n#, c-format\nmsgid \"Save project meta information: %s\\n\"\nmsgstr \"儲存專案設定資訊: %s\\n\"\n\n#: ../src/ui/search.vala:59 ../src/ui_main.vala:185\nmsgid \"Search\"\nmsgstr \"搜尋\"\n\n#: ../src/ui/welcome_screen.vala:620\nmsgid \"Select Valama project file\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:325\nmsgid \"Select new packages\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:193\nmsgid \"Select template\"\nmsgstr \"選擇範本\"\n\n#: ../src/ui/project_browser.vala:100 ../src/ui_main.vala:386\nmsgid \"Settings\"\nmsgstr \"設定\"\n\n#: ../src/ui_main.vala:355\nmsgid \"Show application output\"\nmsgstr \"顯示應用程式輸出\"\n\n#: ../src/ui_main.vala:356\nmsgid \"Show breakpoints\"\nmsgstr \"顯示中斷點\"\n\n#: ../src/ui_main.vala:354\nmsgid \"Show build output\"\nmsgstr \"顯示建置結果\"\n\n#: ../src/ui_main.vala:357\nmsgid \"Show current file structure\"\nmsgstr \"顯示當前檔案結構\"\n\n#: ../src/ui_main.vala:360\nmsgid \"Show current symbol\"\nmsgstr \"顯示當前符號\"\n\n#: ../src/ui_main.vala:353\nmsgid \"Show project browser\"\nmsgstr \"顯示專案流灠器\"\n\n#: ../src/ui_main.vala:352\nmsgid \"Show reports\"\nmsgstr \"顯示報告\"\n\n#: ../src/ui_main.vala:351\nmsgid \"Show search\"\nmsgstr \"顯示搜尋結果\"\n\n#: ../src/ui_main.vala:358\nmsgid \"Show style checker\"\nmsgstr \"顯示風格檢查結果\"\n\n#: ../src/ui_main.vala:359\nmsgid \"Show symbol browser\"\nmsgstr \"顯示符號流灠器\"\n\n#: ../src/common/common.vala:443\n#, c-format\nmsgid \"Skip %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1737 ../src/project/project.vala:1747\n#, c-format\nmsgid \"Skip '%s' choice.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1035 ../src/project/project.vala:1097\n#: ../src/project/project.vala:1152\n#, c-format\nmsgid \"Skip already added file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:88\n#, c-format\nmsgid \"Skip already loaded project: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:455\n#, c-format\nmsgid \"Skip overwrite from '%s' to '%s'.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1008\n#, c-format\nmsgid \"Source directory does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1006\n#, c-format\nmsgid \"Source file does not exist: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:668\nmsgid \"Source file update\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:473\nmsgid \"Source files\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:165\nmsgid \"Source view\"\nmsgstr \"\"\n\n#: ../src/ui/source_viewer.vala:470\nmsgid \"Source view id out of range.\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:285\nmsgid \"Sources\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:726\n#, c-format\nmsgid \"Substitute: '@%s@'%s -> '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/build_output.vala:98\nmsgid \"Succeeded\"\nmsgstr \"成功\"\n\n#: ../src/dialogs/create_project.vala:363\nmsgid \"Supported Vala versions\"\nmsgstr \"巳支援的Vala版本\"\n\n#: ../src/ui/symbol_browser.vala:44\nmsgid \"Symbol\"\nmsgstr \"符號\"\n\n#: ../src/ui_main.vala:201\nmsgid \"Symbol browser\"\nmsgstr \"符號流灠器\"\n\n#: ../src/project/project_templates.vala:221\n#, c-format\nmsgid \"Template file '%s' too old: %s < %s\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:306\n#, c-format\nmsgid \"Template has no description: line %hu\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:299\n#, c-format\nmsgid \"Template has no name: line %hu\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:79\nmsgid \"Template information\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:125\nmsgid \"Templates\"\nmsgstr \"範本專案\"\n\n#: ../src/common/args.vala:37\nmsgid \"Templates directory.\"\nmsgstr \"\"\n\n#: ../src/dialogs/missing_packages.vala:36\nmsgid \"The following vala packages are not available on your system:\\n\"\nmsgstr \"\"\n\n#: ../src/ui/breakpoints.vala:67\nmsgid \"Time\"\nmsgstr \"\"\n\n#. TRANSLATORS: Type in programming context as data type.\n#: ../src/ui/symbol_browser.vala:48\nmsgid \"Type\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:575 ../guanako/stylecheck.vala:616\n#, c-format\nmsgid \"Type not implemented yet: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:546\n#, c-format\nmsgid \"Unable to delete source file '%s': %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:361\n#, c-format\nmsgid \"Unable to guess package for define: %s\\n\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:515\nmsgid \"Undo last change\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:397\n#: ../src/dialogs/project_settings.vala:207\n#, c-format\nmsgid \"Unexpected enum value: %s: %d\\n\"\nmsgstr \"\"\n\n#: ../src/ui/project_browser.vala:467\n#, c-format\nmsgid \"Unexpected enum value: %s: %s\\n\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:500 ../src/dialogs/about.vala:66\n#: ../src/project/project.vala:274 ../src/project/project_templates.vala:108\n#: ../src/ui/project_browser.vala:145 ../src/ui/project_browser.vala:210\n#: ../src/ui/project_browser.vala:471 ../src/ui/project_browser.vala:554\n#, c-format\nmsgid \"Unexpected enum value: %s: %u\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1690 ../src/project/project.vala:2057\n#, c-format\nmsgid \"Unexpected response value: %s - %u\"\nmsgstr \"\"\n\n#: ../src/ui/reports.vala:192 ../src/ui/source_viewer.vala:213\n#, c-format\nmsgid \"Unknown ReportType: %s\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You might not want\n#. to translate \"TreePath\".\n#: ../src/ui/project_browser.vala:413 ../src/ui/project_browser.vala:451\n#: ../src/ui/project_browser.vala:533\n#, c-format\nmsgid \"Unknown TreePath start to add a new file: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1650 ../src/ui_main.vala:776\n#, c-format\nmsgid \"Unknown attribute for '%s' line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1310 ../src/project/project.vala:1351\n#: ../src/project/project.vala:1366 ../src/project/project.vala:1380\n#: ../src/project/project.vala:1394 ../src/project/project.vala:1408\n#: ../src/project/project.vala:1422 ../src/project/project.vala:1436\n#: ../src/project/project.vala:1450 ../src/project/project.vala:1464\n#: ../src/project/project.vala:1470 ../src/project/project.vala:1654\n#: ../src/project/project_templates.vala:290\n#: ../src/project/project_templates.vala:352\n#: ../src/project/project_templates.vala:358 ../src/ui_main.vala:782\n#, c-format\nmsgid \"Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:343\n#, c-format\nmsgid \"Unknown package version relation: %s - %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1332 ../src/project/project.vala:2182\n#: ../src/project/project_templates.vala:263\n#, c-format\nmsgid \"Unknown property for '%s' line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:152\n#, c-format\nmsgid \"Unknown status: %d - %s\\n\"\nmsgstr \"\"\n\n#: ../src/project/project_templates.vala:344\n#, c-format\nmsgid \"Unknown value for substitution property '%s' line %hu (assume '%s'): %s\"\nmsgstr \"\"\n\n#: ../build/data/valama.desktop.in.h:4\nmsgid \"Vala;IDE;Development;\"\nmsgstr \"\"\n\n#: ../src/main.vala:104\nmsgid \"Valama\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:42 ../src/ui/welcome_screen.vala:583\nmsgid \"Valama project files (*.vlp)\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:100\nmsgid \"Valama project not initialized\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:46\nmsgid \"Valama project not initialized.\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:287 ../guanako/guanako.vala:300\n#, c-format\nmsgid \"Vapi found: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:876\n#, c-format\nmsgid \"Variable '%s' not found! >%s<\\n\"\nmsgstr \"\"\n\n#: ../src/dialogs/project_settings.vala:151\nmsgid \"Version:\"\nmsgstr \"版本:\"\n\n#: ../build/data/apps.valama.gschema.xml.h:2\nmsgid \"Vertical window size\"\nmsgstr \"\"\n\n#: ../src/ui_main.vala:346\nmsgid \"View\"\nmsgstr \"檢視\"\n\n#: ../src/dialogs/project_settings.vala:38\nmsgid \"View all files (*)\"\nmsgstr \"檢視全部檔案 (*)\"\n\n#: ../guanako/reporter.vala:39\nmsgid \"Warning\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:733\n#, c-format\nmsgid \"Warning: \"\nmsgstr \"\"\n\n#. TRANSLATORS: This is a technical information. You migth not\n#. want to translate \"CheckType\".\n#: ../guanako/stylecheck.vala:473\n#, c-format\nmsgid \"Warning: No CheckType found, assume 'GLOBAL'.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:467\n#, c-format\nmsgid \"Warning: No description found.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:447\n#, c-format\nmsgid \"Warning: No regex to check.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:397\n#, c-format\nmsgid \"Warning: Skip different description: '%s' - '%s'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:437\n#, c-format\nmsgid \"Warning: Skip different match groups: '%d' - '%d'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:427\n#, c-format\nmsgid \"Warning: Skip different regexes: '%s' - '%s'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:410\n#, c-format\nmsgid \"Warning: Skip different type: '%s' - '%s'\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:408\n#, c-format\nmsgid \"Warning: Unknown CheckType '%s', assume 'GLOBAL'.\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:619\n#, c-format\nmsgid \"Warning: Unknown CheckType: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/stylecheck.vala:442 ../guanako/stylecheck.vala:461\n#, c-format\nmsgid \"Warning: Unknown configuration file value line %hu: %s\\n\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:283 ../guanako/guanako.vala:296\n#, c-format\nmsgid \"Warning: Vapi for package %s not found.\\n\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:1242\n#, c-format\nmsgid \"Will not add '%s' to file list: File not valid\\n\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:41\nmsgid \"[DEBUGLEVEL]\"\nmsgstr \"\"\n\n#: ../src/common/args.vala:45\nmsgid \"[FILE...]\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X > Y\n#: ../src/dialogs/create_project.vala:375\nmsgid \"after\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X < Y\n#: ../src/dialogs/create_project.vala:387\nmsgid \"before\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:166\nmsgid \"build command failed\"\nmsgstr \"\"\n\n#. TRANSLATORS: Choice of different packages.\n#: ../src/project/project.vala:910\n#, c-format\nmsgid \"choice\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:226\nmsgid \"clean command failed\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:133\nmsgid \"configure command failed\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:117\n#, c-format\nmsgid \"directory creation failed: %s\"\nmsgstr \"\"\n\n#: ../src/buildsystem/cmake.vala:260\n#, c-format\nmsgid \"distclean command failed: %s\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:525\nmsgid \"file does not exist\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:68\nmsgid \"filename\"\nmsgstr \"\"\n\n#. TRANSLATORS:\n#. Context: Add new file to project (inside `foobar' directory)\n#: ../src/dialogs/create_file.vala:57\n#, c-format\nmsgid \"inside '%s' directory\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_file.vala:58\n#, c-format\nmsgid \"inside project root directory\"\nmsgstr \"\"\n\n#: ../src/buildsystem/base.vala:385\nmsgid \"launching failed\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:284\nmsgid \"no long description\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:463\nmsgid \"no package required\"\nmsgstr \"\"\n\n#: ../src/common/common.vala:552\nmsgid \"no regular file or directory\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:485\nmsgid \"no source files\"\nmsgstr \"\"\n\n#. TRANSLATORS: Context: Parameters: none\n#: ../src/completion_provider.vala:251\nmsgid \"none\"\nmsgstr \"\"\n\n#: ../src/dialogs/create_project.vala:437\nmsgid \"not available\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X != Y\n#: ../src/dialogs/create_project.vala:394\nmsgid \"not supported\"\nmsgstr \"\"\n\n#: ../guanako/guanako.vala:857\n#, c-format\nmsgid \"pop_cur symbol not found! '%s'\\n\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X >= Y\n#: ../src/dialogs/create_project.vala:379\nmsgid \"since\"\nmsgstr \"\"\n\n#. TRANSLATORS: Version relation: X <= Y\n#: ../src/dialogs/create_project.vala:383\nmsgid \"until\"\nmsgstr \"\"\n\n#: ../src/project/project.vala:396\nmsgid \"valama_project\"\nmsgstr \"\"\n"
  },
  {
    "path": "src/buildsystem/autotools.vala",
    "content": "public class BuilderAutotools : BuildSystem\n{\n    string configure_ac;\n    string makefile_am;\n    bool autoreconfigured;\n    \n    public BuilderAutotools (bool make_lib = false)\n    {\n        Object(library: make_lib);\n    }\n    \n    public override string get_executable() {\n        return project.project_name.down();\n    }\n\n    public override inline string get_name() {\n        return \"Autotools\";\n    }\n\n    public override inline string get_name_id() {\n        return \"autotools\";\n    }\n    \n    public override bool check_buildsystem_file (string filename) {\n        return filename == \"configure.ac\";\n    }\n    \n    public override bool preparate() throws BuildError.INITIALIZATION_FAILED {\n        if (project == null)\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Valama project not initialized.\"));\n        buildpath = project.project_path;\n        configure_ac = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       \"configure.ac\");\n        makefile_am = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       \"Makefile.am\");\n        init_dir (buildpath);\n        init_dir (Path.build_path (Path.DIR_SEPARATOR_S, buildpath, \"m4\"));\n        return true;\n    }\n    \n    bool autoreconf (out int? exit_status = null) throws BuildError.INITIALIZATION_FAILED,\n                                            BuildError.CONFIGURATION_FAILED {\n        exit_status = null;\n        if (!initialized && !initialize (out exit_status))\n            return false;\n        \n        exit_status = null;\n        autoreconfigured = false;\n        configure_started();\n\n        var cmdline = new string[] {\"autoreconf\", \"-f\", \"-i\"};\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            configure_finished();\n            throw new BuildError.CONFIGURATION_FAILED (_(\"autoreconf command failed\"));\n        }\n        \n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n        \n        builder_loop.run();\n        exit_status = exit;\n        autoreconfigured = true;\n        configure_finished();\n        return exit_status == 0;\n    }\n    \n    public override bool configure (out int? exit_status = null) throws BuildError.INITIALIZATION_FAILED,\n                                            BuildError.CONFIGURATION_FAILED {\n        exit_status = null;\n        if (!autoreconfigured && !autoreconf (out exit_status))\n            return false;\n\n        exit_status = null;\n        configured = false;\n        configure_started();\n\n        var cmdline = new string[] {Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       \"configure\")};\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            configure_finished();\n            throw new BuildError.CONFIGURATION_FAILED (_(\"configure command failed\"));\n        }\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        configured = true;\n        configure_finished();\n        return exit_status == 0;\n    }\n    \n    public override bool initialize (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED {\n        exit_status = null;\n        initialized = false;\n        if(!preparate())\n            return false;\n        initialize_started();\n\n        try {\n            var file_stream = File.new_for_path (configure_ac).replace (\n                                                    null,\n                                                    false,\n                                                    FileCreateFlags.REPLACE_DESTINATION);\n            var data_stream = new DataOutputStream (file_stream);\n            var str_name = project.project_name.replace(\"-\",\"_\");\n            /*\n             * Don't translate this part to make collaboration with VCS and\n             * multiple locales easier.\n             */\n            data_stream.put_string (\"dnl This file was auto generated by Valama %s. Do not modify it.\\n\".printf (Config.PACKAGE_VERSION));\n            //TODO: Check if file needs changes and set date accordingly.\n            // var time = new DateTime.now_local();\n            // data_stream.put_string (\"dnl Last change: %s\\n\".printf (time.format (\"%F %T %z\")));\n            data_stream.put_string (@\"AC_INIT([$str_name], [$(project.version_major).$(project.version_minor)])\\n\");\n            data_stream.put_string (\"AC_CONFIG_HEADERS(config.h)\\n\");\n            data_stream.put_string (\"AC_CONFIG_MACRO_DIR([m4])\\n\");\n            data_stream.put_string (\"AM_INIT_AUTOMAKE([check-news dist-bzip2 subdir-objects])\\n\");\n            data_stream.put_string (\"m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\\n\");\n            data_stream.put_string (\"\\n\");\n            data_stream.put_string (\"AM_PROG_AR\\n\");\n            data_stream.put_string (\"LT_INIT\\n\");\n            data_stream.put_string (\"AC_PROG_CC\\n\");\n            data_stream.put_string (\"AM_PROG_VALAC\\n\");\n            data_stream.put_string (\"\\n\");\n            data_stream.put_string (@\"PKG_CHECK_MODULES($(str_name.up()), [\");\n            foreach (var pkgmap in get_pkgmaps().values)\n                if (pkgmap.check)\n                    data_stream.put_string (@\"$(pkgmap as PackageInfo) \");\n            data_stream.put_string (\"])\\n\");\n            data_stream.put_string (@\"AC_SUBST($(str_name.up())_CFLAGS)\\n\");\n            data_stream.put_string (@\"AC_SUBST($(str_name.up())_LIBS)\\n\");\n            data_stream.put_string (\"\\n\");\n            data_stream.put_string (\"AC_CONFIG_FILES([Makefile])\\n\");\n            data_stream.put_string (\"AC_OUTPUT\\n\");\n            \n            data_stream.close();\n            \n            file_stream = File.new_for_path (makefile_am).replace (\n                                                    null,\n                                                    false,\n                                                    FileCreateFlags.REPLACE_DESTINATION);\n                                                    \n            data_stream = new DataOutputStream (file_stream);\n            data_stream.put_string (\"AM_CFLAGS = $(\"+str_name.up()+\"_CFLAGS)\\n\\n\");\n            string lower_libname = null;\n            if (library)\n            {\n                string libname = project.project_name.has_prefix (\"lib\") ? project.project_name : \"lib\"+project.project_name;\n                libname += \".la\";\n                lower_libname = libname.replace (\"-\",\"_\").replace (\".\",\"_\");\n                data_stream.put_string (\"lib_LTLIBRARIES = \"+libname+\"\\n\\n\");\n                data_stream.put_string (lower_libname+\"_LIBADD = $(\"+str_name.up()+\"_LIBS)\");\n\t\t\t\tif (project.flags != null) {\n\t\t\t\t\tvar flags = project.flags.split (\" \");\n\t\t\t\t\tfor (var i = 0; i < flags.length - 1; i++)\n\t\t\t\t\t\tif (flags[i] == \"-X\")\n\t\t\t\t\t\t\tdata_stream.put_string (flags[i + 1] + \" \");\n\t\t\t\t}\n\t\t\t\tdata_stream.put_string (\"\\n\\n\");\n                data_stream.put_string (str_name.down()+\"includedir = $(includedir)\\n\");\n                data_stream.put_string (str_name.down()+@\"include_HEADERS = $(str_name.down()).h\\n\\n\");\n                data_stream.put_string (\"pkgconfigdir = $(libdir)/pkgconfig\\n\");\n                data_stream.put_string (@\"pkgconfig_DATA = $(str_name.down()).pc\\n\\n\");\n                data_stream.put_string (\"vapidir = $(datadir)/vala/vapi\\n\");\n                data_stream.put_string (@\"dist_vapi_DATA = $(str_name.down()).vapi $(str_name.down()).deps\\n\\n\");\n            }\n            else {\n                data_stream.put_string (\"bin_PROGRAMS = \"+project.project_name+\"\\n\\n\");\n                data_stream.put_string (str_name+\"_LDADD = $(\"+str_name.up()+\"_LIBS) \");\n                if (project.flags != null) {\n\t\t\t\t\tvar flags = project.flags.split (\" \");\n\t\t\t\t\tfor (var i = 0; i < flags.length - 1; i++)\n\t\t\t\t\t\tif (flags[i] == \"-X\")\n\t\t\t\t\t\t\tdata_stream.put_string (flags[i + 1] + \" \");\n\t\t\t\t}\n\t\t\t\tdata_stream.put_string (\"\\n\\n\");\n            }\n            var str_files = new StringBuilder ((library ? lower_libname : str_name.down())+\"_SOURCES = \");\n            foreach (var filepath in project.files) {\n                var fname = project.get_relative_path (filepath);\n                str_files.append (@\"$fname \");\n            }\n            str_files.append (\"\\n\\n\");\n            data_stream.put_string (str_files.str);\n            var str_pkgs = new StringBuilder ((library ? lower_libname : str_name.down())+\"_VALAFLAGS = \");\n            foreach (var pkgmap in get_pkgmaps().values)\n                if (pkgmap.check)\n                    str_pkgs.append (\"--pkg \" + pkgmap.name + \" \");\n            if (library)\n            {\n                str_pkgs.append (\" --vapi %s.vapi -H %s.h --library %s\".printf(str_name.down(),str_name.down(),str_name.down()));\n            }\n            str_pkgs.append (\"\\n\\n\");\n            data_stream.put_string (str_pkgs.str);\n            data_stream.put_string (\"CLEANFILES = *.c *.o \"+str_name.down()+\"\\n\");\n            data_stream.close();\n            \n            if (library)\n            {\n                var str_deps = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       str_name.down()+\".deps\");\n                file_stream = File.new_for_path (str_deps).create (FileCreateFlags.REPLACE_DESTINATION);\n                data_stream = new DataOutputStream (file_stream);\n                foreach (var pkgmap in get_pkgmaps().values) {\n                    if (pkgmap.choice_pkg != null && !pkgmap.check)\n                        data_stream.put_string (@\"$(pkgmap as PackageInfo)\\n\");\n                    else\n                        data_stream.put_string (@\"$pkgmap\\n\");\n                }\n                data_stream.close();\n                \n                var str_pc = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       str_name.down()+\".pc\");\n                file_stream = File.new_for_path (str_pc).create (FileCreateFlags.REPLACE_DESTINATION);\n                data_stream = new DataOutputStream (file_stream);\n                var short_name = project.project_name.has_prefix (\"lib\") ? \n                    project.project_name.substring (3) : \n                    project.project_name;\n                var req = \"\";\n                foreach (var pkgmap in get_pkgmaps().values) {\n                    if (pkgmap.choice_pkg != null && !pkgmap.check)\n                        req += @\"$(pkgmap as PackageInfo) \";\n                    else\n                        req += @\"$pkgmap \";\n                }\n                data_stream.put_string (\"\"\"prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\ndatarootdir=@datarootdir@\ndatadir=@datadir@\nincludedir=@includedir@/%s\n\nName: Mee\nDescription: .pc file created by Valama.\nVersion: @VERSION@\nRequires: %s\nLibs: -L${libdir} -l%s\nCflags: -I${includedir}\"\"\".printf (project.project_name, req, short_name));\n                data_stream.close();\n            }\n            \n        } catch (GLib.IOError e) {\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Could not read file: %s\\n\"), e.message);\n        } catch (GLib.Error e) {\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Could not open file: %s\\n\"), e.message);\n        }\n\n        exit_status = 0;\n        initialized = true;\n        initialize_finished();\n        return true;\n    }\n    \n    public override bool build (out int? exit_status = null) throws BuildError.INITIALIZATION_FAILED,\n                                        BuildError.CONFIGURATION_FAILED,\n                                        BuildError.BUILD_FAILED {\n        exit_status = null;\n        if (!configured && !configure (out exit_status))\n            return false;\n\n        exit_status = null;\n        built = false;\n        build_started();\n        var cmdline = new string[] {\"make\", @\"-j$(BuildSystem.threads)\"};\n\n        Pid? pid;\n        int? pstdout, pstderr;\n        if (!call_cmd (cmdline, out pid, true, out pstdout, out pstderr)) {\n            build_finished();\n            throw new BuildError.CONFIGURATION_FAILED (_(\"build command failed\"));\n        }\n\n        var chn = new IOChannel.unix_new (pstdout);\n        chn.set_buffer_size (1);\n        chn.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n            bool ret;\n            var output = channel_output_read_line (source, condition, out ret);\n            Regex r = /^\\[(?P<percent>.*)\\%\\].*$/;\n            MatchInfo info;\n            if (r.match (output, 0, out info)) {\n                var percent_string = info.fetch_named (\"percent\");\n                build_progress (int.parse (percent_string));\n            }\n            build_output (output);\n            return ret;\n        });\n\n        var chnerr = new IOChannel.unix_new (pstderr);\n        chnerr.set_buffer_size (1);\n        chnerr.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n            bool ret;\n            build_output (channel_output_read_line (source, condition, out ret));\n            return ret;\n        });\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        built = true;\n        build_finished();\n        return exit_status == 0;\n    }\n    \n    public override bool check_existance() {\n        var makefile = File.new_for_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                           buildpath,\n                                                           \"Makefile\"));\n        return makefile.query_exists();\n    }\n    \n    public override bool clean (out int? exit_status = null)\n                                        throws BuildError.CLEAN_FAILED {\n        exit_status = null;\n        // cleaned = false;\n        clean_started();\n\n        if (!check_existance()) {\n            build_output (_(\"No data to clean.\\n\"));\n            clean_finished();\n            return true;\n        }\n\n        var cmdline = new string[] {\"make\", \"clean\"};\n\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            clean_finished();\n            throw new BuildError.CLEAN_FAILED (_(\"clean command failed\"));\n        }\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        // cleaned = true;\n        clean_finished();\n        return exit_status == 0;\n    }\n    \n    public override bool distclean (out int? exit_status = null)\n                                            throws BuildError.CLEAN_FAILED {\n        exit_status = null;\n        // distcleaned = false;\n        distclean_started();\n\n        if (!check_existance()) {\n            build_output (_(\"No data to clean.\\n\"));\n            distclean_finished();\n            return true;\n        }\n\n        var cmdline = new string[] {\"make\", \"distclean\"};\n\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            clean_finished();\n            throw new BuildError.CLEAN_FAILED (_(\"distclean command failed\"));\n        }\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        // distcleaned = true;\n        distclean_finished();\n        return exit_status == 0;\n    }\n}\n"
  },
  {
    "path": "src/buildsystem/base.vala",
    "content": "/*\n * src/buildsystem/base.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gee;\n\npublic abstract class BuildSystem : Object {\n    public string? buildpath { get; protected set; default = null; }\n    /*\n     * NOTE: string type to support -j without argument for infite parallel\n     *       threads.\n     */\n    //TODO: Make it a global configuration option.\n    public static string threads { get; protected set; default = \"2\"; }\n\n    public bool initialized { get; protected set; default = false; }\n    public bool configured { get; protected set; default = false; }\n    public bool built { get; protected set; default = false; }\n    public bool cleaned { get; protected set; default = false; }\n    public bool launched { get; protected set; default = false; }\n    \n    public bool library { get; construct; }\n\n    protected Pid? app_pid;\n    public ProcessSignal? ps { get; protected set; default = null; }\n\n    public signal void initialize_started();\n    public signal void initialize_finished();\n    public signal void configure_started();\n    public signal void configure_finished();\n    public signal void build_started();\n    public signal void build_finished();\n    public signal void clean_started();\n    public signal void clean_finished();\n    public signal void distclean_started();\n    public signal void distclean_finished();\n    public signal void runtests_started();\n    public signal void runtests_finished();\n\n    public signal void build_output (string output);\n    public signal void build_progress (int percent);\n\n    public signal void app_output (string output);\n\n    protected MainLoop builder_loop;\n\n\n    construct {\n        builder_loop = new MainLoop();\n\n        initialize_started.connect (() => {\n            debug_msg (_(\"Buildsystem initialization started: %s\\n\"), this.get_name());\n        });\n        initialize_finished.connect (() => {\n            debug_msg (_(\"Buildsystem initialization finished: %s\\n\"), this.get_name());\n        });\n        configure_started.connect (() => {\n            debug_msg (_(\"Buildsystem configuration started: %s\\n\"), this.get_name());\n        });\n        configure_finished.connect (() => {\n            debug_msg (_(\"Buildsystem configuration finished: %s\\n\"), this.get_name());\n        });\n        build_started.connect (() => {\n            debug_msg (_(\"Buildsystem build started: %s\\n\"), this.get_name());\n        });\n        build_finished.connect (() => {\n            debug_msg (_(\"Buildsystem build finished: %s\\n\"), this.get_name());\n        });\n        clean_started.connect (() => {\n            debug_msg (_(\"Buildsystem cleaning started: %s\\n\"), this.get_name());\n        });\n        clean_finished.connect (() => {\n            debug_msg (_(\"Buildsystem cleaning finished: %s\\n\"), this.get_name());\n        });\n        distclean_started.connect (() => {\n            debug_msg (_(\"Buildsystem distcleaning started: %s\\n\"), this.get_name());\n        });\n        distclean_finished.connect (() => {\n            debug_msg (_(\"Buildsystem distcleaning finished: %s\\n\"), this.get_name());\n        });\n        runtests_started.connect (() => {\n            debug_msg (_(\"Buildsystem tests started: %s\\n\"), this.get_name());\n        });\n        runtests_finished.connect (() => {\n            debug_msg (_(\"Buildsystem tests finished: %s\\n\"), this.get_name());\n        });\n    }\n\n    public void init (ValamaProject? vproject = null) throws BuildError.INITIALIZATION_FAILED {\n        var tmp_project = (vproject != null) ? vproject : project;\n        if (tmp_project == null)\n                throw new BuildError.INITIALIZATION_FAILED (_(\"Valama project not initialized\"));\n        tmp_project.defines_changed.connect ((added, define) => {\n            if (added)\n                register_define (define);\n            else\n                unregister_define (define);\n        });\n    }\n\n    public static void init_dir (string path) throws BuildError.INITIALIZATION_FAILED {\n        var f = File.new_for_path (path);\n        try {\n            if (!f.query_exists() && !f.make_directory_with_parents())\n                throw new BuildError.INITIALIZATION_FAILED (_(\"directory creation failed: %s\"),\n                                                            path);\n        } catch (GLib.Error e) {\n            throw new BuildError.INITIALIZATION_FAILED (e.message);\n        }\n    }\n\n    public abstract string get_executable();\n\n    public virtual inline string get_executable_abs() {\n        if (buildpath == null)\n            return \"\";\n        return Path.build_path (Path.DIR_SEPARATOR_S,\n                                buildpath,\n                                get_executable());\n    }\n\n    public abstract string get_name();\n    public abstract string get_name_id();\n\n    public abstract bool check_buildsystem_file (string filename);\n\n    public bool executable_exists() {\n        var fexe = File.new_for_path (get_executable_abs());\n        return fexe.query_exists();\n    }\n\n    protected inline int? get_exit (int status) {\n        if (Process.if_exited (status)) {\n            ps = null;\n            return Process.exit_status (status);\n        } else if (Process.if_signaled (status)) {\n            ps = Process.term_sig (status);\n            return null;\n        }\n        bug_msg (_(\"Unknown status: %d - %s\\n\"), status, \"BuildSystem.get_exit\");\n        return null;\n    }\n\n    protected virtual void register_define (string define) {\n        if (project.define_is_enabled_emit (define)) {\n            debug_msg (_(\"Define already enabled: %s\\n\"), define);\n            return;\n        } else if (project.define_is_not_available (define)) {\n            debug_msg (_(\"Define already checked (and not available): %s\\n\"), define);\n            return;\n        }\n        string package;\n        if (guess_pkg_by_define (define, out package)) {\n            if (project.define_set (define))\n                debug_msg (_(\"Enable define for package '%s': %s\\n\"), package, define);\n            else\n                debug_msg (_(\"Define '%s' already enabled for package '%s'.\\n\"), define, package);\n        } else\n            project.define_set (define, false);\n    }\n\n    protected virtual void unregister_define (string define) {\n        if (project.define_set (define, false))\n            // TRANSLATORS:\n            // A \"define\" is a preprocessor symbol which is either set or unset:\n            // #if FOOBAR || BARFOO   <- where FOOBAR and BARFOO are defines\n            debug_msg (_(\"Disable define: %s\\n\"), define);\n    }\n\n    protected bool guess_pkg_by_define (string define, out string? package = null) {\n        package = null;\n\n        var digits = /^\\d+$/;\n\n        var end = false;\n\n        var defparts = define.split (\"_\");\n        string[] pkg_name = {\"\"};\n        string[] pkg_ver = {};\n        VersionRelation? pkg_rel = null;\n        bool prev_alpha = false;\n        for (int i = 0; i < defparts.length; ++i) {\n            if (i == defparts.length - 1)\n                end = true;\n\n            var check = defparts[i].down();\n\n            if (pkg_rel == null) {\n                pkg_rel = VersionRelation.name_to_rel (check, false);\n                if (pkg_rel != null) {\n                    prev_alpha = true;\n                    continue;\n                }\n            }\n\n            if (prev_alpha) {\n                var tmpver = string.joinv (\".\", defparts[i:defparts.length]);\n                if (tmpver != \"\")\n                    pkg_ver += tmpver;\n            }\n\n\n            if (digits.match (check)) {\n                if (i == 0)\n                    return false;\n                prev_alpha = false;\n\n                // if (pkg_rel == null) {\n                    var length = pkg_name.length;\n                    for (int j = 0; j < length; ++j) {\n                        pkg_name += @\"$(pkg_name[j])-$check\";\n                        if ((pkg_name[j][pkg_name[j].length-1]).isdigit())\n                            pkg_name += @\"$(pkg_name[j]).$check\";\n                        pkg_name += @\"$(pkg_name[j])$check\";\n                    }\n                // }\n            } else {\n                prev_alpha = true;\n                if (end && (defparts.length == 1 ||\n                                defparts.length == 2 && pkg_rel == VersionRelation.EXCLUDE))\n                    switch (check) {\n                        case \"unix\":\n                        case \"linux\":\n                        case \"apple\":\n                            if (pkg_rel != null)\n#if UNIX\n                                return false;\n#elif WIN32\n                                return true;\n#else\n                                return false;\n#endif\n                            else\n#if UNIX\n                                return true;\n#elif WIN32\n                                return false;\n#else\n                                return false;\n#endif\n\n                        case \"win\":\n                        case \"win32\":\n                        case \"windows\":\n                            if (pkg_rel != null)\n#if WIN32\n                                return false;\n#elif UNIX\n                                return true;\n#else\n                                return false;\n#endif\n                            else\n#if WIN32\n                                return true;\n#elif UNIX\n                                return false;\n#else\n                                return false;\n#endif\n                        default:\n                            break;\n                    }\n\n                var length = pkg_name.length;\n                for (int j = 0; j < length; ++j) {\n                    if (check == \"gtk\")\n                        pkg_name += @\"$(pkg_name[j])gtk+\";\n                    if (check == \"valac\") {\n                        pkg_name += @\"$(pkg_name[j])vala\";\n                        if (i == 0)\n                            pkg_name += @\"lib$(pkg_name[j])vala\";\n                    }\n                    if (i == 0)\n                        pkg_name += @\"lib$check\";\n                    else\n                        pkg_name += @\"$(pkg_name[j])-$check\";\n                    pkg_name[j] = @\"$(pkg_name[j])$check\";\n                }\n            }\n        }\n\n        for (int i = 0; i < pkg_name.length; ++i) {\n            string[] checks = {pkg_name[i]};\n            if ((pkg_name[i][pkg_name[i].length-1]).isdigit())\n                checks += @\"$(pkg_name[i]).0\";\n            foreach (var check in checks) {\n                foreach (var ver in pkg_ver) {\n                    /* Does not cover choices (intended). */\n                    if (check in project.packages.keys) {\n                        string? version;\n                        if (!package_exists (check, out version)) {\n                            debug_msg (_(\"Could not find pkg-config file for '%s'. \"\n                                        + \"Enable define '%s' without version check.\\n\"),\n                                        check, define);\n                            package = check;\n                            return true;\n                        } else {\n                            if (version == null)\n                                return false;\n                            bool ret;\n                            if (pkg_rel != null)\n                                switch (pkg_rel) {\n                                    case VersionRelation.AFTER:\n                                        ret = comp_version (version, ver) > 0;\n                                        break;\n                                    case VersionRelation.SINCE:\n                                        ret = comp_version (version, ver) >= 0;\n                                        break;\n                                    case VersionRelation.BEFORE:\n                                        ret = comp_version (version, ver) < 0;\n                                        break;\n                                    case VersionRelation.UNTIL:\n                                        ret = comp_version (version, ver) <= 0;\n                                        break;\n                                    case VersionRelation.ONLY:\n                                        ret = comp_version (version, ver) == 0;\n                                        break;\n                                    case VersionRelation.EXCLUDE:\n                                        ret = comp_version (version, ver) != 0;\n                                        break;\n                                    default:\n                                        bug_msg (_(\"Unknown package version relation: %u - %s\\n\"),\n                                                   pkg_rel, \"guess_pkg_by_define\");\n                                        continue;\n                                }\n                            else\n                                ret = comp_version (version, ver) >= 0;\n                            if (ret) {\n                                package = check;\n                                return true;\n                            } else\n                                // TRANSLATORS: Context: ... for package `foobar' <= 0.42 found: ...\n                                debug_msg_level (2, _(\"Incompatible version for package '%s' %s %s found: %s\\n\"),\n                                           pkg_name[i],\n                                           (pkg_rel != null) ? VersionRelation.to_string_symbol (pkg_rel)\n                                                             : \">=\",\n                                           ver,\n                                           version);\n                        }\n                    }\n                }\n            }\n        }\n\n        debug_msg (_(\"Unable to guess package for define: %s\\n\"), define);\n        return false;\n    }\n\n    public virtual bool launch (string[] cmdparams = {}, out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED,\n                                               BuildError.CONFIGURATION_FAILED,\n                                               BuildError.BUILD_FAILED,\n                                               BuildError.LAUNCHING_FAILED {\n        launched = false;\n        app_pid = null;\n        exit_status = null;\n        if (!executable_exists() && (built || build())) {\n            warning_msg (_(\"Project already built but executable does not exist: %s\\n\"),\n                         get_executable_abs());\n            return false;\n        }\n\n        string[] cmdline = { get_executable_abs() };\n        foreach (var param in cmdparams)\n            cmdline += param;\n\n        int? pstdout, pstderr;\n        if (!call_cmd (cmdline, out app_pid, true, out pstdout, out pstderr))\n            throw new BuildError.LAUNCHING_FAILED (_(\"launching failed\"));\n\n        var chn = new IOChannel.unix_new (pstdout);\n        /*\n         *NOTE:\n         * Use smallest possible buffer size (in fact G_MAX_CHAR_SIZE = 10).\n         * Unfortunately this does not completely disable buffering. See #15.\n         */\n        chn.set_buffer_size (1);\n        chn.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n            bool ret;\n            app_output (channel_output_read_line (source, condition, out ret));\n            return ret;\n        });\n        var chnerr = new IOChannel.unix_new (pstderr);\n        chnerr.set_buffer_size (1);\n        chnerr.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n            bool ret;\n            app_output (channel_output_read_line (source, condition, out ret));\n            return ret;\n        });\n\n        int? exit = null;\n        ChildWatch.add (app_pid, (intpid, status) => {\n            launched = false;\n            exit = get_exit (status);\n            builder_loop.quit();\n        });\n\n        launched = true;\n        builder_loop.run();\n        exit_status = exit;\n        app_pid = null;\n        return exit_status == 0;\n    }\n\n    public virtual void launch_kill() {\n        if (!launched)\n            return;\n\n        builder_loop.quit();\n        //TODO: Does this work on Windows?\n        Posix.kill (app_pid, 15);\n        Process.close_pid (app_pid);\n    }\n\n    public virtual bool preparate() throws BuildError.INITIALIZATION_FAILED {\n        if (buildpath == null) {\n            if (project == null)\n                throw new BuildError.INITIALIZATION_FAILED (_(\"Valama project not initialized.\"));\n            buildpath = Path.build_path (Path.DIR_SEPARATOR_S,\n                                         project.project_path,\n                                         \"build\");\n            init_dir (buildpath);\n        }\n        return true;\n    }\n\n    public virtual bool initialize (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED {\n        exit_status = null;\n        if (!preparate())\n            return false;\n\n        exit_status = 0;\n        initialized = true;\n        return true;\n    }\n\n    public virtual bool configure (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED,\n                                               BuildError.CONFIGURATION_FAILED {\n        exit_status = null;\n        if (!initialized && !initialize (out exit_status))\n            return false;\n        exit_status = 0;\n        configured = true;\n        return true;\n    }\n\n    public virtual bool build (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED,\n                                               BuildError.CONFIGURATION_FAILED,\n                                               BuildError.BUILD_FAILED {\n        exit_status = null;\n        if (!configured && !configure (out exit_status))\n            return false;\n        exit_status = 0;\n        built = true;\n        return true;\n    }\n\n    public virtual bool check_existance() {\n        return true;\n    }\n\n    public virtual bool clean (out int? exit_status = null)\n                                        throws BuildError.CLEAN_FAILED {\n        exit_status = 0;\n        cleaned = true;\n        return true;\n    }\n\n    public virtual bool distclean (out int? exit_status = null)\n                                        throws BuildError.CLEAN_FAILED {\n        exit_status = 0;\n        cleaned = true;\n        project.enable_defines_all();\n        return true;\n    }\n\n    public virtual bool runtests (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED,\n                                               BuildError.CONFIGURATION_FAILED,\n                                               BuildError.BUILD_FAILED,\n                                               BuildError.TEST_FAILED {\n        exit_status = null;\n        if (!built && !build (out exit_status))\n            return false;\n        exit_status = 0;\n        return true;\n    }\n\n    protected static TreeMap<string, PkgBuildInfo> get_pkgmaps() {\n        var pkgmaps = new TreeMap<string, PkgBuildInfo> (null, PkgBuildInfo.compare_name);\n\n        foreach (var pkg in project.packages.values) {\n            pkgmaps.set (pkg.name, new PkgBuildInfo (pkg.name,\n                                                     pkg.version,\n                                                     pkg.rel));\n            if (pkg.choice != null && pkg.choice.all)\n                foreach (var pkg_choice in pkg.choice.packages)\n                    if (pkg != pkg_choice)\n                        pkgmaps.set (pkg_choice.name,\n                                     new PkgBuildInfo (pkg_choice.name,\n                                                       pkg_choice.version,\n                                                       pkg_choice.rel,\n                                                       pkg.name));\n        }\n\n        foreach (var pkgname in project.get_all_packages())\n            if (!pkgmaps.has_key (pkgname))\n                pkgmaps.set (pkgname, new PkgBuildInfo (pkgname, null, null,\n                                                        null, false));\n\n        return pkgmaps;\n    }\n\n    protected bool call_cmd (string[]? cmdline, out Pid? outpid = null, bool manual = false,\n                            out int? out_stdout = null, out int? out_stderr = null) {\n        outpid = null;\n        out_stdout = null;\n        out_stderr = null;\n        if (cmdline == null)\n            return false;\n\n        Pid? pid = null;\n        int pstdout;\n        int pstderr;\n        try {\n            Process.spawn_async_with_pipes (buildpath,\n                                            cmdline,\n                                            null,\n                                            SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD,\n                                            null,\n                                            out pid,\n                                            null,\n                                            out pstdout,\n                                            out pstderr);\n            outpid = pid;\n            out_stdout = pstdout;\n            out_stderr = pstderr;\n        } catch (GLib.SpawnError e) {\n            errmsg (_(\"Could not spawn subprocess: %s\\n\"), e.message);\n            return false;\n        }\n\n        if (!manual) {\n            var chn = new IOChannel.unix_new (pstdout);\n            chn.set_buffer_size (1);\n            chn.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n                bool ret;\n                build_output (channel_output_read_line (source, condition, out ret));\n                return ret;\n            });\n            var chnerr = new IOChannel.unix_new (pstderr);\n            chnerr.set_buffer_size (1);\n            chnerr.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n                bool ret;\n                build_output (channel_output_read_line (source, condition, out ret));\n                return ret;\n            });\n        }\n\n        return true;\n    }\n\n    protected static string channel_output_read_line (IOChannel source,\n                                             IOCondition condition,\n                                             out bool return_value) {\n        if (condition == IOCondition.HUP) {\n            return_value = false;\n            return \"\";\n        }\n        string output = \"\";\n        try {\n            source.read_line (out output, null, null);\n        } catch (GLib.ConvertError e) {\n            errmsg (_(\"Could not convert all characters: %s\\n\"), e.message);\n        } catch (GLib.IOChannelError e) {\n            // TRANSLATORS: This is a technical information. So you might not\n            // want to translate \"IOChannel\".\n            errmsg (_(\"IOChannel operation failed: %s\\n\"), e.message);\n        }\n        return_value = true;\n        return output;\n    }\n}\n\n\npublic class PkgBuildInfo : PackageInfo {\n    public override string name { get; private set; }\n    public override string? version { get; private set; default = null; }\n    public override VersionRelation? rel { get; private set; default = null; }\n    public string? choice_pkg { get; private set; }\n    public bool link { get; private set; }\n    public bool check { get; private set; }\n\n    public PkgBuildInfo (string name, string? version = null, VersionRelation? rel = null,\n                         string? choice_pkg = null, bool link = true, bool check = true) {\n        this.name = name;\n        if (version != null && rel != null) {\n            this.version = version;\n            this.rel = rel;\n        }\n        this.choice_pkg = choice_pkg;\n        if (check) {\n            this.check = package_exists (name);\n            if (this.check)\n                this.link = link;\n            else\n                this.link = false;\n        } else\n            this.check = this.link = false;\n    }\n\n    /**\n     * Compare two {@link PkgBuildInfo} instances by name.\n     *\n     * @param a First instance.\n     * @param b Second instance.\n     * @return `true` if a.name == b.name.\n     */\n    public static inline bool compare_name (PkgBuildInfo a, PkgBuildInfo b) {\n        return (a.name == b.name);\n    }\n\n    public new string to_string() {\n        var openb = true;\n        var closeb = false;\n        var strb = new StringBuilder ((this as PackageInfo).to_string());\n        str_opt (ref strb, ref openb, ref closeb, !check, \"nocheck\");\n        str_opt (ref strb, ref openb, ref closeb, !link, \"nolink\");\n        if (closeb)\n            strb.append (\"}\");\n        return strb.str;\n    }\n\n    private inline void str_opt (ref StringBuilder strb, ref bool openb,\n                                        ref bool closeb, bool cond, string opt) {\n        if (cond) {\n            if (openb) {\n                strb.append (\" {\");\n                openb = false;\n            } else\n                strb.append (\",\");\n            strb.append (opt);\n            closeb = true;\n        }\n    }\n}\n\n\npublic errordomain BuildError {\n    INITIALIZATION_FAILED,\n    CONFIGURATION_FAILED,\n    BUILD_FAILED,\n    CLEAN_FAILED,\n    TEST_FAILED,\n    LAUNCHING_FAILED\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/buildsystem/buildsystem_template.vala",
    "content": "/*\n * src/buildsystem/base.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gee;\nusing Xml;\n\npublic class BuildSystemTemplate : Object {\n    public Gdk.Pixbuf? icon = null;\n    public ArrayList<TemplateAuthor?> authors = new ArrayList<TemplateAuthor?>();\n    public string version = \"0\";\n    public string name;\n    public string path;\n    public string description;\n    public string? long_description = null;\n\n    public BuildSystem? system = null;\n    \n    \n\n    public static bool load_buildsystems (bool reload = false) {\n        if (buildsystems == null)\n            buildsystems = new Gee.TreeMap<string, BuildSystemTemplate>();\n        else if (reload)\n            buildsystems.clear();\n        else\n            return false;\n\n        string[] dirpaths;\n        if (Args.buildsystemsdirs == null)\n            dirpaths = new string[] {\n                                      Path.build_path (Path.DIR_SEPARATOR_S,\n                                                       Environment.get_user_data_dir(),\n                                                       \"valama\",\n                                                       \"buildsystems\"),\n                                      Path.build_path (Path.DIR_SEPARATOR_S,\n                                                       Config.PACKAGE_DATA_DIR,\n                                                       \"buildsystems\")\n                                    };\n        else\n            dirpaths = Args.buildsystemsdirs;\n\n        foreach (var dirpath in dirpaths) {\n            if (!FileUtils.test (dirpath, FileTest.IS_DIR))\n                continue;\n            debug_msg (\"Checking template directory: %s\\n\", dirpath);\n            try {\n                var enumerator = File.new_for_path (dirpath).enumerate_children (FileAttribute.STANDARD_NAME, 0);\n\n                FileInfo file_info;\n                while ((file_info = enumerator.next_file()) != null) {\n                    var infof = File.new_for_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                                    dirpath,\n                                                                    file_info.get_name(),\n                                                                    file_info.get_name() + \".info\"));\n                    if (!infof.query_exists())\n                        continue;\n                    var filename = infof.get_path();\n\n                    var new_buildsystem = new BuildSystemTemplate();\n                    new_buildsystem.name = file_info.get_name();\n                    //TODO: Check if patch exists.\n                    new_buildsystem.path = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                            dirpath,\n                                                            new_buildsystem.name,\n                                                            \"buildsystem\");\n                    foreach (var filetype in get_insensitive_cases({\"png\",\"jpg\",\"jpeg\",\"svg\"})) {\n                        var icon_path = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                         dirpath,\n                                                         new_buildsystem.name,\n                                                         new_buildsystem.name + \".\" + filetype);\n                        if (FileUtils.test (icon_path, FileTest.EXISTS)) {\n                            try {\n                                var pbuf = new Gdk.Pixbuf.from_file (icon_path);\n                                new_buildsystem.icon = pbuf.scale_simple (33, 33, Gdk.InterpType.BILINEAR);\n                                break;\n                            } catch (GLib.Error e) {\n                                warning_msg (_(\"Could not load build system image: %s\\n\"), e.message);\n                            }\n                        }\n                    }\n\n                    Xml.Doc* doc = Xml.Parser.parse_file (filename);\n                    Xml.Node* root_node;\n\n                    try {\n                        if (doc == null) {\n                            delete doc;\n                            throw new LoadingError.FILE_IS_GARBAGE (_(\"Cannot parse file.\"));\n                        }\n\n                        root_node = doc->get_root_element();\n                        if (root_node == null) {\n                            delete doc;\n                            throw new LoadingError.FILE_IS_EMPTY (_(\"File does not contain enough information\"));\n                        }\n\n                        if (root_node->has_prop (\"version\") != null)\n                            new_buildsystem.version = root_node->get_prop (\"version\");\n                        if (comp_version (new_buildsystem.version, BUILDSYSTEM_VERSION_MIN) < 0) {\n                            var errstr = _(\"Build system file '%s' too old: %s < %s\").printf (new_buildsystem.path,\n                                                                                              new_buildsystem.version,\n                                                                                              BUILDSYSTEM_VERSION_MIN);\n                            if (!Args.forceold) {\n                                delete doc;\n                                throw new LoadingError.FILE_IS_OLD (errstr);\n                            } else\n                                warning_msg (_(\"Ignore build system file loading error: %s\\n\"), errstr);\n                        }\n                    } catch (LoadingError e) {\n                        warning_msg (_(\"Could not load build system '%s': %s\\n\"), filename, e.message);\n                        continue;\n                    }\n\n                    for (Xml.Node* i = root_node->children; i != null; i = i->next) {\n                        if (i->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (i->name) {\n                            case \"author\":\n                                var author = new TemplateAuthor();\n                                for (Xml.Node* p = i->children; p != null; p = p->next) {\n                                    if (p->type != ElementType.ELEMENT_NODE)\n                                        continue;\n                                    switch (p->name) {\n                                        case \"name\":\n                                            author.name = p->get_content();\n                                            break;\n                                        case \"mail\":\n                                            author.mail = p->get_content();\n                                            break;\n                                        case \"date\":\n                                            author.date = p->get_content();\n                                            break;\n                                        case \"comment\":\n                                            author.comment = get_lang_content (p);\n                                            break;\n                                        default:\n                                            warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                            break;\n                                    }\n                                }\n                                new_buildsystem.authors.add (author);\n                                break;\n                            case \"name\":\n                                var tmpname = get_lang_content (i);\n                                if (tmpname == null) {\n                                    warning_msg (_(\"Build system has no name: line %hu\"), i->line);\n                                    new_buildsystem.name = \"\";\n                                } else\n                                    new_buildsystem.name = tmpname.down();\n                                break;\n                            case \"description\":\n                                new_buildsystem.description = get_lang_content (i);\n                                if (new_buildsystem.description == null) {\n                                    debug_msg (_(\"Build system has no description: line %hu\"), i->line);\n                                    new_buildsystem.description = \"\";\n                                }\n                                break;\n                            case \"long-description\":\n                                new_buildsystem.long_description = get_lang_content (i);\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), i->line, i->name);\n                                break;\n                        }\n                    }\n                    delete doc;\n                    buildsystems[new_buildsystem.name] = new_buildsystem;\n                }\n            } catch (GLib.Error e) {\n                errmsg (_(\"Could not process files in template directory: %s\\n\"), e.message);\n            }\n        }\n\n        return true;\n    }\n\n}\n\n/**\n * Current compatible version of build system file.\n */\npublic const string BUILDSYSTEM_VERSION_MIN = \"0.1\";\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/buildsystem/cmake.vala",
    "content": "/*\n * src/buildsystem/cmake.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\npublic class BuilderCMake : BuildSystem {\n    string projectinfo;\n    \n    public BuilderCMake (bool make_lib = false)\n    {\n        Object(library: make_lib);\n    }\n\n    public override string get_executable() {\n        return project.project_name.down();\n    }\n\n    public override inline string get_name() {\n        return \"CMake\";\n    }\n\n    public override inline string get_name_id() {\n        return \"cmake\";\n    }\n\n    public override bool check_buildsystem_file (string filename) {\n        return (filename.has_suffix (\".cmake\") ||\n                Path.get_basename (filename) == (\"CMakeLists.txt\"));\n    }\n\n    public override bool preparate() throws BuildError.INITIALIZATION_FAILED {\n        if (!base.preparate())\n            return false;\n        projectinfo = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       \"cmake\",\n                                       \"project.cmake\");\n        init_dir (Path.get_dirname (projectinfo));\n        return true;\n    }\n\n    public override bool initialize (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED {\n        exit_status = null;\n        initialized = false;\n        if (!preparate())\n            return false;\n        initialize_started();\n        \n        try {\n        var cml = File.new_for_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                      \"CMakeLists.txt\")).replace (null, false, FileCreateFlags.REPLACE_DESTINATION);\n        var cml_stream = new DataOutputStream (cml);\n        cml_stream.put_string (\"\"\"#\n    # CMakeLists.txt\n    # Copyright (C) 2012, 2013, Valama development team\n    #\n    # Valama is free software: you can redistribute it and/or modify it\n    # under the terms of the GNU General Public License as published by the\n    # Free Software Foundation, either version 3 of the License, or\n    # (at your option) any later version.\n    #\n    # Valama is distributed in the hope that it will be useful, but\n    # WITHOUT ANY WARRANTY; without even the implied warranty of\n    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    # See the GNU General Public License for more details.\n    #\n    # You should have received a copy of the GNU General Public License along\n    # with this program.  If not, see <http://www.gnu.org/licenses/>.\n    #\n\n    cmake_minimum_required(VERSION \"2.8.4\")\n\n    include(\"${CMAKE_SOURCE_DIR}/cmake/project.cmake\")\n    include(\"${CMAKE_SOURCE_DIR}/cmake/Common.cmake\")\n\n    project(\"${project_name}\" C)\n    string(TOLOWER \"${project_name}\" project_name_lower)\n\n    set(bindir \"bin\")\n    set(datarootdir \"share\")\n    set(libdir \"lib\")\n    set(includedir \"include\")\n    set(datadir \"${datarootdir}/${project_name_lower}\")\n    set(uidir \"${datadir}/ui\")\n    set(localedir \"${datarootdir}/locale\")\n    set(appdir \"${datarootdir}/applications\")\n    set(gsettingsdir \"${datarootdir}/glib-2.0/schemas\")\n    set(pixrootdir \"${datarootdir}/pixmaps\")\n    set(pixdir \"${pixrootdir}/${project_name_lower}\")\n    set(docdir \"${datadir}/doc\")\n    set(mandir \"${datarootdir}/man\")\n    set(mimedir \"${datarootdir}/mime/packages\")\n    if(CMAKE_INSTALL_PREFIX)\n      set(install_prefix \"${CMAKE_INSTALL_PREFIX}/\")\n    else()\n      set(install_prefix)\n    endif()\n\n    list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake/vala\")\n    list(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake\")\n\n    find_package(Vala \"0.20\" REQUIRED)\n    \"\"\");\n\n    if (library) {\n        cml_stream.put_string (\"\"\"set(pc_prefix ${CMAKE_INSTALL_PREFIX})\n    set(pc_exec_prefix \"\\${prefix}\")\n    set(pc_libdir \"\\${exec_prefix}/${libdir}\")\n    set(pc_includedir \"\\${prefix}/${includedir}\")\n    set(pc_datarootdir \"\\${prefix}/${datarootdir}\")\n    set(pc_vapidir \"\\${datarootdir}/vala-${VALA_SHORTVER}/vapi\")\n    set(pc_version \"${${project_name}_VERSION}\")\n\n    # Configure template files.\n    set(stripped_pkgs)\n    set(stripped_pkgs_pkgconfig)\n    foreach(pkgstr ${required_pkgs})\n      set(matchit)\n      string(REGEX MATCH \"([^{ \\t]*)[ \\t]*{([^}]+,|)[ \\t]*nocheck[ \\t]*(|,[^}]+)}[ \\t]*$\" matchit ${pkgstr})\n      string(REGEX REPLACE \"^([^{ \\t]*)[ \\t]*{[^{}]*}[ \\t]*$\" \"\\\\1\" pkg ${pkgstr})\n      if(NOT matchit)\n        list(APPEND stripped_pkgs_pkgconfig \"${pkg}\")\n      endif()\n\n      string(REGEX REPLACE \"^([^ \\t]+).*\" \"\\\\1\"  pkg_pkgconfig \"${pkgstr}\")\n      list(APPEND stripped_pkgs \"${pkg_pkgconfig}\")\n    endforeach()\n    base_list_to_delimited_string(pc_requirements\n      DELIM \" \"\n      BASE_LIST ${stripped_pkgs_pkgconfig}\n    )\n    configure_file(\"${project_name_lower}.pc.in\" \"${project_name_lower}.pc\" @ONLY)\n    \n    base_list_to_delimited_string(deps_requirements\n    DELIM \"\\n\"\n    BASE_LIST ${stripped_pkgs}\n   )\n   configure_file(\"${project_name_lower}.deps.in\" \"${project_name_lower}.deps\")\"\"\");\n   }\n\n    cml_stream.put_string (\"\"\"# Custom library version checks.\n    set(definitions)\n    set(vapidirs)\n    find_package(PkgConfig)\n    # config\n    list(REMOVE_ITEM required_pkgs \"config {nocheck,nolink}\")\n    # gobject-2.0\n    pkg_check_modules(GOBJECT2.0 REQUIRED \"gobject-2.0\")\n\n    set(default_vala_flags\n      \"--thread\"\n      \"--target-glib\" \"${GOBJECT2.0_VERSION}\"\n    )\n\n    include(ValaPkgs)\n    vala_pkgs(VALA_C\n      PACKAGES\n        ${required_pkgs}\n      DEFINITIONS\n        ${definitions}\n      OPTIONAL\n        ${optional_pkgs}\n      SRCFILES\n        ${srcfiles}\"\"\");\n    if (library) {\n        cml_stream.put_string (\"\"\"  LIBRARY\n        \"${project_name_lower}\"\n      GIRFILE\n        \"${project_name}-${${project_name}_VERSION}\"\"\"\");\n    }\n    cml_stream.put_string (\"\"\"  VAPIS\n        ${vapifiles}\n      OPTIONS\n        ${default_vala_flags}\n        ${vapidirs}\n    )\n    \"\"\");\n    string rflags = \"\";\n    if (project.flags != null) {\n\t\tvar flags = project.flags.split (\" \");\n\t\tfor (var i = 0; i < flags.length - 1; i++)\n\t\t\tif (flags[i] == \"-X\")\n\t\t\t\trflags += \" \" + flags[i + 1];\n\t}\n    if (library) {\n        cml_stream.put_string (\"\"\"add_library(\"${project_name_lower}\" SHARED ${VALA_C})\n    set_target_properties(\"${project_name_lower}\" PROPERTIES\n        VERSION \"${${project_name}_VERSION}\"\n        SOVERSION \"${soversion}\"\n    )\n    target_link_libraries(\"${project_name_lower}\" ${PROJECT_LDFLAGS} %s)\n    add_definitions(${PROJECT_C_FLAGS})\"\"\".printf (rflags));\n    }\n    cml_stream.put_string (\"\"\"# Set common C-macros.\n    add_definitions(-DPACKAGE_NAME=\"${project_name}\")\n    add_definitions(-DPACKAGE_VERSION=\"${${project_name}_VERSION}\")\n    if(project_root)\n      add_definitions(-DGETTEXT_PACKAGE=\"${project_root}\")\n    else()\n      add_definitions(-DGETTEXT_PACKAGE=\"${project_name_lower}\")\n    endif()\n    add_definitions(-DPACKAGE_DATA_DIR=\"${install_prefix}${datadir}\")\n    add_definitions(-DPACKAGE_UI_DIR=\"${install_prefix}${uidir}\")\n    add_definitions(-DLOCALE_DIR=\"${install_prefix}${localedir}\")\n    add_definitions(-DPIXMAP_DIR=\"${install_prefix}${pixdir}\")\n    add_definitions(-DVALA_VERSION=\"${VALA_SHORTVER}\")\n    \"\"\");\n    if (!library) {\n        cml_stream.put_string (\"\"\"add_executable(\"${project_name_lower}\" ${VALA_C})\n    target_link_libraries(\"${project_name_lower}\"\n      ${PROJECT_LDFLAGS}\n      %s\n    )\n    add_definitions(\n      ${PROJECT_C_FLAGS}\n    )\n    install(TARGETS ${project_name_lower} DESTINATION \"${bindir}\")\"\"\".printf (rflags));\n    } else {\n        cml_stream.put_string (\"\"\"install(TARGETS \"${project_name_lower}\" DESTINATION \"${libdir}\")\n    install(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.pc\" DESTINATION \"lib/pkgconfig\")\n    install(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.h\" DESTINATION \"${includedir}\")\n    set(vapi_files \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.deps\" \"${CMAKE_CURRENT_BINARY_DIR}/${project_name_lower}.vapi\")\n    install(FILES ${vapi_files} DESTINATION \"${VALA_VAPIDIR}\")\n    install(FILES \"${CMAKE_CURRENT_BINARY_DIR}/${project_name}-${${project_name}_VERSION}.gir\" DESTINATION \"${datarootdir}/gir-1.0\")\"\"\");\n    }\n\n    cml_stream.put_string (\"\"\"# Install user interface files if used and copy them to build directory.\n    set(uifiles_build)\n    foreach(uifile ${uifiles})\n      add_custom_command(\n        OUTPUT\n          \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n        COMMAND\n          \"${CMAKE_COMMAND}\" -E copy_if_different \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\" \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\"\n        DEPENDS\n          \"${CMAKE_CURRENT_SOURCE_DIR}/${uifile}\"\n        COMMENT \"\"\n      )\n      list(APPEND uifiles_build \"${CMAKE_CURRENT_BINARY_DIR}/${uifile}\")\n      install(FILES ${uifile} DESTINATION \"${uidir}\")\n    endforeach()\n    add_custom_target(\"ui_copy_${project_name_lower}\" DEPENDS ${uifiles_build})\n    add_dependencies(\"${project_name_lower}\" \"ui_copy_${project_name_lower}\")\"\"\");\n\n    cml_stream.close();\n    \nif (library)\n            {\n                var str_deps = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       project.project_name+\".deps.in\");\n                var file_stream = File.new_for_path (str_deps).replace (null, false, FileCreateFlags.REPLACE_DESTINATION);\n                var data_stream = new DataOutputStream (file_stream);\n                data_stream.put_string (\"@deps_requirements@\\n\");\n                data_stream.close();\n                \n                var str_pc = Path.build_path (Path.DIR_SEPARATOR_S,\n                                       project.project_path,\n                                       project.project_name+\".pc.in\");\n                file_stream = File.new_for_path (str_pc).replace (null, false, FileCreateFlags.REPLACE_DESTINATION);\n                data_stream = new DataOutputStream (file_stream);\n                data_stream.put_string (\"\"\"prefix=@pc_prefix@\nexec_prefix=@pc_exec_prefix@\nlibdir=@pc_libdir@\nincludedir=@pc_includedir@\ndatarootdir=@pc_datarootdir@\nvapidir=@pc_vapidir@\n\nName: %s\nDescription: %s\nVersion: @pc_version@\nRequires: @pc_requirements@\nLibs: -L${libdir} -l%s\nCflags: -I${includedir}/\"\"\".printf (project.project_name, project.project_name, project.project_name));\n                data_stream.close();\n            }\n           \n            \n    \n        }catch (GLib.IOError e) {\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Could not read file: %s\\n\"), e.message);\n        } catch (GLib.Error e) {\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Could not open file: %s\\n\"), e.message);\n        }\n\n        var strb_pkgs = new StringBuilder (\"set(required_pkgs\\n\");\n        foreach (var pkgmap in get_pkgmaps().values) {\n            if (pkgmap.choice_pkg != null && !pkgmap.check)\n                strb_pkgs.append (@\"  \\\"$((pkgmap as PackageInfo))\\\"\\n\");\n            else\n                strb_pkgs.append (@\"  \\\"$pkgmap\\\"\\n\");\n        }\n        strb_pkgs.append (\")\\n\");\n\n        var strb_files = new StringBuilder (\"set(srcfiles\\n\");\n        var strb_vapis = new StringBuilder (\"set(vapifiles\\n\");\n        foreach (var filepath in project.files) {\n            var fname = project.get_relative_path (filepath);\n            if (filepath.has_suffix (\".vapi\"))\n                strb_vapis.append (@\"  \\\"$fname\\\"\\n\");\n            else\n                strb_files.append (@\"  \\\"$fname\\\"\\n\");\n        }\n        strb_files.append (\")\\n\");\n        strb_vapis.append (\")\\n\");\n\n        var strb_uis = new StringBuilder (\"set(uifiles\\n\");\n        foreach (var filepath in project.u_files)\n            strb_uis.append (@\"  \\\"$(project.get_relative_path (filepath))\\\"\\n\");\n        strb_uis.append (\")\\n\");\n\n        try {\n            var file_stream = File.new_for_path (projectinfo).replace (\n                                                    null,\n                                                    false,\n                                                    FileCreateFlags.REPLACE_DESTINATION);\n            var data_stream = new DataOutputStream (file_stream);\n            /*\n             * Don't translate this part to make collaboration with VCS and\n             * multiple locales easier.\n             */\n            data_stream.put_string (\"# This file was auto generated by Valama %s. Do not modify it.\\n\".printf (Config.PACKAGE_VERSION));\n            //TODO: Check if file needs changes and set date accordingly.\n            // var time = new DateTime.now_local();\n            // data_stream.put_string (\"# Last change: %s\\n\".printf (time.format (\"%F %T %z\")));\n            data_stream.put_string (@\"set(project_name \\\"$(project.project_name)\\\")\\n\");\n            data_stream.put_string (@\"set($(project.project_name)_VERSION \\\"$(project.version_major).$(project.version_minor).$(project.version_patch)\\\")\\n\");\n            if (library) {\n\t\t\t    data_stream.put_string (\"set(soversion \\\"%d\\\")\\n\".printf (project.version_major));\n\t\t\t}\n            data_stream.put_string (strb_pkgs.str);\n            data_stream.put_string (strb_files.str);\n            data_stream.put_string (strb_vapis.str);\n            data_stream.put_string (strb_uis.str);\n\n            data_stream.close();\n        } catch (GLib.IOError e) {\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Could not read file: %s\\n\"), e.message);\n        } catch (GLib.Error e) {\n            throw new BuildError.INITIALIZATION_FAILED (_(\"Could not open file: %s\\n\"), e.message);\n        }\n\n        exit_status = 0;\n        initialized = true;\n        initialize_finished();\n        return true;\n    }\n\n    public override bool configure (out int? exit_status = null) throws BuildError.INITIALIZATION_FAILED,\n                                            BuildError.CONFIGURATION_FAILED {\n        exit_status = null;\n        if (!initialized && !initialize (out exit_status))\n            return false;\n\n        exit_status = null;\n        configured = false;\n        configure_started();\n\n        var cmdline = new string[] {\"cmake\", \"..\"};\n\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            configure_finished();\n            throw new BuildError.CONFIGURATION_FAILED (_(\"configure command failed\"));\n        }\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        configured = true;\n        configure_finished();\n        return exit_status == 0;\n    }\n\n    public override bool build (out int? exit_status = null) throws BuildError.INITIALIZATION_FAILED,\n                                        BuildError.CONFIGURATION_FAILED,\n                                        BuildError.BUILD_FAILED {\n        exit_status = null;\n        if (!configured && !configure (out exit_status))\n            return false;\n\n        exit_status = null;\n        built = false;\n        build_started();\n        var cmdline = new string[] {\"make\", @\"-j$(BuildSystem.threads)\"};\n\n        Pid? pid;\n        int? pstdout, pstderr;\n        if (!call_cmd (cmdline, out pid, true, out pstdout, out pstderr)) {\n            build_finished();\n            throw new BuildError.CONFIGURATION_FAILED (_(\"build command failed\"));\n        }\n\n        var chn = new IOChannel.unix_new (pstdout);\n        chn.set_buffer_size (1);\n        chn.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n            bool ret;\n            var output = channel_output_read_line (source, condition, out ret);\n            Regex r = /^\\[(?P<percent>.*)\\%\\].*$/;\n            MatchInfo info;\n            if (r.match (output, 0, out info)) {\n                var percent_string = info.fetch_named (\"percent\");\n                build_progress (int.parse (percent_string));\n            }\n            build_output (output);\n            return ret;\n        });\n\n        var chnerr = new IOChannel.unix_new (pstderr);\n        chnerr.set_buffer_size (1);\n        chnerr.add_watch (IOCondition.IN | IOCondition.HUP, (source, condition) => {\n            bool ret;\n            build_output (channel_output_read_line (source, condition, out ret));\n            return ret;\n        });\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        built = true;\n        build_finished();\n        return exit_status == 0;\n    }\n\n    public override bool check_existance() {\n        var makefile = File.new_for_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                           buildpath,\n                                                           \"Makefile\"));\n        return makefile.query_exists();\n    }\n\n    public override bool clean (out int? exit_status = null)\n                                        throws BuildError.CLEAN_FAILED {\n        exit_status = null;\n        // cleaned = false;\n        clean_started();\n\n        if (!check_existance()) {\n            build_output (_(\"No data to clean.\\n\"));\n            clean_finished();\n            return true;\n        }\n\n        var cmdline = new string[] {\"make\", \"clean\"};\n\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            clean_finished();\n            throw new BuildError.CLEAN_FAILED (_(\"clean command failed\"));\n        }\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        // cleaned = true;\n        clean_finished();\n        return exit_status == 0;\n    }\n\n    public override bool distclean (out int? exit_status = null)\n                                            throws BuildError.CLEAN_FAILED {\n        exit_status = null;\n        // distcleaned = false;\n        distclean_started();\n        project.enable_defines_all();\n\n        if (!FileUtils.test (buildpath, FileTest.EXISTS)) {\n            build_output (_(\"No data to clean.\\n\"));\n            clean_finished();\n            return true;\n        }\n\n        try {\n            remove_recursively (buildpath, true, false);\n            exit_status = 0;\n        } catch (GLib.Error e) {\n            exit_status = 1;\n            var msg = _(\"distclean command failed: %s\").printf (e.message);\n            build_output (msg + \"\\n\");\n            throw new BuildError.CLEAN_FAILED (msg);\n        }\n\n        // distcleaned = true;\n        distclean_finished();\n        return exit_status == 0;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/buildsystem/plain.vala",
    "content": "/*\n * src/buildsystem/plain.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\npublic class BuilderPlain : BuildSystem {\n    private string[]? cmdline = null;\n\n    public BuilderPlain (bool make_lib = false) {\n        Object (library: make_lib);\n    }\n\n    public override string get_executable() {\n        return project.project_name.casefold();\n    }\n\n    public override inline string get_name() {\n        return \"Plain build system\";\n    }\n\n    public override inline string get_name_id() {\n        return \"valama\";\n    }\n\n    public override bool check_buildsystem_file (string filename) {\n        return false;\n    }\n\n    public override bool initialize (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED {\n        exit_status = null;\n        initialized = false;\n        if (!preparate())\n            return false;\n        initialize_started();\n        cmdline = null;\n\n        string[] valacargs = new string[] {\"valac\"};\n        string? target_glib_version;\n        if (!package_exists (\"glib-2.0\", out target_glib_version)) {\n            //TRANSLATORS: E.g.: No `glib-2.0' package found.\n            build_output (_(\"No '%s' package found.\\n\").printf (\"glib-2.0\"));\n            return false;\n        }\n        valacargs += @\"--target-glib=$(target_glib_version)\";\n        valacargs += \"--thread\";\n        valacargs += @\"--output=$(get_executable())\";\n\n        foreach (var pkg in project.packages.values) {\n            build_output (_(\"Add package: %s\\n\").printf (pkg.name));\n            if (pkg.custom_vapi == null)\n                valacargs += @\"--pkg=$(pkg.name)\";\n            else {\n                valacargs += project.get_absolute_path (pkg.custom_vapi);\n                string? pkgflags;\n                if (package_flags (pkg.name, out pkgflags))\n                    try {\n                        string[] pkgflags_args;\n                        Shell.parse_argv (pkgflags, out pkgflags_args);\n                        foreach (var ccpart in pkgflags_args)\n                            valacargs += @\"--Xcc=$ccpart\";\n                    } catch (GLib.ShellError e) {\n                        warning_msg (_(\"Could not parse package flags '%s': %s\\n\"),\n                                     pkgflags, e.message);\n                    }\n            }\n        }\n\n        if (project.idemode != IdeModes.DEBUG) {\n            foreach (var file in project.guanako_project.get_source_files())\n                valacargs += file.filename;\n        } else {\n            var mainblock = false;\n            foreach (var src_file_path in project.files){\n                if (src_file_path.has_suffix (\".vapi\")) {\n                    valacargs += src_file_path;\n                    continue;\n                }\n\n                string content;\n                try {\n                    FileUtils.get_contents (src_file_path, out content);\n                } catch (GLib.FileError e) {\n                    throw new BuildError.INITIALIZATION_FAILED (_(\"Could not read file content of '%s': %s\\n\"),\n                                                                src_file_path, e.message);\n                }\n                var srcfile = project.guanako_project.get_source_file_by_name (src_file_path);\n                srcfile.content = content; //TODO: Find out why SourceFile.content is empty at the beginning (??)\n                var fname = project.get_relative_path (src_file_path);\n                var tmppath = Path.build_path (Path.DIR_SEPARATOR_S,\n                                               buildpath,\n                                               fname.replace (Path.DIR_SEPARATOR_S, \"=+\"));\n                var tmpfile = File.new_for_path (tmppath);\n\n                try {\n                    build_output (_(\"Prepare file for FrankenStein: %s\\n\").printf (fname));\n                    var dos = new DataOutputStream (tmpfile.replace (null,\n                                                                     false,\n                                                                     FileCreateFlags.REPLACE_DESTINATION));\n                    dos.put_string (frankenstein.frankensteinify_sourcefile (srcfile));\n                    if (!mainblock) {\n                        dos.put_string (frankenstein.frankenstein_mainblock);\n                        mainblock = true;\n                    }\n                } catch (GLib.IOError e) {\n                    throw new BuildError.INITIALIZATION_FAILED (_(\"Could not update file: %s\\n\"),\n                                                                e.message);\n                } catch (GLib.Error e) {\n                    throw new BuildError.INITIALIZATION_FAILED (_(\"Could not open file writable: %s\\n\"),\n                                                                e.message);\n                }\n                valacargs += tmppath;\n            }\n        }\n\n        foreach (var define in project.defines)\n            valacargs += @\"--define=$define\";\n\n        cmdline = valacargs;\n\n        exit_status = 0;\n        initialized = true;\n        initialize_finished();\n        return true;\n    }\n\n    public override bool build (out int? exit_status = null)\n                                        throws BuildError.INITIALIZATION_FAILED,\n                                               BuildError.CONFIGURATION_FAILED,\n                                               BuildError.BUILD_FAILED {\n        exit_status = null;\n        if (!configured && !configure (out exit_status))\n            return false;\n\n        exit_status = null;\n        built = false;\n        build_started();\n\n        Pid? pid;\n        if (!call_cmd (cmdline, out pid)) {\n            build_finished();\n            throw new BuildError.BUILD_FAILED (\"build command failed\");\n        }\n\n        int? exit = null;\n        ChildWatch.add (pid, (intpid, status) => {\n            exit = get_exit (status);\n            Process.close_pid (intpid);\n            builder_loop.quit();\n        });\n\n        builder_loop.run();\n        exit_status = exit;\n        built = true;\n        build_finished();\n        return exit_status == 0;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/common/args.vala",
    "content": "/*\n * src/common/args.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\nnamespace Args {\n    public bool version = false;\n    public string? syntaxfile = null;\n    [CCode (array_length = false, array_null_terminated = true)]\n    public string[]? templatesdirs = null;\n    [CCode (array_length = false, array_null_terminated = true)]\n    public string[]? buildsystemsdirs = null;\n    public int debuglevel = 0;\n    public bool forceold = false;\n    public string? layoutfile = null;\n    public bool reset_layout = false;\n    [CCode (array_length = false, array_null_terminated = true)]\n    public string[]? projectfiles = null;\n\n    private const OptionEntry[] options = {\n        {\"version\", 'v', 0, OptionArg.NONE, ref version, N_(\"Display version number.\"), null},\n        {\"syntax\", 0, 0, OptionArg.FILENAME, ref syntaxfile, N_(\"Guanako syntax file.\"), N_(\"FILE\")},\n        {\"templates\", 0, 0, OptionArg.FILENAME_ARRAY, ref templatesdirs, N_(\"Templates directory.\"),\n        // TRANSLATORS: Uppercase for variables in command line options.\n                                                            N_(\"DIRECTORY\")},\n        {\"buildsystems\", 0, 0, OptionArg.FILENAME_ARRAY, ref buildsystemsdirs, N_(\"Build systems directory.\"), N_(\"DIRECTORY\")},\n        {\"debug\", 'd', OptionFlags.OPTIONAL_ARG, OptionArg.CALLBACK, (void*) debuglevel_parse, N_(\"Output debug information.\"), N_(\"[DEBUGLEVEL]\")},\n        {\"force-old\", 0, 0, OptionArg.NONE, ref forceold, N_(\"Force loading of possibly incompatible template or project files.\"), null},\n        {\"layout\", 0, 0, OptionArg.FILENAME, ref layoutfile, N_(\"Path to layout file.\"), N_(\"FILE\")},\n        {\"reset-layout\", 0, 0, OptionArg.NONE, ref reset_layout, N_(\"Load default layout.\"), null},\n        {\"\", 0, 0, OptionArg.FILENAME_ARRAY, ref projectfiles, N_(\"Load project from file.\"), N_(\"[FILE...]\")},\n        {null}\n    };\n\n    public int parse (string[] args) {\n        int ret = 0;\n\n        var opt_context = new OptionContext (_(\"- Valama: next generation Vala IDE\"));\n        opt_context.set_help_enabled (true);\n        opt_context.add_main_entries (options, null);\n        try {\n            opt_context.parse (ref args);\n        } catch (OptionError e) {\n            errmsg (_(\"Error: %s\\n\"), e.message);\n            errmsg (_(\"Run '%s --help' to see a full list of available command line options.\\n\"), args[0]);\n            return 1;\n        }\n\n        if (version) {\n            msg (\"%s: %s\\n\", Config.PACKAGE_NAME, Config.PACKAGE_VERSION);\n            ret = -1;\n        }\n\n        return ret;\n    }\n\n    internal bool debuglevel_parse (string name, string? val, ref OptionError error) throws OptionError {\n        if (val == null) {\n            debuglevel = 1;\n            return true;\n        }\n        var re = /^[+]?[0-9]+$/;\n        if (!re.match (val, 0, null))\n            throw new OptionError.BAD_VALUE (_(\"'%s' not a positive number\"), val);\n        debuglevel = int.parse (val);\n        return true;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/common/common.vala",
    "content": "/*\n * src/common/common.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\n/**\n * Flags to control FileTransfer class.\n */\n[Flags]\npublic enum CopyRecursiveFlags {\n    /**\n     * Do not count and do not skip or warn on existing files.\n     */\n    NONE,\n    /**\n     * Skip if file already exists and count before transfer.\n     */\n    SKIP_EXISTENT,\n    /**\n     * Warn if file already exists and count before transfer.\n     */\n    WARN_OVERWRITE,\n    /**\n     * Don't count.\n     */\n    NO_COUNT\n}\n\n/**\n * Transfer class to easily copy or move files or file trees.\n * The byte_count_changed and num_count_changed signals provides an comfortable\n * interface to connect a progress bar.\n *\n * {@link CopyRecursiveFlags} can be used to control some features:\n *\n *   * skip if files already exists\n *   * warn if files already exists\n *\n * Both options can be used with or without a run before to calculate size of\n * transfer (and signal interface with percentage / counts).\n *\n * If size is counted a {@link GLib.IOError.NO_SPACE} Error is raised if not\n * enough space is available.\n *\n * Remember to use special {@link GLib.FileCopyFlags} or\n * {@link GLib.FileQueryInfoFlags} or {@link GLib.Cancellable}.\n *\n *\n * = Example =\n *\n * {{{\n * using GLib;\n *\n * public static int main (string[] args) {\n *     Gtk.init (ref args);\n *     window_main = new Window();\n *     window_main.title = \"Test progress bar\";\n *     window_main.window_position = WindowPosition.CENTER;;\n *     window_main.destroy.connect (main_quit);\n *\n *     var bar = new ProgressBar();\n *     window_main.add (bar);\n *\n *     bar.set_text (\"Test progress\");\n *     bar.set_show_text (true);\n *\n *     window_main.show_all();\n *\n *     var ft = new FileTransfer (\"/path/to/directory1\",\n *                 \"/path/to/directory2\",\n *                 CopyRecursiveFlags.WARN_OVERWRITE);\n *\n *     ft.byte_count_changed.connect (bar.set_fraction);\n *     ft.warn_overwrite.connect ((from, to) => {\n *         stdout.printf (\"We have some time to relax.\\n\");\n *         Thread.usleep (100000);\n *         return false;\n *     });\n *     ft.num_count_changed.connect ((cur, tot) => {\n *         bar.set_text (@\"$cur/$tot\");\n *     });\n *\n *     new Thread<void*>.try (\"Copy file\", (ThreadFunc<void*>) ft.move);\n *     Gtk.main();\n *\n *     return 0;\n * }\n * }}}\n *\n * {{{\n * valac --pkg glib-2.0 --pkg gtk+-3.0 --target-glib=2.32 FileTransferTest.vala\n * }}}\n *\n *\n *\n */\npublic class FileTransfer : Object {\n    /**\n     * File object to transfer (recursively).\n     */\n    public File f_from { get; private set; }\n    /**\n     * File object to transfer to (recursively).\n     */\n    public File f_to { get; private set; }\n    /**\n     * Flag for {@link CopyRecursiveFlags}.\n     */\n    public CopyRecursiveFlags rec_flag { get; set; }\n    /**\n     * Flag for {@link GLib.File.move} or {@link GLib.File.copy}.\n     */\n    public FileCopyFlags copy_flag { get; set; }\n    /**\n     * Flag for {@link GLib.FileInfo}.\n     */\n    public FileQueryInfoFlags query_flag  { get; set; }\n    /**\n     * Flag for {@link GLib.Cancellable}.\n     */\n    public Cancellable? cancellable { get; set; }\n    /**\n     * Enable to create base destination directory.\n     */\n    public bool create_dest { get; set; default = true; }\n    /**\n     * Flag for {@link RecursiveAction} to indicate which action to perform\n     * on iterating over files.\n     */\n    private RecursiveAction action;\n    /**\n     * Size of transfers currently done.\n     */\n    private double current_size = 0;\n    /**\n     * Total size of transfers (also existing files).\n     */\n    private double total_size = 0;\n    /**\n     * Size of transfers to do.\n     *\n     * {@link total_size} without existing files.\n     */\n    private double size_to_trans = 0;\n    /**\n     * Number of total transfers (to do).\n     */\n    private int count_total = 0;\n    /**\n     * Free space available on filesystem to transfer.\n     */\n    private uint64 fs_free;\n    /**\n     * Number of transfers done.\n     */\n    private int count_current = 0;\n    /**\n     * Flag to indicate if counter is on on copy/move step.\n     *\n     * This is used to avoid tests for all {@link CopyRecursiveFlags}\n     * combinations  count vs. no-count.\n     */\n    private bool counter_on = false;\n    /**\n     * Flag to indicate if recursive or non-recursive operation is to do.\n     */\n    private bool is_file = false;\n    /**\n     * Flag to indicate that operation performs on same filesystem.\n     */\n    private bool same_fs = false;\n\n    /**\n     * Flag to indicate which file transfer action to do.\n     */\n    private enum RecursiveAction {\n        COPY,\n        MOVE,\n        COUNT\n    }\n\n    /**\n     * Setup all flags.\n     *\n     * @param from Path to do action from (e.g. filename to copy).\n     * @param to Path to do action to (e.g. where to copy file).\n     * @param rec_flag Flag to control action to do.\n     * @param copy_flag Copy and move behavior (e.g. to overwrite file or make a backup).\n     * @param query_flag Follow symlinks or not.\n     * @param cancellable Is cancellable.\n     * @throws GLib.Error Throw on file query errors.\n     * @throws GLib.IOError Throw on failed I/O operations.\n     */\n    public FileTransfer (string from, string to,\n                              CopyRecursiveFlags rec_flag = CopyRecursiveFlags.NONE,\n                              FileCopyFlags copy_flag = FileCopyFlags.NONE,\n                              FileQueryInfoFlags query_flag = FileQueryInfoFlags.NONE,\n                              Cancellable? cancellable = null) throws GLib.Error, GLib.IOError {\n        f_from = File.new_for_path (from);\n        f_to = File.new_for_path (to);\n        this.rec_flag = rec_flag;\n        this.copy_flag = copy_flag;\n        this.query_flag = query_flag;\n        this.cancellable = cancellable;\n\n        if (!f_from.query_exists())\n            throw new IOError.NOT_FOUND (_(\"No such file.\"));\n\n        var filetype = f_from.query_file_type (query_flag, cancellable);\n        var info = f_from.query_info (\"id::*\", query_flag, cancellable);\n\n        var f_to_tmp = f_to;\n        while (!f_to_tmp.query_exists()) {\n            f_to_tmp = f_to_tmp.get_parent();\n            if (f_to_tmp == null)  // this should never happen so no further checks below\n                break;\n        }\n        var info_to = f_to_tmp.query_info (\"*\", query_flag, cancellable);\n\n        if (info.get_attribute_as_string (FileAttribute.ID_FILESYSTEM) ==\n            info_to.get_attribute_as_string (FileAttribute.ID_FILESYSTEM))\n            same_fs = true;\n        else {\n            var fsinfo_to = f_to_tmp.query_filesystem_info (FileAttribute.FILESYSTEM_FREE, cancellable);\n            fs_free = fsinfo_to.get_attribute_uint64 (FileAttribute.FILESYSTEM_FREE);\n        }\n\n        /* Set the no-recursion flag accordingly. */\n        if (filetype == FileType.REGULAR ||\n                (filetype == FileType.SYMBOLIC_LINK &&\n                query_flag == FileQueryInfoFlags.NOFOLLOW_SYMLINKS)) {\n            is_file = true;\n            /*\n             * If destination object already exists and is a directory, make\n             * f_to to a child of it.\n             */\n            if (f_to.query_exists()) {\n                if (info_to.get_file_type() == FileType.DIRECTORY)\n                    f_to = f_to.resolve_relative_path (f_from.get_basename());\n            }\n        }\n    }\n\n    /**\n     * Emit percentage of file transfer.\n     *\n     * @param percent_done Percentage of file transfer.\n     */\n    public signal void byte_count_changed (double percent_done);\n\n    /**\n     * Emit on change number of current transferred files (and total amount).\n     *\n     * @param cur Current transferred files.\n     * @param tot Total of files to transfer.\n     */\n    public signal void num_count_changed (int cur, int tot);\n\n    /**\n     * Signal with both file names to indicate if file should be overwritten.\n     * Return `true` to overwrite file. To skip return `false`.\n     *\n     * Emit on change.\n     *\n     * @param from_name Path of file where action comes from.\n     * @param to_name Path of file where action should go to.\n     */\n    public signal bool warn_overwrite (string from_name, string to_name);\n\n    /**\n     * Calculate total size of transfers.\n     *\n     * @throws GLib.Error Throw on file query errors.\n     * @throws GLib.IOError Throw on failed I/O operations.\n     */\n    //TODO: Provide public interface to provide information without doing\n    //      anything?\n    private void calc_size() throws GLib.Error, GLib.IOError {\n        if (CopyRecursiveFlags.SKIP_EXISTENT == rec_flag ||\n                CopyRecursiveFlags.WARN_OVERWRITE == rec_flag) {\n            counter_on = true;  // use this boolean to name counter flags only here\n            action = RecursiveAction.COUNT;\n            if (is_file) {\n                total_size = (double) f_from.query_info (\"standard::*\", query_flag, cancellable).get_size();\n                count_total = 1;\n                transfer_file (f_from, f_to);\n            } else\n                do_recursively (f_from, f_to);\n            current_size = total_size - size_to_trans;\n            num_count_changed (count_current, count_total);\n        }\n        /* Check if enough free space is available on filesystem. */\n        if (!same_fs && fs_free <= size_to_trans)\n            throw new GLib.IOError.NO_SPACE (_(\"Not enough space available: %lld < %lld\"),\n                                             fs_free, (uint64) size_to_trans);\n    }\n\n    /**\n     * Call the transfer methods properly, calculate before transfer and\n     * create destination directory if needed.\n     *\n     * @param action Flag to control action to do.\n     *\n     * @throws GLib.Error Throw on file query errors.\n     * @throws GLib.IOError Throw on failed I/O operations.\n     */\n    private void transfer (RecursiveAction action) throws GLib.Error, GLib.IOError {\n        calc_size();\n        this.action = action;\n        if (is_file || (same_fs && action == RecursiveAction.MOVE)) {\n            var f_to_parent = f_to.get_parent();\n            if (f_to_parent != null && !f_to_parent.query_exists())\n                f_to_parent.make_directory_with_parents();\n            transfer_file (f_from, f_to, total_size);\n        } else {\n            if (!f_to.query_exists())\n                f_to.make_directory_with_parents();\n            do_recursively (f_from, f_to);\n            if (this.action == RecursiveAction.MOVE)\n                f_from.delete();\n        }\n    }\n\n    /**\n     * Wrapper to call recursive copy method (and avoid file names here).\n     *\n     * @throws GLib.Error Throw on file query errors.\n     * @throws GLib.IOError Throw on failed I/O operations.\n     */\n    public void copy() throws GLib.Error, GLib.IOError {\n        transfer (RecursiveAction.COPY);\n        debug_msg (_(\"Copying finished.\\n\"));\n    }\n\n    /**\n     * Wrapper to call recursive move method (and avoid file names here).\n     *\n     * @throws GLib.Error Throw on file query errors.\n     * @throws GLib.IOError Throw on failed I/O operations.\n     */\n    public void move() throws GLib.Error, GLib.IOError {\n        transfer (RecursiveAction.MOVE);\n        debug_msg (_(\"Moving finished.\\n\"));\n    }\n\n    /**\n     * Do all the recursive work and take care of all different flag types.\n     *\n     * @param from {@link GLib.File} to do action from.\n     * @param dest {@link GLib.File} to do action to.\n     * @throws GLib.Error Throw on file query errors.\n     * @throws GLib.IOError Throw on failed I/O operations.\n     */\n    private void do_recursively (File from, File dest) throws Error, IOError {\n        FileEnumerator enumerator = from.enumerate_children (\"standard::*\",\n                                                             query_flag,\n                                                             cancellable);\n        FileInfo info = null;\n        double size = 0;\n        while (cancellable.is_cancelled() == false &&\n               ((info = enumerator.next_file (cancellable)) != null)) {\n\n            if (counter_on)\n                size = (double) info.get_size();\n\n            if (action == RecursiveAction.COUNT)\n                total_size += size;\n\n            /* Current processed file object is a directory. */\n            if (info.get_file_type() == FileType.DIRECTORY) {\n                var new_from = from.resolve_relative_path (info.get_name());\n                var new_dest = dest.resolve_relative_path (info.get_name());\n\n                /* Create directory if it does not exist already. */\n                if (action == RecursiveAction.COUNT)\n                    size_to_trans += size;\n                else if (!new_dest.query_exists())\n                    new_dest.make_directory (cancellable);\n                /* Only count if needed. */\n                //TODO: Is this faster when we just count or when we check\n                //      the flags?\n                if (counter_on) {\n                    current_size += size;\n                    byte_count_changed (current_size / total_size);\n                }\n\n                do_recursively (new_from, new_dest);\n\n                /* Clean directory on move. */\n                if (action == RecursiveAction.MOVE)\n                    new_from.delete (cancellable);\n\n            /* Current processed file object is a file. */\n            } else {\n                if (action == RecursiveAction.COUNT)\n                    ++count_total;\n\n                var new_from = from.resolve_relative_path (info.get_name());\n                var new_dest = dest.resolve_relative_path (info.get_name());\n\n                transfer_file (new_from, new_dest, size);\n            }\n        }\n\n        if (cancellable.is_cancelled())\n            throw new IOError.CANCELLED (_(\"File copying cancelled.\"));\n    }\n\n    /**\n     * Do the file transfer of a single file.\n     *\n     * @param from {@link GLib.File} to do action from.\n     * @param dest {@link GLib.File} to do action to.\n     * @param size Total size of files.\n     * @throws GLib.Error Throw on file query errors.\n     */\n    private void transfer_file (File from, File dest, double size = 0) throws GLib.Error {\n        /*\n        * Cancel here if file should not be overwritten (either skip\n        * or let user decide manually).\n        */\n        if (dest.query_exists() && action != RecursiveAction.COUNT) {\n            /* SKIP_EXISTENT */\n            if (rec_flag == CopyRecursiveFlags.SKIP_EXISTENT ||\n                    rec_flag == (CopyRecursiveFlags.SKIP_EXISTENT | CopyRecursiveFlags.NO_COUNT)) {\n                if (action != RecursiveAction.COUNT)\n                    debug_msg (_(\"Skip %s\\n\"), dest.get_path());\n                if (counter_on) {\n                    current_size += size;\n                    byte_count_changed (current_size / total_size);\n                    ++count_current;\n                    num_count_changed (count_current, count_total);\n                }\n                return;\n            /* WARN_OVERWRITE */\n            } else if ((rec_flag == CopyRecursiveFlags.WARN_OVERWRITE ||\n                    rec_flag == (CopyRecursiveFlags.WARN_OVERWRITE | CopyRecursiveFlags.NO_COUNT)) &&\n                    !warn_overwrite (from.get_path(), dest.get_path())) {\n                debug_msg (_(\"Skip overwrite from '%s' to '%s'.\\n\"), from.get_path(),\n                                                                     dest.get_path());\n                if (counter_on) {\n                    current_size += size;\n                    byte_count_changed (current_size / total_size);\n                    ++count_current;\n                    num_count_changed (count_current, count_total);\n                }\n                return;\n            }\n        } else if (action == RecursiveAction.COUNT)\n            size_to_trans += size;\n\n        /* Do the actual file transfer action. */\n        switch (action) {\n            case RecursiveAction.COPY:\n                debug_msg (_(\"Copy from '%s' to '%s'.\\n\"), from.get_path(),\n                                                           dest.get_path());\n                if (counter_on) {\n                    from.copy (dest, copy_flag, cancellable, (cur, tot) => {\n                        byte_count_changed ((current_size + (double) cur)/ total_size);\n                    });\n                    current_size += size;\n                    ++count_current;\n                    num_count_changed (count_current, count_total);\n                } else\n                    from.copy (dest, copy_flag, cancellable);\n                break;\n            //TODO: Exactly same as copying. Do this the more elegant way.\n            case RecursiveAction.MOVE:\n                debug_msg (_(\"Move from '%s' to '%s'.\\n\"), from.get_path(),\n                                                           dest.get_path());\n                if (counter_on) {\n                    from.move (dest, copy_flag, cancellable, (cur, tot) => {\n                        byte_count_changed ((current_size + (double) cur)/ total_size);\n                    });\n                    current_size += size;\n                    ++count_current;\n                    num_count_changed (count_current, count_total);\n                } else\n                    from.move (dest, copy_flag, cancellable);\n                break;\n            case RecursiveAction.COUNT:\n                break;\n            default:\n                bug_msg (_(\"Unexpected enum value: %s: %u\\n\"), \"common - RecursiveAction\", action);\n                break;\n        }\n    }\n}\n\n\n/**\n     * retrieves all cases for given words. \n     */\n    \n    public static Gee.Collection<string> get_insensitive_cases (string[] data)\n    {\n        var data_set = new Gee.HashSet<string>();\n        foreach(string str in data)\n            data_set.add_all (get_insensitive_case (str));\n        return data_set;\n    }\n    \n    static Gee.Collection<string> get_insensitive_case (string data)\n    {\n        var data_set = new Gee.HashSet<string>();\n        if (data.length == 0)\n            return data_set;\n        if (data.length == 1)\n        {\n            data_set.add (data.down ());\n            data_set.add (data.down ().up ());\n        }\n        else\n            foreach (var str in get_insensitive_case (data.substring (1)))\n            {\n                data_set.add (data[0].to_string().down() + str);\n                data_set.add (data[0].to_string().down().up() + str);\n            }\n        return data_set;\n    }\n\n/**\n * Remove file or directory / directory content recursively.\n *\n * @param path File or directory to remove.\n * @param recursively If `false` don't remove directories. Only useful if\n                      {@link path} is directory. To also remove parent, enable\n                      {@link with_parent}.\n * @param with_parent Remove current directory. Maybe only useful if\n                      {@link recursively} is enabled.\n *\n * @return `true` on success else `false`.\n */\npublic bool remove_recursively (string path,\n                                bool recursively = true,\n                                bool with_parent = false) throws GLib.IOError {\n    var f = File.new_for_path (path);\n    if (!f.query_exists())\n        throw new IOError.NOT_FOUND (_(\"file does not exist: %s\"), path);\n\n    var filetype = f.query_file_type (FileQueryInfoFlags.NONE, null);\n    switch (filetype) {\n        case FileType.REGULAR:\n            try {\n                return f.delete();\n            } catch (GLib.Error e) {\n                throw new IOError.FAILED (_(\"cannot delete file '%s': %s\"), f.get_path(), e.message);\n            }\n        case FileType.DIRECTORY:\n            FileEnumerator enumerator;\n            try {\n                enumerator = f.enumerate_children (\"standard::*\",\n                                                   FileQueryInfoFlags.NONE,\n                                                   null);\n            } catch (GLib.Error e) {\n                throw new IOError.FAILED (_(\"cannot get children of '%s': %s\"), f.get_path(), e.message);\n            }\n\n            FileInfo? info = null;\n            try {\n                while ((info = enumerator.next_file()) != null) {\n                    var new_file = f.resolve_relative_path (info.get_name());\n                    if (info.get_file_type() == FileType.DIRECTORY) {\n                        if (recursively) {\n                            remove_recursively_int (new_file);\n                            try {\n                                new_file.delete();\n                            } catch (GLib.Error e) {\n                                throw new IOError.FAILED (_(\"cannot delete file '%s': %s\"), new_file.get_path(), e.message);\n                            }\n                        }\n                    } else\n                        try {\n                            new_file.delete();\n                        } catch (GLib.Error e) {\n                            throw new IOError.FAILED (_(\"cannot delete file '%s': %s\"), new_file.get_path(), e.message);\n                        }\n                }\n            } catch (GLib.IOError e) {\n                throw e;\n            } catch (GLib.Error e) {\n                throw new IOError.FAILED (_(\"cannot enumerate children of '%s': %s\"), path, e.message);\n            }\n\n            if (with_parent)\n                try {\n                    return f.delete();\n                } catch (GLib.Error e) {\n                    throw new IOError.FAILED (_(\"cannot delete file '%s': %s\"), path, e.message);\n                }\n            else\n                return true;\n        default:\n            throw new IOError.NOT_SUPPORTED (_(\"no regular file or directory: %s\"), path);\n    }\n}\n\n\nprivate void remove_recursively_int (File f) throws GLib.IOError {\n    FileEnumerator enumerator;\n    try {\n        enumerator = f.enumerate_children (\"standard::*\",\n                                           FileQueryInfoFlags.NONE,\n                                           null);\n    } catch (GLib.Error e) {\n        throw new IOError.FAILED (_(\"cannot get children of '%s': %s\"), f.get_path(), e.message);\n    }\n\n    FileInfo? info = null;\n    try {\n        while ((info = enumerator.next_file()) != null) {\n            var new_file = f.resolve_relative_path (info.get_name());\n            if (info.get_file_type() == FileType.DIRECTORY) {\n                remove_recursively_int (new_file);\n                try {\n                    new_file.delete();\n                } catch (GLib.Error e) {\n                    throw new IOError.FAILED (_(\"cannot delete file '%s': %s\"), new_file.get_path(), e.message);\n                }\n            } else\n                try {\n                    new_file.delete();\n                } catch (GLib.Error e) {\n                    throw new IOError.FAILED (_(\"cannot delete file '%s': %s\"), new_file.get_path(), e.message);\n                }\n        }\n    } catch (GLib.IOError e) {\n        throw e;\n    } catch (GLib.Error e) {\n        throw new IOError.FAILED (_(\"cannot enumerate children of '%s': %s\"), f.get_path(), e.message);\n    }\n}\n\n\n/**\n * Generate list of filename parts spited on {@link GLib.Path.DIR_SEPARATOR}.\n *\n * @param path Pathname to split.\n * @param basename Control return of absolute or relative parts of path.\n * @param root Prepend root path or not.\n * @return If basename is `false`, return list of full paths. Else return\n *         absolute paths.\n */\npublic static string[] split_path (string path, bool basename = true, bool root = true) {\n    string[] pathlist = {};\n    string subpath = path;\n\n    /* Strip root from path name. */\n    var rootfound = false;\n    if (Path.skip_root (path) != null) {\n        var rootlesspart = Path.skip_root (path);\n        var rootindex = subpath.last_index_of (rootlesspart);\n        if (root) {\n            pathlist += subpath[0:byte_index_to_character_index (subpath, rootindex)];\n            if (!basename)\n                rootfound = true;\n        }\n        subpath = rootlesspart;\n    }\n\n    /* Strip path delimiter. */\n    var dirsepindex = subpath.last_index_of (Path.DIR_SEPARATOR_S);\n    if (dirsepindex != -1) {\n        var dirsepindexch = byte_index_to_character_index (subpath, dirsepindex);\n        if (subpath.length - dirsepindexch == Path.DIR_SEPARATOR_S.length)\n            subpath = subpath[0:dirsepindexch];\n    }\n\n    /* Generate list of file parts. */\n    string[] tmppathlist = {};\n    while (subpath != \"\" && subpath != \".\") {\n        if (basename)\n            tmppathlist += Path.get_basename (subpath);\n        else\n            tmppathlist += subpath;\n        subpath = Path.get_dirname (subpath);\n    }\n\n    /* Reverse order of file parts list and add it to final list. */\n    for (int i = tmppathlist.length - 1; i >= 0; --i)\n        if (rootfound)\n            pathlist += pathlist[0] + tmppathlist[i];\n        else\n            pathlist += tmppathlist[i];\n\n    return pathlist;\n}\n\n\npublic static int byte_index_to_character_index (string text, int byte_index, bool silent = false) {\n    if (!text.valid_char (byte_index)) {\n        if (!silent)\n            error_msg (_(\"No character found at byte index %d: %s\\n\"), byte_index, text);\n        return -1;\n    }\n\n    for (var i = 0; i < text.char_count(); ++i)\n        if (text.index_of_nth_char (i) == byte_index)\n            return i;\n\n    assert_not_reached();\n}\n\n\n/**\n * Save content to file.\n *\n * @param filename Filename where to save buffer.\n * @param text Content to save.\n * @return On success return `true` else `false`.\n */\npublic bool save_file (string filename, string text) {\n    var file = File.new_for_path (filename);\n\n    /* TODO: First parameter can be used to check if file has changed.\n     *       The second parameter can enable/disable backup file. */\n    try {\n        var fos = file.replace (null, false, FileCreateFlags.REPLACE_DESTINATION);\n        var dos = new DataOutputStream (fos);\n        dos.put_string (text);\n        dos.flush();\n        dos.close();\n        msg (_(\"File saved: %s\\n\"), file.get_path());\n        return true;\n    } catch (GLib.IOError e) {\n        errmsg (_(\"Could not update file: %s\\n\"), e.message);\n    } catch (GLib.Error e) {\n        errmsg (_(\"Could not open file writable: %s\\n\"), e.message);\n    }\n    return false;\n}\n\n\n/**\n * Compare two versions. Delimiter is a dot.\n *\n * @param ver_a First version.\n * @param ver_b Second version.\n * @return If first version is smaller return -1. If second version is smaller\n *         return 1. On equality return 0.\n */\npublic int comp_version (string ver_a, string ver_b) {\n    /* Epoch check. */\n    string[] a_ep_parts = ver_a.split (\":\", 2);\n    string[] b_ep_parts = ver_b.split (\":\", 2);\n    var eps = a_ep_parts.length - b_ep_parts.length;\n    if (eps > 0)\n        return 1;\n    else if (eps < 0)\n        return -1;\n    else if (a_ep_parts.length == 2) {\n        var ret = comp_version_part (a_ep_parts[0], b_ep_parts[0]);\n        if (ret != 0)\n            return ret;\n    }\n\n    string[] a_parts = a_ep_parts[a_ep_parts.length - 1].split (\".\");\n    string[] b_parts = b_ep_parts[b_ep_parts.length - 1].split (\".\");\n\n    var max = (a_parts.length < b_parts.length) ? a_parts.length : b_parts.length;\n\n    for (var i = 0; i < max; ++i) {\n        var ret = comp_version_part (a_parts[i], b_parts[i]);\n        if (ret != 0)\n            return ret;\n    }\n\n    var ret = a_parts.length - b_parts.length;\n    if (ret > 0)\n        return 1;\n    else if (ret < 0)\n        return -1;\n    return 0;\n}\n\n\n/**\n * Direct string comparison (leading zeros removed).\n *\n * @param a First version.\n * @param a Second version.\n * @return If first version is smaller return -1. If second version is smaller\n *         return 1. On equality return 0.\n */\ninternal inline int comp_version_part (string a, string b) {\n    /* Ignore leading zeros. */\n    uint a_start = 0;\n    while (a_start < a.length && a[a_start] == '0')\n        ++a_start;\n    uint b_start = 0;\n    while (b_start < b.length && b[b_start] == '0')\n        ++b_start;\n    var ret = a[a_start:a.length].length - b[b_start:b.length].length;\n    if (ret > 0)\n        return 1;\n    else if (ret < 0)\n        return -1;\n\n    ret = strcmp (a[a_start:a.length], b[b_start:b.length]);\n    if (ret > 0)\n        return 1;\n    else if (ret < 0)\n        return -1;\n    return 0;\n}\n\n\n/* Message methods. */\n/**\n * Print debug message only if debulevel is high enough.\n *\n * @param format Printf string.\n * @param ... Printf variables.\n */\npublic inline void debug_msg (string format, ...) {\n    debug_msg_level (1, format.vprintf (va_list()));\n}\n\npublic inline void debug_msg_level (int level, string format, ...) {\n    if (Args.debuglevel >= level)\n        stdout.printf (_(\"Valama: \") + format.vprintf (va_list()));\n}\n\npublic inline void warning_msg (string format, ...) {\n    stdout.printf (_(\"Valama: \") + _(\"Warning: \") + format.vprintf (va_list()));\n}\n\npublic inline void error_msg (string format, ...) {\n    stderr.printf (_(\"Valama: \") + _(\"Error: \") + format.vprintf (va_list()));\n}\n\npublic inline void bug_msg (string format, ...) {\n    // TRANSLATORS: Very important string ;) . Thanks btw. for your translation!\n    stderr.printf (format.vprintf (va_list()) + _(\"Please report a bug!\\n\"));\n}\n\npublic inline void msg (string format, ...) {\n    stdout.printf (_(\"Valama: \") + format.vprintf (va_list()));\n}\n\npublic inline void errmsg (string format, ...) {\n    stderr.printf (_(\"Valama: \") + format.vprintf (va_list()));\n}\n\npublic static Gee.SortedMap<string,string> list_all_pkg_config ()\n{\n    var map = new Gee.TreeMap<string, string> (Guanako.compare_string_case_insensitive);\n    string output;\n    try {\n        Process.spawn_command_line_sync (\"pkg-config --list-all\", out output);\n        var splitlines = output.split (\"\\n\");\n        // Don't include the last empty line.\n        for (int i = 1; i < splitlines.length; ++i) {\n            var splitline = splitlines[i-1].split (\" \", 2);\n            map[splitline[0]] = splitline[1].chug();\n        }\n        map[\"posix\"] = \"POSIX\";\n    } catch {\n\n    }\n    return map.read_only_view;\n}\n\npublic class Pair<K,V> : Gee.Map.Entry<K,V> {\n    private K _key;\n    private V _value;\n    public override K key { get { return _key; } }\n    public override V value {\n        get { return _value; }\n        set { _value = value; }\n    }\n    public override bool read_only { get { return false; } }\n\n    public Pair (K key, V value) {\n        _key = key;\n        _value = value;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/common/ui_helpers.vala",
    "content": "/*\n * src/common/ui_helpers.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing GLib;\n\npublic void standardize_listbox_row (ListBoxRow row) {\n    row.set_size_request (0, 40);\n    row.margin_left = 20;\n    row.margin_right = 20;\n    row.margin_top = 6;\n    row.margin_bottom = 6;\n}\n\nprivate bool is_after_eof (TextBuffer buffer, Vala.SourceLocation location) {\n    TextIter iter_end;\n\n    buffer.get_end_iter (out iter_end);\n    int last_line = iter_end.get_line() + 1;\n    int last_column = iter_end.get_chars_in_line();\n\n    return location.line > last_line || (location.line == last_line && location.column > last_column);\n}\n\nprivate bool is_after_eol (TextBuffer buffer, Vala.SourceLocation location, out int linelength) {\n    TextIter iter_end;\n    buffer.get_iter_at_line (out iter_end, location.line - 1);\n    linelength = iter_end.get_chars_in_line();\n    return location.column >= linelength;\n}\n\npublic void get_safe_iters_from_source_ref (TextBuffer bfr, Vala.SourceReference source_ref, ref TextIter? iter_start, ref TextIter? iter_end) {\n    if (is_after_eof (bfr, source_ref.begin))\n        bfr.get_end_iter (out iter_start);\n    else {\n        int linelength;\n        if (is_after_eol (bfr, source_ref.begin, out linelength)) {\n            if (linelength == 0) //In case of empty line, fix length\n                linelength = 1;\n            bfr.get_iter_at_line_offset (out iter_start,\n                                         source_ref.begin.line - 1,\n                                         linelength - 1);\n        } else\n            bfr.get_iter_at_line_offset (out iter_start,\n                                         source_ref.begin.line - 1,\n                                         source_ref.begin.column - 1);\n    }\n    if (is_after_eof (bfr, source_ref.end) || (source_ref.end.line == 0 && source_ref.end.column == 0))\n        bfr.get_end_iter (out iter_end);\n    else {\n        int linelength;\n        if (is_after_eol (bfr, source_ref.end, out linelength)) {\n            if (linelength == 0) //In case of empty line, fix length\n                linelength = 1;\n            bfr.get_iter_at_line_offset (out iter_end,\n                                         source_ref.end.line - 1,\n                                         linelength - 1);\n        } else\n            bfr.get_iter_at_line_offset (out iter_end,\n                                         source_ref.end.line - 1,\n                                         source_ref.end.column);\n    }\n}\n\n\n/**\n * Custom {@link Gtk.Entry} class.\n *\n * Check proper user input. Project names have to consist of \"normal\"\n * characters only (see regex below). Otherwise cmake would break.\n *\n * Provide two signals valid_input and invalid_input to signal if text is empty\n * or not.\n *\n */\n/*\n * TODO: Perhaps we should internally handle special characters with\n *       underscore.\n */\npublic class Entry : Gtk.Entry {\n    /**\n     * Id of timer.\n     */\n    private uint timer_id = 0;\n    /**\n     * Label to show error message.\n     */\n    private Label? err_label;\n    /**\n     * Regex of valid characters.\n     */\n    private Regex valid_chars;\n    /**\n     * Delay in seconds.\n     */\n    private uint delay_sec;\n    /**\n     * Label can be reseted when valid input is provided.\n     */\n    private bool label_resettable;\n    /**\n     * Reset label to this string.\n     */\n    private string reset_string;\n\n    /**\n     * Create Entry and connect signals to input.\n     *\n     * @param err_label {@link Gtk.Label} to show error message.\n     * @param valid_chars {@link GLib.Regex} with valid characters.\n     * @param delay_sec Time to show error message.\n     * @param reset_string Reset {@link Gtk.Label} to this string.\n     */\n    public Entry.with_inputcheck (Label? err_label,\n                                  Regex valid_chars,\n                                  uint delay_sec = 5,\n                                  string reset_string = \"\") {\n        this.err_label = err_label;\n        this.valid_chars = valid_chars;\n        this.delay_sec = delay_sec;\n        this.label_resettable = false;\n        this.reset_string = reset_string;\n\n        insert_text.connect ((new_text) => {\n            this.ui_check_input (new_text);\n        });\n        changed.connect (() => {\n            if (this.text != \"\")\n                valid_input();\n            else\n                invalid_input();\n        });\n    }\n\n    /**\n     * Destroy object and disable timer.\n     */\n    ~Entry() {\n        this.disable_timer();\n    }\n\n    /**\n     * Check text for valid input and (re)set {@link err_label} with timer\n     * accordingly.\n     *\n     * @param input_text Text to check.\n     */\n    public void ui_check_input (string input_text) {\n        MatchInfo match_info = null;  // init to null to make valac happy\n        if (!this.valid_chars.match (input_text, 0, out match_info)) {\n            if (err_label != null) {\n                this.err_label.set_label (\n                    _(\"Invalid character: '%s' Please choose one from: %s\").printf (\n                    match_info.get_string(), this.valid_chars.get_pattern()));\n                this.label_resettable = false;\n            }\n            this.disable_timer();  // reset timer to let it start again\n            this.timer_id = Timeout.add_seconds (this.delay_sec, (() => {\n                if (err_label != null)\n                    this.err_label.set_label (reset_string);\n                return true;\n            }));\n            Signal.stop_emission_by_name (this, \"insert_text\");\n        } else if (err_label != null && this.label_resettable) {\n            this.label_resettable = false;\n            this.err_label.set_label (reset_string);\n        }\n    }\n\n    /**\n     * Emit when input was valid.\n     */\n    public signal void valid_input();\n    /**\n     * Emit when input was invalid.\n     */\n    public signal void invalid_input();\n\n    /**\n     * If resettable is true. Label will be reseted with next user input.\n     *\n     * @param error_msg Error message to show in {@link err_label}.\n     * @param delay Delay in seconds to show error in {@link err_label}.\n     * @param resettable {@link err_label} will be reseted with valid input.\n     */\n    public void set_label_timer (string error_msg, uint delay, bool resettable = true) {\n        this.err_label.set_label (error_msg);\n        this.label_resettable = resettable;\n        this.disable_timer();\n        this.timer_id = Timeout.add_seconds (delay, (() => {\n            this.err_label.set_label (reset_string);\n            return true;\n        }));\n    }\n\n    /**\n     * Disable timer.\n     */\n    public void disable_timer() {\n        if (this.timer_id != 0)\n            Source.remove (this.timer_id);\n    }\n}\n\n\n/**\n * Simple warning dialog with 'yes' and 'no' buttons.\n *\n * Remeber to properly escape extra_text if needed.\n *\n * @param warn_msg Text of warning.\n * @param extra_text Additional information with markdown formatting.\n * @return Return {@link Gtk.ResponseType}, either {@link Gtk.ResponseType.YES}\n *         or {@link Gtk.ResponseType.YES}.\n */\npublic int ui_ask_warning (string warn_msg, string? extra_text = null) {\n    var dlg = new MessageDialog (window_main,\n                                 DialogFlags.MODAL,\n                                 MessageType.WARNING,\n                                 ButtonsType.YES_NO,\n                                 warn_msg,\n                                 null);\n    if (extra_text != null) {\n        dlg.secondary_use_markup = true;\n        dlg.secondary_text = extra_text;\n    }\n\n    int ret = dlg.run();\n    dlg.destroy();\n    return ret;\n}\n\n\n/**\n * Simple warning dialog with 'discard' 'save' and 'cancel' buttons.\n *\n * Remeber to properly escape extra_text if needed.\n *\n * @param warn_msg Text of warning.\n * @param extra_text Additional information with markdown formatting.\n * @return Return {@link Gtk.ResponseType}.\n */\npublic int ui_ask_file (string warn_msg, string? extra_text = null) {\n    var dlg = new MessageDialog (window_main,\n                                 DialogFlags.MODAL,\n                                 MessageType.WARNING,\n                                 ButtonsType.NONE,\n                                 warn_msg,\n                                 null);\n\n    if (extra_text != null) {\n        dlg.secondary_use_markup = true;\n        dlg.secondary_text = extra_text;\n    }\n\n    dlg.add_button (_(\"_Discard\"), ResponseType.REJECT);\n    dlg.add_button (_(\"_Save\"), ResponseType.ACCEPT);\n    dlg.add_button (_(\"_Cancel\"), ResponseType.CANCEL);\n\n    int ret = dlg.run();\n    dlg.destroy();\n    return ret;\n}\n\n\n/**\n * Types of \"root\" trees in project browser (source files, build files,\n * packages).\n */\npublic enum StoreType {\n    PACKAGE,\n    PACKAGE_TREE,\n    FILE,\n    DIRECTORY,\n    FILE_TREE\n}\n\n\n/**\n * Build {@link Gtk.TreeStore} with files. Each directory has its own leaves.\n *\n * Input will be sorted.\n *\n * @param storename Name of store.\n * @param files List of files to add to store.\n * @param store {@link Gtk.TreeStore} to initialize.\n * @param pathmap Map from file paths to {@link Gtk.TreeIter} to build up tree\n *                correctly.\n */\npublic void build_file_treestore (string storename,\n                                  string[] dirs,\n                                  string[] files,\n                                  ref TreeStore store,\n                                  ref Gee.HashMap<string, TreeIter?> pathmap) {\n        TreeIter iter_base;\n        store.append (out iter_base, null);\n        store.set (iter_base, 1, storename, 2, StoreType.FILE_TREE, -1);\n\n        /* Filename -> filetype mappings. Value is `true` for directories. */\n        var tmap = new Gee.TreeMap<string, bool>();\n        foreach (var file in files)\n            tmap[file] = false;\n        foreach (var dir in dirs)\n            tmap[dir] = true;\n\n        foreach (var entry in tmap.entries) {\n            var pathparts = split_path (project.get_relative_path (entry.key), false);\n\n            /* Project root directory. */\n            if (pathparts.length == 0)\n                continue;\n\n            for (int depth = 0; depth < pathparts.length; ++depth) {\n                if (pathmap.has_key (pathparts[depth]))\n                    continue;\n\n                TreeIter iter;\n                if (depth == 0)\n                    store.append (out iter, iter_base);\n                else\n                    store.append (out iter, pathmap[Path.get_dirname (pathparts[depth])]);\n                \n                StoreType store_type;\n                string? icon_name = null;\n                string ext = pathparts[pathparts.length - 1];\n                ext = ext.substring (ext.last_index_of (\".\") + 1);\n                if (entry.value || depth < pathparts.length - 1) {\n                    store_type = StoreType.DIRECTORY;\n                    icon_name = \"folder\";\n                } else {\n                    store_type = StoreType.FILE;\n                    icon_name = \"document\";\n                }\n\n                store.set (iter, 0, icon_name, 1, Path.get_basename (pathparts[depth]), 2, store_type, -1);\n\n                pathmap[pathparts[depth]] = iter;\n            }\n        }\n}\n\n\n/**\n * Build plain {@link Gtk.TreeStore}.\n *\n * To build up TreeStore with leaves, look at {@link build_file_treestore}.\n *\n * @param storename Name of store.\n * @param elements List of elements to add to store.\n * @param store {@link Gtk.TreeStore} to initialize.\n */\npublic void build_plain_treestore (string storename, string[] elements, ref TreeStore store) {\n    TreeIter iter_base;\n    store.append (out iter_base, null);\n    store.set (iter_base, 1, storename, 2, StoreType.PACKAGE_TREE, -1);\n\n    foreach (string element in elements) {\n        TreeIter iter;\n        store.append (out iter, iter_base);\n        store.set (iter, 1, element, 2, StoreType.PACKAGE, -1);\n    }\n}\n\n/**\n * Load {@link Gdl.DockLayout} from filename.\n *\n * @param layout Layout to load.\n * @param filename Name of file to load layout from.\n * @param section Name of default section to load settings from.\n * @param error Display error if layout file does not exist.\n * @return Return `true` on success else `false`.\n */\npublic bool load_layout (Gdl.DockLayout layout,\n                         string filename,\n                         string? section = null,\n                         bool error = true) {\n    if (!FileUtils.test (filename, FileTest.IS_REGULAR)) {  //TODO: Allow symlinks.\n        if (error)\n            warning_msg (_(\"Layout file does not exist: %s\\n\"), filename);\n        else\n            debug_msg (_(\"Layout file does not exist: %s\\n\"), filename);\n        return false;\n    }\n    debug_msg (_(\"Load layout...\\n\"));\n    string lsection = (section != null) ? section : \"__default__\";\n    bool ret = layout.load_from_file (filename);\n    if (ret)\n        debug_msg (_(\"Layouts loaded from file: %s\\n\"), filename);\n    else\n        errmsg (_(\"Couldn't load layout file: %s\\n\"), filename);\n    return (ret && layout_reload (layout, lsection));\n}\n\n/**\n * Reload {@link Gdl.DockLayout}. May be helpful on window resize.\n *\n * @param layout Layout to reload.\n * @param section Name of default section to load settings from.\n * @return Return `true` on success else `false`.\n */\npublic bool layout_reload (Gdl.DockLayout layout, string section = \"__default__\") {\n    bool ret = layout.load_layout (section);\n    if (!ret)\n        errmsg (_(\"Couldn't load layout: %s\\n\"), section);\n    else\n        debug_msg (_(\"Layout loaded: %s\\n\"), section);\n    return ret;\n}\n\n/**\n * Save current {@link Gdl.DockLayout} to file.\n *\n * @param layout Layout to save.\n * @param filename Name of file to save layout to.\n * @param section Save specific layout section.\n * @return Return `true` on success else `false`.\n */\npublic bool save_layout (Gdl.DockLayout layout, string filename,\n                         string section = \"__default__\") {\n    layout.save_layout (section);\n    bool ret = layout.save_to_file (filename);\n    if (!ret)\n        errmsg (_(\"Couldn't save layout to file: %s\\n\"), filename);\n    else\n        debug_msg (_(\"Layout '%s' saved to file: %s\\n\"), section, filename);\n    return ret;\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/completion_provider.vala",
    "content": "/*\n * src/completion_provider.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Guanako;\nusing Vala;\n\npublic class GuanakoCompletion : Gtk.SourceCompletionProvider, Object {\n    Gdk.Pixbuf icon;\n    public string name;\n    public int priority;\n    GLib.List<Gtk.SourceCompletionItem> proposals;\n\n    construct {\n        Gdk.Pixbuf icon = this.get_icon();\n\n        this.proposals = new GLib.List<Gtk.SourceCompletionItem>();\n    }\n\n    public string get_name() {\n        return this.name;\n    }\n\n    public int get_priority() {\n        return this.priority;\n    }\n\n    public bool match (Gtk.SourceCompletionContext context) {\n        return true;\n    }\n\n    Project.CompletionRun completion_run = null;\n    bool completion_run_queued = false;\n    SuperSourceView.LineAnnotation current_symbol_annotation = null;\n    TextMark completion_mark; /* The mark at which the proposals were generated */\n    string completion_stmt;\n    int completion_col;\n    int completion_line;\n    SourceCompletionContext completion_context;\n    public void populate (SourceCompletionContext context) {\n        //TODO: Provide way to get completion for not saved content.\n        if (is_new_document (source_viewer.current_srcfocus))\n            return;\n\n        /* Get current line */\n        completion_mark = source_viewer.current_srcbuffer.get_insert();\n        TextIter iter;\n        source_viewer.current_srcbuffer.get_iter_at_mark (out iter, completion_mark);\n\n        TextIter match_sem;\n        iter.backward_search (\";\", TextSearchFlags.TEXT_ONLY, null, out match_sem, null);\n        if (!iter.backward_search (\";\", TextSearchFlags.TEXT_ONLY, null, out match_sem, null))\n            source_viewer.current_srcbuffer.get_iter_at_offset(out match_sem, 0);\n\n        TextIter match_brk;\n        if (iter.backward_search (\"}\", TextSearchFlags.TEXT_ONLY, null, out match_brk, null))\n            if (match_brk.compare (match_sem) > 0)\n                match_sem = match_brk;\n        if (iter.backward_search (\"{\", TextSearchFlags.TEXT_ONLY, null, out match_brk, null))\n            if (match_brk.compare (match_sem) > 0)\n                match_sem = match_brk;\n\n        lock (completion_run) {\n            completion_line = iter.get_line() + 1;\n            completion_col = iter.get_line_offset();\n            completion_stmt = source_viewer.current_srcbuffer.get_text (match_sem, iter, false).replace(\"\\n\", \"\");\n            completion_context = context;\n\n            completion_run_queued = true;\n            if (completion_run != null) {\n                completion_run.abort_run();\n                return;\n            }\n            if (completion_stmt.strip() == \"\" && !source_viewer.current_srcbuffer.last_key_valid) {\n                if (completion_context is SourceCompletionContext)\n                    completion_context.add_proposals (this, new GLib.List<Gtk.SourceCompletionItem>(), true);\n\n                if (current_symbol_annotation != null) {\n                    current_symbol_annotation.finished = true;\n                    current_symbol_annotation = null;\n                }\n                return;\n            }\n            completion_run = new Project.CompletionRun (project.guanako_project);\n        }\n\n        try {\n            new Thread<void*>.try (_(\"Completion\"), () => {\n                /* Get completion proposals from Guanako */\n                while (true) {\n                    completion_run = new Project.CompletionRun (project.guanako_project);\n\n                    completion_run_queued = false;\n                    var guanako_proposals = completion_run.run (project.guanako_project.get_source_file_by_name (source_viewer.current_srcfocus),\n                                        completion_line, completion_col, completion_stmt);\n\n                    lock (completion_run) {\n                        if (completion_run_queued)\n                            continue;\n                        if (guanako_proposals == null) {\n                            if (!completion_run_queued) {\n                                completion_run = null;\n                                break;\n                            } else\n                                continue;\n                        }\n                    }\n                    Symbol current_symbol = null;\n                    if (completion_run.cur_stack.size > 0)\n                        current_symbol = completion_run.cur_stack.last();\n\n                    if (current_symbol_annotation != null)\n                        current_symbol_annotation.finished = true;\n\n                    if (current_symbol != null)\n                        current_symbol_annotation = source_viewer.current_srcview.annotate (\n                                                        completion_line - 1,\n                                                        Guanako.symbolsig_to_string (current_symbol),\n                                                        0.5, 0.5, 0.5,\n                                                        true,\n                                                        -1);\n                    else\n                        current_symbol_annotation = null;\n                    GLib.Idle.add (() => {\n                        project.completion_finished (current_symbol);\n                        return false;\n                    });\n\n                    /* Assign icons and pass the proposals on to Gtk.SourceView */\n                    var props = new GLib.List<Gtk.SourceCompletionItem>();\n                    foreach (Gee.TreeSet<CompletionProposal> list in guanako_proposals)\n                        foreach (CompletionProposal guanako_proposal in list) {\n                            if (guanako_proposal.symbol.name != null) {\n\n                                Gdk.Pixbuf pixbuf = get_pixbuf_for_symbol (guanako_proposal.symbol);\n\n                                var item = new ComplItem (guanako_proposal.symbol.name,\n                                                        guanako_proposal.symbol.name,\n                                                        pixbuf,\n                                                        null,\n                                                        guanako_proposal);\n                                props.append (item);\n                            }\n                        }\n                    GLib.Idle.add (() => {\n                        if (!completion_run_queued && completion_context is SourceCompletionContext)\n                            completion_context.add_proposals (this, props, true);\n                        return false;\n                    });\n                    lock (completion_run) {\n                        if (!completion_run_queued) {\n                            completion_run = null;\n                            break;\n                        }\n                    }\n                }\n                return null;\n            });\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not launch completion thread successfully: %s\\n\"), e.message);\n        }\n    }\n    \n    public unowned Gdk.Pixbuf? get_icon() {\n        if (this.icon == null) {\n            Gtk.IconTheme theme = Gtk.IconTheme.get_default();\n            try {\n                this.icon = theme.load_icon (\"dialog-information\", 16, 0);\n            } catch (GLib.Error e) {\n                errmsg (_(\"Could not load theme icon: %s\\n\"), e.message);\n            }\n        }\n        return this.icon;\n    }\n\n    public bool activate_proposal (Gtk.SourceCompletionProposal proposal,\n                                   Gtk.TextIter iter) {\n        var prop = ((ComplItem)proposal).guanako_proposal;\n\n        /* Count backward from completion_mark instead of iter (avoids wrong insertion if the user is typing fast) */\n        TextIter start;\n        source_viewer.current_srcbuffer.get_iter_at_mark (out start, completion_mark);\n        start.backward_chars (prop.replace_length);\n\n        source_viewer.current_srcbuffer.delete (ref start, ref iter);\n        source_viewer.current_srcbuffer.insert (ref start, prop.symbol.name, prop.symbol.name.length);\n\n        /* After activating a proposal, immediately queue a new completion request (to keep the completion window open) */\n        GLib.Idle.add (()=>{\n            source_viewer.current_srcview.show_completion();\n            return false;\n        });\n        return true;\n    }\n\n    public Gtk.SourceCompletionActivation get_activation() {\n        return Gtk.SourceCompletionActivation.INTERACTIVE |\n               Gtk.SourceCompletionActivation.USER_REQUESTED;\n    }\n\n    Box box_info_frame = new Box (Orientation.VERTICAL, 0);\n    Widget info_inner_widget = null;\n    \n    public unowned Gtk.Widget? get_info_widget (Gtk.SourceCompletionProposal proposal) {\n        return box_info_frame;\n    }\n\n    public int get_interactive_delay() {\n        return -1;\n    }\n    \n#if GTK_SOURCE_VIEW_3_14_3\n    public bool get_start_iter (Gtk.SourceCompletionContext context, Gtk.SourceCompletionProposal proposal, out Gtk.TextIter iter) {\n#else\n    public bool get_start_iter (Gtk.SourceCompletionContext context, Gtk.SourceCompletionProposal proposal, Gtk.TextIter iter) {\n#endif\n        var mark = source_viewer.current_srcbuffer.get_insert();\n        TextIter cursor_iter;\n        source_viewer.current_srcbuffer.get_iter_at_mark (out cursor_iter, mark);\n\n        var prop = ((ComplItem)proposal).guanako_proposal;\n        cursor_iter.backward_chars (prop.replace_length);\n        iter = cursor_iter;\n        return true;\n    }\n\n    public void update_info (Gtk.SourceCompletionProposal proposal,\n                             Gtk.SourceCompletionInfo info) {\n        if (info_inner_widget != null) {\n            info_inner_widget.destroy();\n            info_inner_widget = null;\n        }\n\n        var prop = ((ComplItem)proposal).guanako_proposal;\n        if (prop is Method) {\n            var mth = prop.symbol as Method;\n            var vbox = new Box (Orientation.VERTICAL, 0);\n            string param_string = \"\";\n            foreach (Vala.Parameter param in mth.get_parameters())\n                param_string += param.variable_type.data_type.name + \" \" + param.name + \", \";\n            if (param_string.length > 1)\n                param_string = param_string.substring (0, param_string.length - 2);\n            else\n                // TRANSLATORS: Context: Parameters: none\n                param_string = _(\"none\");\n            vbox.pack_start (new Label (_(\"Parameters:\\n\") + param_string + \"\\n\\n\"\n                             // TRANSLATORS:\n                             // Returns a return value (programming).\n                                        + _(\"Returns:\\n\") +\n                                        mth.return_type.data_type.name));\n            info_inner_widget = vbox;\n        } else\n            info_inner_widget = new Label (prop.symbol.name);\n\n        info_inner_widget.show_all();\n        box_info_frame.pack_start (info_inner_widget, true, true);\n    }\n}\n\n/**\n * {@link Gtk.SourceCompletionItem} enhanced to carry a reference to the\n * corresponding Guanako proposal.\n */\nclass ComplItem : SourceCompletionItem {\n    public ComplItem (string label, string text, Gdk.Pixbuf? icon, string? info, CompletionProposal guanako_proposal) {\n        Object (label: label, text: text, icon: icon, info: info);\n        this.guanako_proposal = guanako_proposal;\n    }\n    public CompletionProposal guanako_proposal;\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/dialogs/about.vala",
    "content": "/*\n * src/dialogs/about.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Gdk;\nusing GLib;\n\n/**\n * Show about dialog.\n */\npublic void ui_about_dialog() {\n    var dlg = new AboutDialog();\n    dlg.resizable = false;\n\n    try {\n        dlg.logo = new Pixbuf.from_file (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                      Config.PACKAGE_DATA_DIR,\n                                                      \"valama-text.png\"));\n    } catch (GLib.Error e) {\n        errmsg (\"Could not load pixmap: %s\\n\", e.message);\n    }\n\n    //TODO: Generate this automatically from AUTHORS file.\n    dlg.artists = null;\n    dlg.authors = {\"Linus Seelinger <S.Linus@gmx.de>\",\n                   \"Dominique Lasserre <lasserre.d@gmail.com>\"};\n    dlg.documenters = null;\n    dlg.translator_credits =\n            \"Overscore (%s)\".printf (_(\"French\")) + \"\\n\" +\n            \"Dominique Lasserre <lasserre.d@gmail.com> (%s)\".printf (_(\"German\"));\n\n    dlg.program_name = Config.PACKAGE_NAME;\n    dlg.comments = _(\"Next generation Vala IDE\");\n    dlg.copyright = _(\"Copyright © 2012, 2013 Valama development team\");\n    dlg.version  = Config.PACKAGE_VERSION;\n\n    dlg.license_type = License.GPL_3_0;\n    dlg.wrap_license = true;\n\n    dlg.website = \"https://github.com/Valama/valama\";\n    dlg.website_label = _(\"Github project page\");\n\n    dlg.response.connect ((response_id) => {\n        switch (response_id) {\n            case ResponseType.CANCEL:\n            case ResponseType.DELETE_EVENT:\n                dlg.destroy();\n                break;\n            default:\n                bug_msg (_(\"Unexpected enum value: %s: %u\\n\"),\n                         \"about_dialog - dlg.response.connect\", response_id);\n                break;\n        }\n    });\n\n    dlg.run();\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/dialogs/create_file.vala",
    "content": "/*\n * src/dialogs/create_file.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing GLib;\nusing Vala;\n\n/**\n * Create new file (you need to add it to project manually). If file already\n * exists, open it.\n *\n * @param path Root path of new file.\n * @param extension File extension.\n * @param directory Create directory.\n * @return Filename or `null`.\n */\npublic string? ui_create_file_dialog (string? path = null, string? extension = null,\n                                      bool directory = false) {\n    var dlg = new Dialog.with_buttons ((!directory) ? _(\"Choose filename\")\n                                                    : _(\"Choose directory name\"),\n                                       window_main,\n                                       DialogFlags.MODAL,\n                                       _(\"_Cancel\"),\n                                       ResponseType.CANCEL,\n                                       (!directory) ? _(\"_Open\") : _(\"_Add\"),\n                                       ResponseType.ACCEPT,\n                                       null);\n\n    dlg.set_size_request (420, 100);\n    dlg.resizable = false;\n\n    var box_main = new Box (Orientation.VERTICAL, 0);\n    // TRANSLATORS:\n    // E.g.: \"Add new file to project (inside 'src/' directory)\"\n    var desc = ((!directory) ? _(\"Add new file to project (%s)\")\n    // TRANSLATORS:\n    // E.g.: \"Create new subdirectory (inside 'src/' directory)\"\n                             : _(\"Create new subdirectory (%s)\")).printf (\n    // TRANSLATORS:\n    // Context: Add new file to project (inside `foobar' directory)\n                            (path != null) ? _(\"inside '%s' directory\").printf (path)\n                                           : _(\"inside project root directory\"));\n    var frame_filename = new Frame (desc);\n    var box_filename = new Box (Orientation.VERTICAL, 0);\n    frame_filename.add (box_filename);\n\n    var ent_filename_err = new Label (\"\");\n    ent_filename_err.sensitive = false;\n\n    Regex valid_chars = /^[a-z0-9.:_\\\\\\/+-]+$/i;  // keep \"-\" at the end!\n    var ent_filename = new Entry.with_inputcheck (ent_filename_err, valid_chars);\n    ent_filename.set_placeholder_text (_(\"filename\"));  // this is e.g. not visible\n\n    box_filename.pack_start (ent_filename, false, false);\n    box_filename.pack_start (ent_filename_err, false, false);\n    box_main.pack_start (frame_filename, true, true);\n    box_main.show_all();\n    dlg.get_content_area().pack_start (box_main);\n\n    string basepath;\n    if (path == null)\n        basepath = project.project_path;\n    else\n        basepath = project.get_absolute_path (path);\n\n    string? filename = null;\n    dlg.response.connect ((response_id) => {\n        if (response_id == ResponseType.ACCEPT) {\n            if (ent_filename.text == \"\") {\n                ent_filename.set_label_timer (_(\"Don't let this field empty. Name a file.\"), 10);\n                return;\n            }\n            filename = Path.build_path (Path.DIR_SEPARATOR_S,\n                                        basepath,\n                                        ent_filename.text);\n            if (!directory) {\n                if (extension != null)\n                    if (!filename.has_suffix (@\".$extension\"))\n                        filename += @\".$extension\";\n                var f = File.new_for_path (filename);\n                if (!f.query_exists()) {\n                    if (f.get_parent() != null && !f.get_parent().query_exists())\n                        try {\n                            f.get_parent().make_directory_with_parents();\n                        } catch (GLib.Error e) {\n                            errmsg (_(\"Could not create parent directory: %s\\n\"), e.message);\n                        }\n                    try {\n                        var output_stream = f.create (FileCreateFlags.NONE);\n                        //  add minimal xml data to ui file, otherwise libgladeui throws critical errors !\n                        if (extension == \"ui\")\n                            output_stream.write (\"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- Generated with Valama 0.1.2 -->\n<interface>\n    <requires lib=\"gtk+\" version=\"3.12\"/>\n</interface>\"\"\".data);\n                        output_stream.close();\n                        \n                    } catch (GLib.IOError e) {\n                        errmsg (_(\"Could not write to new file: %s\\n\"), e.message);\n                        filename = null;\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Could not create new file: %s\\n\"), e.message);\n                        filename = null;\n                    }\n                }\n            } else {\n                var f = File.new_for_path (filename);\n                if (!f.query_exists())\n                    try {\n                        f.make_directory_with_parents();\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Could not create new directory: %s\\n\"), e.message);\n                        filename = null;\n                    }\n            }\n        }\n        dlg.destroy();\n    });\n    dlg.run();\n\n    return filename;\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/dialogs/missing_packages.vala",
    "content": "/*\n * src/dialogs/missing_packages.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing GLib;\n\n/**\n * Show dialog with missing packages.\n */\npublic void ui_missing_packages_dialog (string[] missing_packages) {\n    var dlg_missing_packages = new Dialog.with_buttons (_(\"Missing packages\"),\n                                                        window_main,\n                                                        DialogFlags.MODAL,\n                                                        _(\"_Ok\"),\n                                                        ResponseType.OK,\n                                                        null);\n    dlg_missing_packages.resizable = false;\n\n    var box_main = new Box (Orientation.VERTICAL, 0);\n    string dlg = _(\"The following vala packages are not available on your system:\\n\");\n    foreach (string pkg in missing_packages)\n        dlg += pkg + \"\\n\";\n    dlg += _(\"Compiling and auto completion might fail!\");\n    var lbl_packages = new Label (dlg);\n    box_main.pack_start (lbl_packages, true, true);\n    box_main.show_all();\n\n    dlg_missing_packages.get_content_area().pack_start (box_main);\n    dlg_missing_packages.run();\n    dlg_missing_packages.destroy();\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/dialogs/project_settings.vala",
    "content": "/*\n * src/dialogs/project_settings.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing GLib;\n\n/**\n * Show project settings window.\n *\n * @param project {@link ValamaProject} to edit settings.\n */\npublic void ui_project_dialog (ValamaProject? project) {\n    var dlg = new Dialog.with_buttons (_(\"Project settings\"),\n                                       window_main,\n                                       DialogFlags.MODAL,\n                                       _(\"_Discard\"),\n                                       ResponseType.REJECT,\n                                       _(\"_Cancel\"),\n                                       ResponseType.CANCEL,\n                                       _(\"_Ok\"),\n                                       ResponseType.OK,\n                                       null);\n    dlg.set_size_request (600, 400);\n    dlg.resizable = false;\n\n    var headerbar = new HeaderBar();\n    headerbar.title = _(\"Project settings\");\n    headerbar.show_all();\n    dlg.set_titlebar(headerbar);\n\n    var box_main = new Box (Orientation.VERTICAL, 0);\n\n    var list = new Gtk.ListBox ();\n    list.selection_mode = SelectionMode.NONE;\n    list.row_selected.connect((row)=>{row.activate();}); //TODO: Possibly unnecessary in future GTK versions\n\n    /* Set project name. */\n    var row = new ListBoxRow();\n    var box = new Box(Orientation.HORIZONTAL, 0);\n\n    var lbl = new Label (_(\"Project name\"));\n    lbl.halign = Align.START;\n    box.pack_start (lbl, true, true);\n\n    var ent_proj_name_err = new Label (\"\");\n    ent_proj_name_err.sensitive = false;\n\n    Regex valid_chars = /^[a-z0-9.:_-]+$/i;  // keep \"-\" at the end!\n    var ent_proj_name = new Entry.with_inputcheck (ent_proj_name_err, valid_chars);\n    ent_proj_name.text = project.project_name;\n\n    ent_proj_name.valid_input.connect (() => {\n        dlg.set_response_sensitive (ResponseType.OK, true);\n    });\n    ent_proj_name.invalid_input.connect (() => {\n        dlg.set_response_sensitive (ResponseType.OK, false);\n    });\n\n    box.pack_start (ent_proj_name, false, true);\n\n    row.add (box);\n    standardize_listbox_row (row);\n    list.add (row);\n    \n    /*\n     * Set project type : library/binary.\n     */\n\n    row = new ListBoxRow();\n    var library_chekbtn = new CheckButton.with_label (\"is library project\");\n    row.add (library_chekbtn);\n    list.add (row);\n    \n    /*\n     * Set build system type.\n     */\n    \n    row = new ListBoxRow();\n    var bslist = new ComboBoxText();\n    BuildSystemTemplate.load_buildsystems();\n    int i = 1;\n    bool found = false;\n    foreach (var bs in buildsystems.keys) {\n        bslist.append_text (bs);\n        if (!found) {\n            if (bs == project.buildsystem)\n                found = true;\n        } else\n            ++i;\n    }\n    if (found)\n        bslist.active = i;\n    row.add (bslist);\n    list.add (row);\n    \n    /*\n     * Set project version.\n     * Format: X.Y.Z (major version, minor version, patch version)\n     * Restrict major and minor version number to 999 which should be enough.\n     */\n    row = new ListBoxRow();\n    box = new Box(Orientation.HORIZONTAL, 0);\n\n    lbl = new Label (_(\"Version:\"));\n    lbl.halign = Align.START;\n    box.pack_start (lbl, true, true);\n\n    var ent_major = new SpinButton.with_range (0, 999, 1);\n    ent_major.value = (double) project.version_major;\n    box.pack_start (ent_major, false, false);\n\n    var ent_minor = new SpinButton.with_range (0, 999, 1);\n    ent_minor.value = (double) project.version_minor;\n    box.pack_start (ent_minor, false, false);\n\n    var ent_patch = new SpinButton.with_range (0, 9999, 1);\n    ent_patch.value = (double) project.version_patch;\n    box.pack_start (ent_patch, false, false);\n\n    row.add (box);\n    standardize_listbox_row (row);\n    list.add (row);\n    \n    row = new ListBoxRow();\n    var flags_lbl = new Label (_(\"Additional flags\"));\n    var flags_entry = new Entry();\n    if (project.flags != null)\n\t\tflags_entry.text = project.flags;\n    box = new Box (Orientation.VERTICAL, 0);\n    box.pack_start (flags_lbl, false, false);\n    box.pack_start (flags_entry, true, false);\n    row.add (box);\n    list.add (row);\n\n    /* Save changes only when \"OK\" button is clicked. Reset on \"Discard\". */\n    dlg.response.connect ((response_id) => {\n        switch (response_id) {\n            case ResponseType.OK:\n                if (project.project_name != ent_proj_name.text) {\n                    project.project_name = ent_proj_name.text;\n                    project.save_to_recent();  // update recent list immediately\n                }\n                project.version_major = (int) ent_major.value;\n                project.version_minor = (int) ent_minor.value;\n                project.version_patch = (int) ent_patch.value;\n                project.flags = flags_entry.text;\n                project.library = library_chekbtn.active;\n                if (bslist.active >= 0)\n                    project.buildsystem = bslist.get_active_text();\n                project.save_project_file();\n                dlg.destroy();\n                break;\n            case ResponseType.CANCEL:\n            case ResponseType.DELETE_EVENT:  // window manager close\n                dlg.destroy();\n                break;\n            case  ResponseType.REJECT:\n                /* Set label this first, perhaps insert_text will recognize\n                 * unwanted characters (but this would be a bug if it is not\n                 * already recognized before). */\n                ent_proj_name_err.set_label (\"\");\n                ent_proj_name.disable_timer();\n\n                ent_proj_name.text = project.project_name;\n                ent_major.value = (double) project.version_major;\n                ent_minor.value = (double) project.version_minor;\n                ent_patch.value = (double) project.version_patch;\n                //ent_version_special.text = project.version_special;\n                library_chekbtn.active = project.library;\n                if (project.buildsystem != \"\") {\n                    int j = 0;\n                    bool found2 = false;\n                    TreeIter iter;\n                    if (bslist.model.get_iter_first (out iter))\n                        do {\n                            Value bs;\n                            bslist.model.get_value (iter, 0, out bs);\n                            if ((string) bs == project.buildsystem) {\n                                found2 = true;\n                                bslist.active = j;\n                                break;\n                            }\n                            ++j;\n                        } while (bslist.model.iter_next (ref iter));\n                    if (!found2)\n                        bslist.active = -1;\n                }\n                break;\n            default:\n                bug_msg (_(\"Unexpected enum value: %s: %d\\n\"), \"project_dialog - dlg.response.connect\", response_id);\n                dlg.destroy();\n                break;\n        }\n    });\n\n\n    /* Raise window. */\n    var frame = new Frame(null);\n    frame.add (list);\n    var align = new Alignment (0.0f, 0.5f, 1.0f, 0.0f);\n    align.add (frame);\n    box_main.pack_start (align, true, true);\n    box_main.show_all();\n\n    dlg.get_content_area().pack_start (box_main);\n    dlg.run();\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/main.vala",
    "content": "/*\n * src/main.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Gdl;\nusing Vala;\nusing Gee;\nusing GLib;\nusing Guanako;\n\nstatic Window window_main;\nstatic HeaderBar window_main_header;\nstatic MainWidget? widget_main = null;\nstatic RecentManager recentmgr;\nstatic WelcomeScreen.WelcomeScreen? vscreen = null;\nstatic Valama gtk_app;\nstatic ValamaSettings settings;\n\nstatic TreeMap<string, BuildSystemTemplate>? buildsystems = null;\nstatic TreeMap<string, ProjectTemplate>? templates = null;\n\nstatic Gee.ArrayList<string>? locales = null;\n\npublic static int main (string[] args) {\n    GtkClutter.init (ref args);\n\n    Intl.textdomain (Config.GETTEXT_PACKAGE);\n    Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.LOCALE_DIR);\n    recentmgr = (RecentManager) GLib.Object.new (typeof(RecentManager),\n            filename: Path.build_path (Path.DIR_SEPARATOR_S,\n                                       Environment.get_user_cache_dir(),\n                                       \"valama\",\n                                       \"recent_projects.xml\"));\n    load_locales();\n\n    settings = new ValamaSettings ();\n\n    /* Command line parsing. */\n    /* Copied from Yorba application. */\n    unowned string[] a = args;\n    Gtk.init (ref a);\n    /*\n     * Sanitize the command line arguments. Gtk's init function will leave\n     * null elements in the array, which then causes OptionContext to crash.\n     * See ticket: https://bugzilla.gnome.org/show_bug.cgi?id=674837\n     */\n    string[] fixed_args = new string[0];\n    for (int i = 0; i < args.length; ++i)\n        if (args[i] != null)\n            fixed_args += args[i];\n    args = fixed_args;\n\n    int ret = Args.parse (a);\n    if (ret > 0)\n        return ret;\n    else if (ret < 0)\n        return 0;\n\n    if (Args.debuglevel >= 1)\n        Guanako.debug = true;\n\n    Guanako.init();\n\n    if (Args.projectfiles.length > 0)\n        try {\n            project = new ValamaProject (Args.projectfiles[0], Args.syntaxfile);\n        } catch (LoadingError e) {\n            errmsg (_(\"Couldn't load Valama project: %s\\n\"), e.message);\n            project = null;\n        }\n\n    load_icons();\n\n    gtk_app = new Valama ();\n    return gtk_app.run();\n}\n\nstatic bool load_locales (bool reload = false) {\n    if (locales == null)\n        locales = new Gee.ArrayList<string>();\n    else if (reload)\n        locales.clear();\n    else\n        return false;\n\n    foreach (var lang in Intl.get_language_names())\n        locales.add (lang);\n\n    return true;\n}\n\nstatic Gee.BidirList<string> get_locales() {\n    if (locales == null)\n        return new Gee.ArrayList<string>().read_only_view;\n    return locales.read_only_view;\n}\n\nstatic Gee.BidirSortedMap<string, BuildSystemTemplate> get_buildsystems() {\n    if (buildsystems == null)\n        return new Gee.TreeMap<string, BuildSystemTemplate>().read_only_view;\n    return buildsystems.read_only_view;\n}\n\nstatic Gee.BidirSortedMap<string, ProjectTemplate> get_templates() {\n    if (templates == null)\n        return new Gee.TreeMap<string, ProjectTemplate>().read_only_view;\n    return templates.read_only_view;\n}\n\nstatic bool quit_valama() {\n    int sx, sy;\n    window_main.get_size (out sx, out sy);\n    settings.window_size_x = sx;\n    settings.window_size_y = sy;\n\n    if (project != null)\n        if (!project.close())\n            return false;\n    if (widget_main != null)\n        widget_main.close();\n    window_main.destroy();\n    gtk_app.quit();\n    return true;\n}\n\npublic class Valama : Gtk.Application {\n    public Valama () {\n        Object (application_id: \"app.valama\", flags: GLib.ApplicationFlags.NON_UNIQUE);\n    }\n\n    public override void activate () {\n        window_main = new ApplicationWindow(gtk_app);\n        window_main.set_size_request (400, 300);\n        window_main_header = new HeaderBar();\n        window_main_header.title = _(\"Valama\");\n        window_main_header.show_close_button = true;\n        window_main_header.show_all();\n        window_main.set_titlebar (window_main_header);\n\n        // Set background color\n        //var style = window_main.get_style_context();\n        //window_main.override_background_color (StateFlags.NORMAL, style.get_background_color(StateFlags.INSENSITIVE));\n\n        window_main.hide_titlebar_when_maximized = true;\n        window_main.set_default_size (settings.window_size_x, settings.window_size_y);\n\n        window_main.delete_event.connect (()=>{\n            return !quit_valama();\n        });\n\n        window_main.show();\n        vscreen = new WelcomeScreen.WelcomeScreen();\n        vscreen.project_loaded.connect ((project) => {\n            window_main.remove (vscreen);\n            show_main_screen (project);\n        });\n        if (project != null)\n            show_main_screen (project);\n        else\n            window_main.add (vscreen);\n    }\n}\n\nstatic void show_main_screen (ValamaProject load_project) {\n    project = load_project;\n    widget_main = new MainWidget();\n    widget_main.init();\n    window_main_header.pack_start(widget_main.tbox_left);\n    window_main_header.pack_end (widget_main.settings);\n    window_main_header.pack_end (widget_main.views);\n    window_main_header.pack_end(widget_main.tbox_right);\n    window_main.add (widget_main);\n    window_main.add_accel_group (widget_main.accel_group);\n\n    widget_main.request_close.connect (() => {\n        widget_main.close();\n        window_main_header.remove (widget_main.tbox_right);\n        window_main_header.remove (widget_main.views);\n        window_main_header.remove (widget_main.settings);\n        window_main_header.remove (widget_main.tbox_left);\n        window_main.remove (widget_main);\n        project = null;\n        window_main.add (vscreen);\n        widget_main = null;\n    });\n\n    /* Open default source files. */\n    var focus = true;\n    foreach (var file in project.files_opened) {\n        on_file_selected (file, focus);\n        focus = false;\n    }\n\n    /* Application signals. */\n    source_viewer.init();\n}\n\nstatic void load_icons() {\n    map_icons = new Gee.HashMap<string, Gdk.Pixbuf>();\n\n    var imagedir = File.new_for_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                       Config.PIXMAP_DIR));\n    if (!imagedir.query_exists()) {\n        warning_msg (_(\"Pixmap directory does not exist. No application icons can be used.\\n\"));\n        return;\n    }\n    var type_regex = /^element-[a-zA-Z_-]+-16\\.png$/;\n\n    try {\n        var enumerator = imagedir.enumerate_children (\"standard::*\", FileQueryInfoFlags.NONE, null);\n        FileInfo? info = null;\n        while ((info = enumerator.next_file()) != null) {\n            if (info.get_file_type() == FileType.DIRECTORY)\n                continue;\n            if (type_regex.match (info.get_name()))\n                try {\n                        var pixmappath = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                          Config.PIXMAP_DIR,\n                                                          info.get_name());\n                        map_icons[info.get_name()] = new Gdk.Pixbuf.from_file (pixmappath);\n                        debug_msg_level (3, _(\"Load pixmap: %s\\n\"), pixmappath);\n                } catch (Gdk.PixbufError e) {\n                    errmsg (_(\"Could not load pixmap: %s\\n\"), e.message);\n                } catch (GLib.FileError e) {\n                    errmsg (_(\"Could not open pixmaps file: %s\\n\"), e.message);\n                } catch (GLib.Error e) {\n                    errmsg (_(\"Pixmap loading failed: %s\\n\"), e.message);\n                }\n        }\n    } catch (GLib.Error e) {\n        warning_msg (_(\"Could not list or iterate through directory content of '%s': %s\\n\"),\n                     imagedir.get_path(), e.message);\n    }\n}\n\nstatic string? get_symbol_type_name (Symbol symbol) {\n    if (symbol is Class)        return \"class\";\n    if (symbol is Constant)     return \"constant\";\n    if (symbol is Delegate)     return \"delegate\";\n    if (symbol is Enum)         return \"enum\";\n    if (symbol is Vala.EnumValue) return \"enum_value\";\n    if (symbol is ErrorCode)    return \"error_code\";\n    if (symbol is ErrorDomain)  return \"error_domain\";\n    if (symbol is Variable)     return \"field\";\n    if (symbol is Interface)    return \"interface\";\n    if (symbol is Method)       return \"method\";\n    if (symbol is Namespace)    return \"namespace\";\n    if (symbol is Property)     return \"property\";\n    if (symbol is Vala.Signal)  return \"signal\";\n    if (symbol is Struct)       return \"struct\";\n    return null;\n}\n\nstatic Gdk.Pixbuf? get_pixbuf_for_symbol (Symbol symbol) {\n    var complete_typename = \"element-\" + get_symbol_type_name(symbol);\n\n    if (!(symbol is Vala.Signal))\n        switch (symbol.access) {\n            case SymbolAccessibility.INTERNAL:  //TODO: Add internal icons\n            case SymbolAccessibility.PRIVATE:\n                complete_typename += \"-private\";\n                break;\n            case SymbolAccessibility.PUBLIC:\n                if (!(symbol is Namespace))\n                    complete_typename += \"-public\";\n                break;\n            case SymbolAccessibility.PROTECTED:\n                if (!(symbol is Field))\n                    complete_typename += \"-protected\";\n                break;\n        }\n\n    complete_typename += \"-16.png\";\n    if (map_icons.has_key (complete_typename))\n        return map_icons[complete_typename];\n    return null;\n}\n\nstatic void create_new_file() {\n    var filename = ui_create_file_dialog (null, \"vala\");\n    if (filename != null) {\n        project.add_source_file (filename);\n        var view = project.open_new_buffer (\"\", filename);\n        if (view != null)\n            source_viewer.add_srcitem (view, filename);\n        source_viewer.focus_src (filename);\n    }\n}\n\nstatic void undo_change() {\n    var srcbuf = source_viewer.current_srcbuffer;\n    var manager = srcbuf.get_undo_manager();\n    manager.undo();\n}\n\nstatic void redo_change() {\n    var srcbuf = source_viewer.current_srcbuffer;\n    var manager = srcbuf.get_undo_manager();\n    manager.redo();\n}\n\n//NOTE: Disabled due to #4.\n// static void on_auto_indent_button_clicked() {\n//     string indented = Guanako.auto_indent_buffer (project.guanako_project, current_source_file);\n//     current_source_file.content = indented;\n//     source_viewer.current_srcbuffer.text = indented;\n// }\n\n/**\n * Load file and change focus.\n *\n * @param filename Name of file.\n * @param focus `true` to focus item.\n * @return Return `true` on success else `false`.\n */\nstatic bool on_file_selected (string filename, bool focus = true) {\n    if (source_viewer.current_srcfocus == filename ||\n            (!focus && source_viewer.get_sourceview_by_file (filename) != null))\n        return true;\n    if (!FileUtils.test (filename, FileTest.EXISTS))\n        return false;\n    if (filename.has_suffix (\".glade\") || filename.has_suffix (\".ui\"))\n    {\n        wdg_glade_viewer.load (filename);\n        return true;\n    }\n    string txt = \"\";\n    try {\n        FileUtils.get_contents (filename, out txt);\n        var view = project.open_new_buffer (txt, filename);\n        if (view != null)\n            source_viewer.add_srcitem (view, filename);\n        if (focus)\n            source_viewer.focus_src (filename);\n        source_viewer.jump_to_position (filename, 0, 0, true, focus);\n        return true;\n    } catch (GLib.FileError e) {\n        errmsg (_(\"Could not load file: %s\\n\"), e.message);\n        return false;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/project/build_project.vala",
    "content": "/*\n * src/project/build_project.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Guanako;\nusing Gee;\n\npublic class ProjectBuilder : Object {\n    public bool app_running { get; private set; }\n\n    private bool project_needs_compile = false;\n    private bool initialized = false;\n\n    public signal void build_started (bool clear);\n    public signal void build_finished (bool success);\n    public signal void build_progress (int percent);\n    public signal void build_output (string output);\n\n    public signal void app_output (string output);\n\n\n    public ProjectBuilder() {\n        project.buffer_changed.connect ((has_changes) => {\n            if (has_changes)\n                project_needs_compile = true;\n        });\n        project.notify[\"idemode\"].connect (() => {\n            project_needs_compile = true;\n        });\n        init();\n    }\n\n    public void request_compile() {\n        project_needs_compile = true;\n    }\n\n    private bool init() {\n        if (initialized)\n            return true;\n        if (project.builder == null)\n            return false;\n        project.builder.build_output.connect ((output) => {\n            build_output (output);\n        });\n        project.builder.build_progress.connect ((percent) => {\n            build_progress (percent);\n        });\n        project.builder.app_output.connect ((output) => {\n            app_output (output);\n        });\n        project.builder.notify[\"ps\"].connect (() => {\n            if (project.builder.ps != null) {\n                build_output (\"--------------------------------------------\\n\");\n                build_output (_(\"Build command received signal: %s\\n\").printf (\n                            project.builder.ps.to_string()));\n                build_output (\"--------------------------------------------\\n\");\n            }\n        });\n        initialized = true;\n        return true;\n    }\n\n    /**\n     * Build project.\n     *\n     * @return Return `true` on success else `false`.\n     */\n    public bool build_project (bool clean = false, bool tests = false,\n                                bool distclean = false, bool cont = true,\n                                bool clear = true) {\n        build_started (clear);\n\n        if (!init()) {\n            build_finished(false);\n            return false;\n        }\n\n        try {\n            int? exit_status;\n            if (!project.builder.initialize (out exit_status)) {\n                warning_msg (_(\"'Initialization' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            }\n            if (distclean && !project.builder.distclean (out exit_status)) {\n                warning_msg (_(\"'Distclean' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            } else if (clean && !project.builder.clean (out exit_status)) {\n                warning_msg (_(\"'Clean' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            }\n            if (cont) {\n                if (project.builder.configure (out exit_status)) {\n                    if (project.builder.build (out exit_status)) {\n                        project_needs_compile = false;\n                        if (tests && !project.builder.runtests (out exit_status)) {\n                            warning_msg (_(\"'Tests' failed with exit status: %d\\n\"), (int) exit_status);\n                            build_finished (false);\n                            return false;\n                        }\n                    } else {\n                        warning_msg (_(\"'Build' failed with exit status: %d\\n\"), (int) exit_status);\n                        build_finished (false);\n                        return false;\n                    }\n                } else {\n                    warning_msg (_(\"'Configure' failed with exit status: %d\\n\"), (int) exit_status);\n                    build_finished (false);\n                    return false;\n                }\n            }\n        } catch (BuildError.INITIALIZATION_FAILED e) {\n            warning_msg (_(\"'%s' initialization failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        } catch (BuildError.CLEAN_FAILED e) {\n            warning_msg (_(\"'%s' cleaning failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        } catch (BuildError.CONFIGURATION_FAILED e) {\n            warning_msg (_(\"'%s' configuration failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        } catch (BuildError.BUILD_FAILED e) {\n            // TRANSLATORS:\n            // E.g. \"CMake build failed: some error\" or \"Autotools build failed: some error\"\n            warning_msg (_(\"'%s' build failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        } catch (BuildError.TEST_FAILED e) {\n            warning_msg (_(\"'%s' tests failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        }\n        build_finished (true);\n        return true;\n    }\n\n    /**\n     * Clean up project build system files.\n     *\n     * @return `true` on success.\n     */\n    public bool clean_project (bool clear = true) {\n        build_started (clear);\n        if (!init()) {\n            build_finished(false);\n            return false;\n        }\n        try {\n            int? exit_status;\n            if (!project.builder.initialize (out exit_status)) {\n                warning_msg (_(\"'Initialization' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            }\n            stdout.printf (\"try to clean\\n\");\n            if (!project.builder.clean (out exit_status)) {\n                warning_msg (_(\"'Distclean' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            }\n        } catch (BuildError.INITIALIZATION_FAILED e) {\n            warning_msg (_(\"'%s' initialization failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        } catch (BuildError.CLEAN_FAILED e) {\n            warning_msg (_(\"'%s' cleaning failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        }\n        build_finished (true);\n        return true;\n    }\n\n    /**\n     * Clean up all project build system files.\n     *\n     * @return `true` on success.\n     */\n    public bool distclean_project (bool clear = true) {\n        build_started (clear);\n        if (!init()) {\n            build_finished(false);\n            return false;\n        }\n        try {\n            int? exit_status;\n            if (!project.builder.initialize (out exit_status)) {\n                warning_msg (_(\"'Initialization' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            }\n            if (!project.builder.distclean (out exit_status)) {\n                warning_msg (_(\"'Distclean' failed with exit status: %d\\n\"), (int) exit_status);\n                build_finished (false);\n                return false;\n            }\n        } catch (BuildError.INITIALIZATION_FAILED e) {\n            warning_msg (_(\"'%s' initialization failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        } catch (BuildError.CLEAN_FAILED e) {\n            warning_msg (_(\"'%s' cleaning failed: %s\\n\"), project.builder.get_name(), e.message);\n            build_finished (false);\n            return false;\n        }\n        build_finished (true);\n        return true;\n    }\n\n    /**\n     * Launch application (and build if necessary).\n     */\n    public void launch (string[] cmdparams = {}) {\n        if (app_running) {\n            warning_msg (_(\"Application still running. Quit it manually.\\n\"));\n            return;\n        }\n\n        if (!project_needs_compile || build_project())\n            internal_launch (cmdparams);\n    }\n\n    private void internal_launch (string[] cmdparams = {}) {\n        if (!init())\n            return;\n\n        project.builder.notify[\"ps\"].connect (() => {\n            if (project.builder.ps != null) {\n                app_output (\"--------------------------------------------\\n\");\n                app_output (_(\"Application received signal: %s\\n\").printf (\n                            project.builder.ps.to_string()));\n                app_output (\"--------------------------------------------\\n\");\n            }\n        });\n\n        try {\n            app_running = true;\n            int? exit_status;\n            project.builder.launch (cmdparams, out exit_status);\n            if (exit_status != null) {\n                app_output (\"--------------------------------------------\\n\");\n                /*\n                 * Cast exit_status explicitly to int otherwise printf would\n                 * give use some garbage.\n                 */\n                app_output (_(\"Application terminated with exit status '%d'.\\n\").printf (\n                                                                    (int) exit_status));\n                app_output (\"--------------------------------------------\\n\");\n            }\n            app_running = false;\n        } catch (BuildError e) {\n            warning_msg (_(\"Launching application failed: %s\\n\"), e.message);\n            return;\n        }\n    }\n\n    public void quit() {\n        if (!app_running)\n            return;\n        app_running = false;\n        project.builder.launch_kill();\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/project/package_management.vala",
    "content": "/*\n * src/project/package_management.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gee;\n\n/**\n * Version relations. Can be used e.g. for package or valac versions.\n */\npublic enum VersionRelation {\n    AFTER,  // >\n    SINCE,  // >=\n    UNTIL,  // <=\n    BEFORE, // <\n    ONLY,   // ==\n    EXCLUDE;// !=\n\n    public string? to_string() {\n        switch (this) {\n            //TODO: Check if and where translation is needed. See also\n            //      create_project.vala for gettext comments.\n            case AFTER:\n                // return _(\"after\");\n                return \"after\";\n            case SINCE:\n                // return _(\"since\");\n                return \"since\";\n            case UNTIL:\n                // return _(\"until\");\n                return \"until\";\n            case BEFORE:\n                // return _(\"before\");\n                return \"before\";\n            case ONLY:\n                // return _(\"only\");\n                return \"only\";\n            case EXCLUDE:\n                // return _(\"exclude\");\n                return \"exclude\";\n            default:\n                error_msg (_(\"Could not convert '%s' to string: %u\\n\"),\n                           \"VersionRelation\", this);\n                return null;\n        }\n    }\n\n    public static string? to_string_symbol (VersionRelation rel, bool err = true) {\n        switch (rel) {\n            case AFTER:\n                return \">\";\n            case SINCE:\n                return \">=\";\n            case UNTIL:\n                return \"<=\";\n            case BEFORE:\n                return \"<\";\n            case ONLY:\n                return \"==\";\n            case EXCLUDE:\n                return \"!=\";\n            default:\n                if (err)\n                    error_msg (_(\"Could not convert '%s' to string: %u\\n\"),\n                               \"VersionRelation\", rel);\n                return null;\n        }\n    }\n\n    public static VersionRelation? name_to_rel (string name, bool err = true) {\n        switch (name) {\n            case \"after\":\n                return AFTER;\n            case \"since\":\n                return SINCE;\n            case \"until\":\n                return UNTIL;\n            case \"less\":\n            case \"before\":\n                return BEFORE;\n            case \"only\":\n                return ONLY;\n            case \"not\":\n            case \"except\":\n            case \"exclude\":\n                return EXCLUDE;\n            default:\n                if (err)\n                    error_msg (_(\"Could not convert '%s' to %s.\\n\"),\n                               name, \"VersionRelation\");\n                return null;\n        }\n    }\n\n    public static VersionRelation? symbol_to_rel (string symbol) {\n        switch (symbol) {\n            case \">\":\n                return AFTER;\n            case \">=\":\n                return SINCE;\n            case \"<=\":\n                return UNTIL;\n            case \"<\":\n                return BEFORE;\n            case \"==\":\n                return ONLY;\n            case \"!=\":\n                return EXCLUDE;\n            default:\n                error_msg (_(\"Could not convert '%s' to %s.\\n\"),\n                           symbol, \"VersionRelation\");\n                return null;\n        }\n    }\n}\n\n/**\n * Vala package alternatives.\n */\npublic class PkgChoice {\n    /**\n     * Indicate if all packages should go to build system package list.\n     */\n    //TODO: Do we need this?\n    public bool all = false;\n    /**\n     * Ordered list of packages. Packages in the front have higher\n     * priority.\n     */\n    public Gee.ArrayList<PackageInfo?> packages { get; private set; }\n    /**\n     * Optional description.\n     */\n    public string? description = null;\n\n    public PkgChoice() {\n        packages = new Gee.ArrayList<PackageInfo?>();\n    }\n\n    /**\n     * Automatically add {@link PkgChoice} reference to each\n     * {@link PackageInfo} object.\n     *\n     * @param pkg Package to add to package choices list.\n     */\n    public inline void add_package (PackageInfo pkg) {\n        pkg.choice = this;\n        packages.add (pkg);\n    }\n\n    /**\n     * Remove {@link PackageInfo} object from choices list.\n     *\n     * @param pkg Package choice.\n     * @return `false` if choices list is empty after operation, else `true`.\n     */\n    public inline bool remove_package (PackageInfo pkg) {\n        packages.remove (pkg);\n        if (packages.size == 0)\n            return false;\n        return true;\n    }\n}\n\npublic class PkgCheck {\n    public Gee.ArrayList<PackageInfo> packages { get; private set; }\n    public Gee.ArrayList<PkgChoice> choices { get; private set; }\n    public string? custom_vapi { get; set; default = null; }\n    public string? define { get; set; default = null; }\n    public string? description { get; set; default = null; }\n\n    public PkgCheck() {\n        packages = new Gee.ArrayList<PackageInfo>();\n        choices = new Gee.ArrayList<PkgChoice>();\n    }\n\n    public inline void add_package (PackageInfo package) {\n        packages.add (package);\n    }\n\n    public inline void add_choice (PkgChoice choice) {\n        choices.add (choice);\n    }\n\n    public inline bool remove_package (PackageInfo package) {\n        packages.remove (package);\n        if (packages.size == 0)\n            return false;\n        return true;\n    }\n\n    public inline bool remove_choice (PkgChoice choice) {\n        choices.remove (choice);\n        if (choices.size == 0)\n            return false;\n        return true;\n    }\n\n    public bool check (ProjectFile project, ref string? custom_vapi, ref TreeSet<string> defines) {\n        set_vapi_define (project, ref custom_vapi, ref defines);\n\n        foreach (var choice in choices) {\n            bool found = false;\n            foreach (var pkg in choice.packages)\n                if (pkg.check_available (project)) {\n                    found = true;\n                    if (!process_pkg_check (project, ref custom_vapi, ref defines, pkg))\n                        return false;\n                    break;\n                }\n            if (!found)\n                return false;\n        }\n\n        foreach (var pkg in packages) {\n            if (!pkg.check_available (project))\n                return false;\n            if (!process_pkg_check (project, ref custom_vapi, ref defines, pkg))\n                return false;\n        }\n        return true;\n    }\n\n    private inline void set_vapi_define (ProjectFile project, ref string? custom_vapi, ref TreeSet<string> defines) {\n        if (this.custom_vapi != null)\n            //TODO: Support for multiple custom vapis? Could be done with\n            //      multiple checks/pkgs though.\n            custom_vapi = this.custom_vapi;\n        if (define != null)\n            defines.add (define);\n    }\n\n    private bool process_pkg_check (ProjectFile project, ref string? custom_vapi, ref TreeSet<string> defines, PackageInfo pkg) {\n        set_vapi_define (project, ref custom_vapi, ref defines);\n        /*\n         *NOTE: Currently extrachecks are optional and if no check at all\n         * succeeds it won't result to failure.\n         */\n        // bool found = true;\n        if (pkg.extrachecks != null) {\n            // found = false;\n            foreach (var check in pkg.extrachecks)\n                if (check.check (project, ref custom_vapi, ref defines)) {\n                    // found = true;\n                    break;\n                }\n        }\n        // if (!found)\n        //     return false;\n        return true;\n    }\n\n    public string to_string() {\n        var strb = new StringBuilder();\n        for (int i = 0;  i < packages.size; ++i) {\n            if (i != 0)\n                strb.append (\", \");\n            strb.append (packages[i].to_string());\n        }\n        if (custom_vapi != null || define != null || description != null) {\n            var start = false;\n            if (packages.size > 0)\n                strb.append (\" - \");\n            if (custom_vapi != null) {\n                if (!start)\n                    start = true;\n                else\n                    strb.append (\" \");\n                strb.append (_(\"vapi: \") + custom_vapi);\n            }\n            if (define != null) {\n                if (!start)\n                    start = true;\n                else\n                    strb.append (\", \");\n                strb.append (_(\"define: \") + define);\n            }\n            if (description != null) {\n                if (!start)\n                    start = true;\n                else\n                    strb.append (\" \");\n                strb.append (@\"($description)\");\n            }\n        }\n        return strb.str;\n    }\n}\n\n/**\n * Vala package information.\n */\npublic class PackageInfo {\n    /**\n     * Reference to {@link PkgChoice} if any.\n     *\n     * Do not modify this value manually. It will result in undefined behaviour.\n     */\n    public virtual PkgChoice? choice { get; set; default = null; }\n    /**\n     * Version relation.\n     */\n    public virtual VersionRelation? rel { get; set; default = null; }\n    /**\n     * Package name.\n     */\n    public virtual string name { get; set; }\n    /**\n     * Version (meaning differs with {@link rel}).\n     */\n    public virtual string? version { get; set; default = null; }\n    /**\n     * Currently available version on system.\n     */\n    public virtual string? current_version { get; set; default = null; }\n    /**\n     * Custom vapi (path) for this package.\n     */\n    public virtual string? custom_vapi { get; set; default = null; }\n    /**\n     * If `true` save custom vapi. Disable if vapi is enabled by extracheck.\n     */\n    public bool save_vapi { get; set; default = true; }\n    /**\n     * Disable checking of package dependencies.\n     */\n    public virtual bool? nodeps { get; set; default = null; }\n    /**\n     * Define related to package.\n     */\n    public virtual string? define { get; set; default = null; }\n    /**\n     * Ordered list of additional package relation checks.\n     *\n     * Also package relations with different packages. Helps to use custom\n     * vapis only for specific versions and set defines.\n     */\n    public virtual Gee.ArrayList<PkgCheck>? extrachecks { get; set; default = null; }\n\n    /**\n     * Test if package is available.\n     *\n     * Use pkg-config to check version. If no .pc file is available always\n     * true.\n     *\n     * @param project Project to get basepath for relative paths.\n     * @param recheck If `true` don't use cached version.\n     *\n     * @return `true` if available else `false`.\n     */\n    public bool check_available (ProjectFile project, bool recheck = true) {\n        if (version == null)\n            return true;\n\n        string? vapi = (custom_vapi == null) ? Guanako.get_vapi_path (name)\n                                             : project.get_absolute_path (custom_vapi);\n        if (vapi == null || !FileUtils.test (vapi, FileTest.EXISTS)) {\n            debug_msg_level (2, _(\"Vapi not found for %s: %s\\n\"), name, vapi);\n            return false;\n        }\n\n        if (current_version == null || recheck) {\n            string? curversion;\n            if (!package_exists (name, out curversion)) {\n                debug_msg (_(\"Could not find pkg-config file for '%s'. Assume package exists.\\n\"), name);\n                return true;\n            } else {\n                current_version = curversion;\n                if (curversion == null)\n                    return false;\n            }\n        }\n\n        bool ret;\n        switch (rel) {\n            case VersionRelation.AFTER:\n                ret = comp_version (current_version, version) > 0;\n                break;\n            case VersionRelation.SINCE:\n                ret = comp_version (current_version, version) >= 0;\n                break;\n            case VersionRelation.BEFORE:\n                ret = comp_version (current_version, version) < 0;\n                break;\n            case VersionRelation.UNTIL:\n                ret = comp_version (current_version, version) <= 0;\n                break;\n            case VersionRelation.EXCLUDE:\n                ret = comp_version (current_version, version) != 0;\n                break;\n            case VersionRelation.ONLY:\n                ret = comp_version (current_version, version) == 0;\n                break;\n            default: // null\n                ret = comp_version (current_version, version) >= 0;\n                break;\n        }\n        if (ret)\n            return true;\n        else {\n            debug_msg_level (2, _(\"Incompatible version for package '%s' %s %s found: %s\\n\"),\n                       name,\n                       (rel != null) ? VersionRelation.to_string_symbol (rel)\n                                     : \">=\",\n                       version,\n                       current_version);\n            return false;\n        }\n    }\n\n    /**\n     * Convert class object to string.\n     */\n    public string to_string() {\n        var strb = new StringBuilder (name);\n        strb.append (to_string_version());\n        return strb.str;\n    }\n\n    public string to_string_full() {\n        var strb = new StringBuilder (name);\n        var need_space = false;\n        var need_close = false;\n\n        if (current_version != null) {\n            strb.append (current_version);\n            need_space = true;\n        }\n\n        if (need_space)\n            strb.append (\" \");\n        strb.append (to_string_version());\n        need_space = true;\n\n        if (define != null) {\n            need_close = true;\n            strb.append (\" {\");\n            strb.append (define);\n        }\n\n        if (custom_vapi != null) {\n            if (!need_close) {\n                strb.append (\" {\");\n                need_close = true;\n            } else\n                strb.append (\", \");\n            strb.append (custom_vapi);\n        }\n\n        if (need_close)\n            strb.append (\"}\");\n        return strb.str;\n    }\n\n    private string to_string_version() {\n        var strb = new StringBuilder();\n        if (rel != null) {\n            strb.append (@\" $(VersionRelation.to_string_symbol (rel)) \");\n            if (version != null)\n                strb.append (version);\n        } else if (version != null) {\n            strb.append (\" >= \");\n            strb.append (version);\n        }\n        return strb.str;\n    }\n\n    /**\n     * Compare {@link PackageInfo} objects.\n     *\n     * @param pkg1 First package.\n     * @param pkg2 Second package.\n     * @return Return > 0 if pkg1 > pkg2, < 0 if pkg1 < pkg2 or 0 if pkg1 == pkg2.\n     */\n    public static int compare_func (PackageInfo pkg1, PackageInfo pkg2) {\n        int namerel = strcmp (pkg1.name, pkg2.name);\n        if (namerel != 0)\n            return namerel;\n\n        int verrel = comp_version (pkg1.version, pkg2.version);\n        if (verrel != 0)\n            return verrel;\n\n        if (pkg1.rel != null && pkg2.rel != null) {\n            int relrel = pkg1.rel - pkg2.rel;\n            if (relrel != 0)\n                return relrel;\n        } else if (pkg1.rel != null)\n            return 1;\n        else if (pkg2.rel != null)\n            return -1;\n\n        return 0;\n    }\n\n    public inline static bool compare_data_func (PackageInfo pkg1, PackageInfo pkg2) {\n        return (compare_func (pkg1, pkg2) == 0);\n    }\n}\n\n\npublic static bool package_exists (string package_name,\n                                   out string? package_version = null) {\n    var pc = @\"pkg-config --modversion $package_name\";\n    int exit_status;\n    package_version = null;\n\n    try {\n        string err;  // don't print error to console output\n        string? pkg_ver;\n        Process.spawn_command_line_sync (pc, out pkg_ver, out err, out exit_status);\n        if (pkg_ver != null)\n            package_version = pkg_ver.strip();\n        return (0 == exit_status);\n    } catch (SpawnError e) {\n        warning_msg (_(\"Could not spawn pkg-config package existence check: %s\\n\"), e.message);\n        return false;\n    }\n}\n\n\npublic static bool package_flags (string package_name, out string? package_flags = null) {\n    var pc = @\"pkg-config --cflags --libs $package_name\";\n    int exit_status;\n    package_flags = null;\n\n    try {\n        string err;\n        Process.spawn_command_line_sync (pc, out package_flags, out err, out exit_status);\n        return (0 == exit_status);\n    } catch (SpawnError e) {\n        warning_msg (_(\"Could not spawn pkg-config process to get package flags: %s\\n\"), e.message);\n        return false;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/project/project.vala",
    "content": "/*\n * src/project/project.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Vala;\nusing GLib;\nusing Gee;\nusing Gtk;\nusing Pango;\nusing Xml;\n\n/**\n * IDE modes on which plug-ins can decide how to do some tasks.\n */\n[Flags]\npublic enum IdeModes {\n    DEBUG,\n    RELEASE;\n\n    /**\n     * Number of modes.\n     */\n    const int size = 2;\n\n    /**\n     * Convert mode to string.\n     *\n     * @return Return associated string (locale dependent) or null.\n     */\n    public string? to_string() {\n        switch (this) {\n            case DEBUG:\n                return _(\"Debug\");\n            case RELEASE:\n                return _(\"Release\");\n            default:\n                error_msg (_(\"Could not convert '%s' to string: %u\\n\"),\n                           \"IdeModes\", this);\n                return null;\n        }\n    }\n\n    /**\n     * Convert mode to string.\n     *\n     * @param mode {@link IdeModes} mode.\n     * @return Return associated string (locale independent) or null.\n     */\n    public static string? to_string_int (IdeModes mode) {\n        switch (mode) {\n            case DEBUG:\n                return \"Debug\";\n            case RELEASE:\n                return \"Release\";\n            default:\n                error_msg (_(\"Could not convert '%s' to string: %u\\n\"),\n                           \"IdeModes\", mode);\n                return null;\n        }\n    }\n\n    /**\n     * Convert string to mode.\n     *\n     * @param modename Name of mode (locale independent).\n     */\n    public static IdeModes? from_string (string modename) {\n        switch (modename) {\n            case \"Debug\":\n                return DEBUG;\n            case \"Release\":\n                return RELEASE;\n            default:\n                error_msg (_(\"Could not convert '%s' to '%s'.\\n\"),\n                           modename, \"IdeModes\");\n                return null;\n        }\n    }\n\n    /**\n     * Convert int to {@link IdeModes}.\n     *\n     * @param num Integer number.\n     * @return Return corresponding mode or {@link IdeModes.DEBUG}.\n     */\n    public static IdeModes int_to_mode (int num) {\n        int ret = 1;\n        for (int i = 0; i < num; ++i)\n            ret *= 2;\n        return (IdeModes) ret;\n    }\n\n    /**\n     * Convert {@link IdeModes} to int.\n     */\n    public static int to_int (IdeModes mode) {\n        int ret = -1;\n        int t = (int) mode;\n        do {\n            t >>= 1;\n            ++ret;\n        } while (t > 0);\n        return ret;\n    }\n\n    /**\n     * List of all enum values.\n     */\n    public static IdeModes[] values() {\n        var ret = new IdeModes[0];\n        for (int i = 0; i < size; ++i)\n            ret += IdeModes.int_to_mode (i);\n        return ret;\n    }\n}\n\n\n/**\n * Valama project application.\n */\npublic class ValamaProject : ProjectFile {\n    /**\n     * Attached Guanako project to provide code completion.\n     */\n    public Guanako.Project? guanako_project { get; private set; default = null; }\n\n    /**\n     * Attached build system.\n     */\n    public BuildSystem? builder { get; set; default = null; }\n\n    /**\n     * Identifier to provide context state to plug-ins.\n     */\n    public IdeModes idemode { get; set; default = IdeModes.DEBUG; }\n\n    /**\n     * Flag to show multiple files are added and an update on each new file\n     * is not necessary. Set this manually.\n     */\n    public bool add_multiple_files { get; set; default = false; }\n\n    /**\n     * Ordered list of all opened Buffers mapped with filenames.\n     */\n    //TODO: Do we need an __ordered__ list? Gtk has already focus handling.\n    private Gee.LinkedList<ViewMap?> vieworder;\n    /**\n     * Completion provider.\n     */\n    public GuanakoCompletion comp_provider { get; private set; }\n\n    /**\n     * All used defines in project.\n     *\n     * Use {@link set_define} or {@link unset_define} to add or remove define.\n     */\n    public TreeSet<string> defines { get; private set; }\n\n    /**\n     * List of available defines with file names where defines occur.\n     */\n    public TreeMap<string, TreeSet<string>> used_defines { get; private set; }\n\n    /**\n     * Checked but not enabled defines.\n     *\n     * Use {@link disable_define} or {@link enable_define} to disable or\n     * enable avaibility of defines.\n     */\n    public TreeSet<string> disabled_defines { get; private set; }\n\n    /**\n     * Emit signal when source file was added or removed.\n     */\n    public signal void source_files_changed();\n    /**\n     * Emit signal when user interface file was added or removed.\n     */\n    public signal void ui_files_changed();\n    /**\n     * Emit signal when build system file was added or removed.\n     */\n    public signal void buildsystem_files_changed();\n    /**\n     * Emit signal when data file was added or removed.\n     */\n    public signal void data_files_changed();\n    /**\n     * Emit signal when package was added or removed.\n     */\n    public signal void packages_changed();\n    /**\n     * Emit signal when define was added or removed.\n     *\n     * @param added `true` if define was added, `false` if removed.\n     * @param define Name of changed define.\n     */\n    public signal void defines_changed (bool added, string define);\n    /**\n     * Handler id for initial define update signal.\n     */\n    private ulong define_handler_id;\n    /**\n     * Emit to run update for changed defines.\n     */\n    private signal void defines_update();\n    /**\n     * Emit to set define (if found is `true`).\n     *\n     * NOTE: Currently don't disable defines to avoid (unnecessary) complete\n     * source file update.\n     *\n     * @param define Processed define.\n     * @param found `true` to set define (`false` to don't set it).\n     * @return `true` on success else `false`.\n     */\n    //TODO: Return value needed?\n    public signal bool define_set (string define, bool found = true);\n\n\n    /**\n     * Create {@link ValamaProject} and load it from project file.\n     *\n     * It is possible to fully load a partial loaded project with {@link init}.\n     *\n     * @param project_file Load project from this file.\n     * @param syntaxfile Load Guanako syntax definitions from this file.\n     * @param fully If `false` only load project file information.\n     * @param save_recent Update recent project files catalogue.\n     * @throws LoadingError Throw on error while loading project file.\n     */\n    internal ValamaProject.empty(string project_file) throws LoadingError\n    {\n        base.empty(project_file);\n        constructor_init (null, true, false);\n    } \n    \n    public ValamaProject (string project_file,\n                          string? syntaxfile = null,\n                          bool fully = true,\n                          bool save_recent = true) throws LoadingError {\n        try {\n            base (project_file);\n        } catch (LoadingError e) {\n            errmsg (_(\"Error loading project file '%s': %s\\n\"), project_file, e.message);\n            throw e;\n        }\n\n        constructor_init (syntaxfile, fully, save_recent);\n    }\n\n    /**\n     * Create {@link ValamaProject} and load it from project file.\n     *\n     * It is possible to fully load a partial loaded project with {@link init}.\n     *\n     * @param project_file_data Load project from data.\n     * @param syntaxfile Load Guanako syntax definitions from this file.\n     * @param fully If `false` only load project file information.\n     * @param save_recent Update recent project files catalogue.\n     * @throws LoadingError Throw on error while loading project file.\n     */\n    public ValamaProject.from_data (string project_file_data,\n                                    string? syntaxfile = null,\n                                    bool fully = true,\n                                    bool save_recent = true) throws LoadingError {\n        try {\n            base.from_data (project_file_data);\n        } catch (LoadingError e) {\n            errmsg (_(\"Error loading project file from data: %s\\n\"), e.message);\n            throw e;\n        }\n\n        constructor_init (syntaxfile, fully, save_recent);\n    }\n\n    private void constructor_init (string? syntaxfile, bool fully, bool save_recent) throws LoadingError {\n        add_builder (buildsystem, library);\n\n        if (fully)\n            try {                       //TODO: Allow changing glib version.\n                guanako_project = new Guanako.Project (syntaxfile, 2, 32);\n            } catch (GLib.IOError e) {\n                throw new LoadingError.COMPLETION_NOT_AVAILABLE (\n                                        _(\"Could not read syntax file: %s\\n\"), e.message);\n            } catch (GLib.Error e) {\n                throw new LoadingError.COMPLETION_NOT_AVAILABLE (\n                                        _(\"An error occurred while loading new Guanako project: %s\\n\"),\n                                        e.message);\n            }\n\n        defines = new TreeSet<string>();\n        used_defines = new TreeMap<string, TreeSet<string>>();\n        disabled_defines = new TreeSet<string>();\n\n        foreach (var pkg in packages.values)\n            add_package (pkg, true);\n        add_multiple_files = true;\n        foreach (var choice in package_choices) {\n            var pkg = get_choice (choice);\n            if (pkg != null)\n                add_package (pkg);\n            else {\n                warning_msg (_(\"Could not select a package from choice.\\n\"));\n                add_package (choice.packages[0]);\n            }\n        }\n        add_multiple_files = false;\n\n        if (fully)\n            init (syntaxfile, save_recent);\n    }\n\n    /**\n     * Fully load project or do nothing when already fully loaded.\n     *\n     * @param syntaxfile Load Guanako syntax definitions from this file.\n     * @param save_recent Update recent project files catalogue.\n     * @throws LoadingError Throw if Guanako completion fails to load.\n     */\n    public void init (string? syntaxfile = null, bool save_recent = true) throws LoadingError {\n        try {\n            load_meta();\n        } catch (LoadingError e) {\n            warning_msg (_(\"Could not load meta information: %s\\n\"), e.message);\n        }\n        if (guanako_project == null)\n            try {\n                guanako_project = new Guanako.Project (syntaxfile);\n            } catch (GLib.IOError e) {\n                throw new LoadingError.COMPLETION_NOT_AVAILABLE (\n                                        _(\"Could not read syntax file: %s\\n\"), e.message);\n            } catch (GLib.Error e) {\n                throw new LoadingError.COMPLETION_NOT_AVAILABLE (\n                                        _(\"An error occurred while loading new Guanako project: %s\\n\"),\n                                        e.message);\n            }\n\n        if (save_recent)\n            save_to_recent();\n        if (builder != null)\n            try {\n                builder.init (this);\n            } catch (BuildError e) {\n                bug_msg (_(\"Could not initialize build system: %s\\n\"), e.message);\n            }\n\n        generate_file_list (ref _source_dirs,\n                            ref _source_files,\n                            add_source_file);\n\n        generate_file_list (ref _ui_dirs,\n                            ref _ui_files,\n                            add_ui_file);\n\n        generate_file_list (ref _buildsystem_dirs,\n                            ref _buildsystem_files,\n                            add_buildsystem_file);\n\n        generate_file_list (ref _data_dirs,\n                            ref _data_files,\n                            add_data_file);\n\n        vieworder = new Gee.LinkedList<ViewMap?>();\n\n        var extrapkgs = new TreeSet<PackageInfo>();\n        var normpkgs = new TreeSet<string>();\n        var custompkgs = new TreeSet<string>();\n        foreach (var pkg in packages.values)\n            if ((pkg.custom_vapi != null) || (pkg.nodeps != null && pkg.nodeps))\n                extrapkgs.add (pkg);\n            else\n                normpkgs.add (pkg.name);\n\n        var missings = new TreeSet<string>();\n\n        foreach (var pkg in extrapkgs) {\n            if (pkg.custom_vapi != null) {\n                //NOTE: !pkg.nodeps results to error see #700985.\n                if (pkg.nodeps == null || pkg.nodeps == false) {\n                    var depsfile = Guanako.get_deps_path (\n                                    Path.get_basename (pkg.custom_vapi.substring (\n                                                       0,\n                                                       pkg.custom_vapi.length - 5)),\n                                    new string[] { Path.get_dirname (\n                                                        get_absolute_path (pkg.custom_vapi))\n                                                 });\n                    if (depsfile != null) {\n                        debug_msg (_(\"Dependency file found: %s\\n\"), depsfile);\n                        try {\n                            string contents;\n                            FileUtils.get_contents (depsfile, out contents);\n                            foreach (var pkgname in contents.split (\"\\n\")) {\n                                pkgname = pkgname.strip();\n                                if (pkgname != \"\" && !(pkgname in custompkgs))\n                                    normpkgs.add (pkgname);\n                            }\n                        } catch (FileError e) {\n                            warning_msg (_(\"Unable to read dependency file: %s\\n\"), e.message);\n                            break;\n                        }\n                    } else\n                        debug_msg (_(\"No dependency file (.deps) for package '%s' found.\\n\"),\n                                   pkg.name);\n                }\n                if (!search_file_in_guanako (pkg.custom_vapi) && guanako_project.add_source_file_by_name (get_absolute_path (pkg.custom_vapi), true) == null) {\n                    missings.add (pkg.custom_vapi);\n                    warning_msg (_(\"Could not add custom vapi for %s: %s\\n\"),\n                                 pkg.name, pkg.custom_vapi);\n                } else {\n                    normpkgs.remove (pkg.name);\n                    custompkgs.add (pkg.name);\n                }\n            } else if (pkg.nodeps != null && pkg.nodeps) {\n                var vapifile = guanako_project.get_context_vapi_path (pkg.name);\n                if (vapifile == null || (!search_file_in_guanako (vapifile) && guanako_project.add_source_file_by_name (vapifile, true) == null)) {\n                    missings.add (pkg.name);\n                    warning_msg (_(\"Could not add custom vapi for %s: %s\\n\"),\n                                 pkg.name, pkg.custom_vapi);\n                } else {\n                    normpkgs.remove (pkg.name);\n                    custompkgs.add (pkg.name);\n                }\n            } else\n                bug_msg (_(\"Unknown situation: %s\\n\"), \"project.vala - extrapkgs\");\n        }\n\n        var missing_packages = guanako_project.add_packages (normpkgs.to_array(), false);\n        foreach (var pkg in missing_packages)\n            missings.add (pkg);\n\n        foreach (var pkg in packages.values)\n            if (pkg.define != null && !(pkg.name in missings)) {\n                defines.add (pkg.define);\n                guanako_project.add_define (pkg.define);\n            }\n        guanako_project.commit_defines();\n\n        packages_changed();\n\n        if (missing_packages.length > 0)\n            ui_missing_packages_dialog (missing_packages);\n\n        /* Completion provider. */\n        this.comp_provider = new GuanakoCompletion();\n        this.comp_provider.priority = 1;\n        this.comp_provider.name = _(\"%s - Vala\").printf (project_name);\n        this.notify[\"project-name\"].connect (() => {\n            comp_provider.name = _(\"%s - Vala\").printf (project_name);\n        });\n\n        VoidDelegate? init_define_signals = null;\n        guanako_update_finished.connect (() => {\n            var used_defines_new = new TreeMap<string, TreeSet<string>>();\n            var mit = guanako_project.get_defines_used().map_iterator();\n            var new_defines = new TreeSet<string>();\n            while (mit.next())\n                foreach (var define in mit.get_value()) {\n                    if (define in used_defines_new.keys)\n                        used_defines_new[define].add (mit.get_key());\n                    else {\n                        var tset = new TreeSet<string>();\n                        tset.add (mit.get_key());\n                        used_defines_new[define] = tset;\n                    }\n                    if (!(define in defines))\n                        new_defines.add (define);\n                }\n            used_defines = used_defines_new;\n\n            if (init_define_signals == null) {\n                init_define_signals = () => {\n                    define_set.connect ((define, found) => {\n                        if (found) {\n                            if (set_define (define)) {\n                                defines_update();\n                                return true;\n                            }\n                        } /*else if (unset_define (define)) {\n                            defines_update();\n                            return true;\n                        }*/ else {\n                            unset_define (define);\n                            disabled_defines.add (define);\n                            return true;\n                        }\n                        return false;\n                    });\n                    defines_update.connect (() => {\n                        parsing = true;\n                        try {\n                            new Thread<void*>.try (_(\"Source file update\"), () => {\n                                guanako_update_started();\n                                guanako_project.update();\n                                Idle.add (() => {\n                                    guanako_update_finished();\n                                    parsing = false;\n                                    return false;\n                                });\n                                return null;\n                            });\n                        } catch (GLib.Error e) {\n                            errmsg (_(\"Could not create thread to update source files: %s\\n\"), e.message);\n                            parsing = false;\n                        }\n                    });\n                };\n\n                var initial_defines = new TreeSet<string>();\n                initial_defines.add_all (new_defines);\n                if (initial_defines.size > 0) {\n                    define_handler_id = define_set.connect ((define, found) => {\n                        var ret = initial_defines.remove (define);\n                        if (found)\n                            set_define (define);\n                        else\n                            disable_define (define);\n                        if (initial_defines.size == 0) {\n                            this.disconnect (define_handler_id);\n                            init_define_signals();\n                            defines_update();\n                        }\n                        return ret;\n                    });\n                    foreach (var define_new in new_defines)\n                        defines_changed (true, define_new);\n                } else\n                    init_define_signals();\n            } else {\n                var removals = new TreeSet<string>();\n                foreach (var define in defines)\n                    if (!(define in used_defines.keys))\n                        removals.add (define);\n                foreach (var define in removals) {\n                    defines.remove (define);\n                    defines_changed (false, define);\n                }\n\n                foreach (var define in new_defines)\n                    defines_changed (true, define);\n            }\n        });\n\n        parsing = true;\n        new Thread<void*> (_(\"Initial buffer update\"), () => {\n            guanako_project.init();\n            Idle.add (() => {\n                guanako_update_finished();\n                parsing = false;\n                return false;\n            });\n            return null;\n        });\n    }\n\n    private delegate void VoidDelegate();\n\n    private inline bool search_file_in_guanako (string filename) {\n        foreach (var file in guanako_project.get_source_files (true))\n            if (get_absolute_path (filename) == file.filename)\n                return true;\n        return false;\n    }\n\n    /**\n     * Update list of recent projects.\n     */\n    public inline void save_to_recent() {\n        debug_msg_level (3, _(\"Add project to recent manager: %s - %s\\n\"), project_name, project_file_path);\n        if (!recentmgr.add_full (Posix.realpath (project_file_path) ?? project_file_path,\n                                 RecentData() { display_name = project_name,\n                                                mime_type = \"application/octet-stream\",\n                                                app_name = \"Valama\",  //TODO: Translatable?\n                                                app_exec = \"valama %u\"}))\n            warning_msg (_(\"Could not add project to recent manager.\\n\"));\n    }\n\n    /**\n     * Add package to project. Remember to add it later to Guanako project and\n     * emit packages_changed signal.\n     *\n     * @param pkg Package to add.\n     * @param upgrade If `true` upgrade pkg with new values.\n     */\n    public void add_package (PackageInfo pkg, bool upgrade = false) {\n        var included = pkg.name in packages.keys;\n        if (!upgrade && included) {\n            debug_msg_level (2, _(\"Package '%s' already included. Skip it.\\n\"), pkg.name);\n            return;\n        }\n\n        var info = pkg.to_string_full();\n        if (pkg.choice != null)\n            // TRANSLATORS: Choice of different packages.\n            info += \" (%s)\".printf (_(\"choice\"));\n        debug_msg_level (2, _(\"Add package: %s\\n\"), info);\n        if (pkg.extrachecks != null) {\n            foreach (var check in pkg.extrachecks) {\n                string? custom_vapi = null;\n                var custom_defines = new TreeSet<string>();\n                if (check.check (this, ref custom_vapi, ref custom_defines)) {\n                    var strb = new StringBuilder();\n                    var space = false;\n                    if (custom_vapi != null) {\n                        pkg.custom_vapi = custom_vapi;\n                        pkg.save_vapi = false;\n                        strb.append (\"vapi: %s\".printf (custom_vapi));\n                        space = true;\n                    }\n                    if (space && custom_defines.size > 0)\n                        strb.append (\", \");\n                    if (custom_defines.size == 1)\n                        strb.append (_(\"define:\"));\n                    else if (custom_defines.size > 1)\n                        strb.append (_(\"defines:\"));\n                    foreach (var define in custom_defines) {\n                        defines.add (define);\n                        guanako_project.add_define (define);\n                        defines_changed (true, define);\n                        strb.append (@\" $define\");\n                    }\n                    if (strb.str != \"\")\n                        debug_msg_level (2, _(\"PkgCheck succeeded: %s\\n\"), strb.str);\n                    break;\n                }\n            }\n        }\n\n        if (!included)\n            packages[pkg.name] = pkg;\n    }\n\n    /**\n     * Add package to project by package name and update Guanako project.\n     *\n     * @param pkgs Packages to add.\n     * @return Not available packages or `null` if all packages were previously added.\n     */\n    public string[]? add_packages_by_names (string[] pkgs) {\n        var newpkgs = new string[0];\n        foreach(string pkg in pkgs) {\n            if (!(pkg in packages.keys)) {\n                var pkginfo = new PackageInfo();\n                pkginfo.name = pkg;\n                packages[pkg] = pkginfo;\n                newpkgs += pkg;\n                debug_msg_level (2, _(\"Add package: %s\\n\"), pkg);\n            } else\n                debug_msg_level (2, _(\"Add package: %s (already added)\\n\"), pkg);\n        }\n        if (newpkgs.length > 0) {\n            packages_changed();\n            return guanako_project.add_packages (newpkgs, true);\n        } else\n            return null;\n    }\n\n    /**\n     * Remove package from project. Remember to update Guanako project and\n     * emit packages_changed signal.\n     *\n     * @param pkg Package to remove.\n     * @return `false` if package not in project else `true`.\n     */\n    public bool remove_package (PackageInfo pkg) {\n        debug_msg_level (2, _(\"Remove package: %s\\n\"), pkg.to_string());\n        if (!packages.unset (pkg.name)) {\n            debug_msg (_(\"Package '%s' not in list, skip it.\\n\"), pkg.name);\n            return false;\n        }\n        if (pkg.choice != null && !pkg.choice.remove_package (pkg))\n            package_choices.remove (pkg.choice);\n        return true;\n    }\n\n    /**\n     * Remove package from project and update Guanako project.\n     *\n     * @param pkg Package name.\n     * @return `false` if package not in project else `true`.\n     */\n    public bool remove_package_by_name (string pkg) {\n        debug_msg_level (2, _(\"Remove package: %s\\n\"), pkg);\n        if (!(pkg in packages.keys)) {\n            debug_msg (_(\"Package '%s' not in list, skip it.\\n\"), pkg);\n            return false;\n        }\n\n        var pkginfo = packages[pkg];\n        if (pkginfo.choice != null && !pkginfo.choice.remove_package (pkginfo))\n            package_choices.remove (pkginfo.choice);\n        packages.unset (pkg);\n\n        guanako_project.remove_package (pkg);\n        packages_changed();\n        return true;\n    }\n\n    /**\n     * Get list of all used packages (not only manually added ones).\n     *\n     * @return Package list.\n     */\n    public inline Vala.List<string> get_all_packages() {\n        return guanako_project.get_context_packages();\n    }\n\n    /**\n     * Get list of all errors after Guanako update.\n     *\n     * @return Return error list.\n     */\n    public inline Gee.ArrayList<Guanako.Reporter.Error> get_errorlist() {\n        return guanako_project.get_errorlist();\n    }\n\n    /**\n     * Add source file and register with Guanako.\n     *\n     * @param filename Path to file.\n     * @param directory Add directory.\n     */\n    public void add_source_file (string? filename, bool directory = false) {\n        if (filename == null || (!directory &&\n                    !(filename.has_suffix (\".vala\") || filename.has_suffix (\".vapi\"))))\n            return;\n        var filename_abs = get_absolute_path (filename);\n\n        var f = File.new_for_path (filename_abs);\n        if (!f.query_exists()) {\n            if (!directory)\n                warning_msg (_(\"Source file does not exist: %s\\n\"), filename_abs);\n            else\n                warning_msg (_(\"Source directory does not exist: %s\\n\"), filename_abs);\n            return;\n        }\n\n        if (directory) {\n            source_dirs.add (filename);\n            source_files_changed();\n            return;\n        }\n\n        if (!filename.has_suffix(\".vapi\"))\n            msg (_(\"Found source file: %s\\n\"), filename_abs);\n\n        if (d_files.contains (filename_abs)) {\n            warning_msg (_(\"File already a user interface file. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (b_files.contains (filename_abs)) {\n            warning_msg (_(\"File already registered for build system. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (d_files.contains (filename_abs)) {\n            warning_msg (_(\"File already a data file. Skip it.\\n\"), filename_abs);\n            return;\n        }\n        if (!files.contains (filename_abs))\n            if (guanako_project.add_source_file_by_name (\n                                filename_abs, filename_abs.has_suffix (\".vapi\")) != null) {\n                files.add (filename_abs);\n                source_files_changed();\n            } else\n                warning_msg (_(\"Could not load Vala source file: %s\\n\"), filename_abs);\n        else\n            debug_msg (_(\"Skip already added file: %s\\n\"), filename_abs);\n    }\n\n    /**\n     * Remove source file from project and unlink from Guanako. Don't remove\n     * file from disk. Keep track to not include it with source directories\n     * next time.\n     *\n     * Close buffer manually.\n     *\n     * @param filename Path to file to unregister.\n     * @return `true` on success else `false` (e.g. if file was not found).\n     */\n    public bool remove_source_file (string? filename) {\n        var filename_abs = get_absolute_path (filename);\n        debug_msg (_(\"Remove source file: %s\\n\"), filename_abs);\n        if (!files.remove (filename_abs))\n            return false;\n        new Thread<void*> (_(\"Remove source file\"), () => {\n            source_files_changed();\n            guanako_project.remove_file (guanako_project.get_source_file_by_name (filename_abs));\n            return null;\n        });\n        return true;\n    }\n\n    /**\n     * Add file to user interface list.\n     *\n     * @param filename Path to file.\n     * @param directory Add directory.\n     */\n    public void add_ui_file (string? filename, bool directory = false) {\n        if (filename == null || (!directory &&\n                !(filename.has_suffix (\".ui\") || filename.has_suffix (\".glade\") ||\n                  filename.has_suffix (\".xml\"))))\n            return;\n        var filename_abs = get_absolute_path (filename);\n\n        var f = File.new_for_path (filename_abs);\n        if (!f.query_exists()) {\n            if (!directory)\n                warning_msg (_(\"User interface file does not exist: %s\\n\"), filename_abs);\n            else\n                warning_msg (_(\"User interface directory does not exist: %s\\n\"), filename_abs);\n            return;\n        }\n\n        if (directory) {\n            ui_dirs.add (filename);\n            ui_files_changed();\n            return;\n        }\n\n        msg (_(\"Found user interface file: %s\\n\"), filename_abs);\n        if (files.contains (filename_abs)) {\n            warning_msg (_(\"File already a source file. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (b_files.contains (filename_abs)) {\n            warning_msg (_(\"File already registered for build system. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (d_files.contains (filename_abs)) {\n            warning_msg (_(\"File already registered for build system. Skip it.\\n\"), filename_abs);\n            return;\n        }\n        if (!this.u_files.add (filename_abs))\n            debug_msg (_(\"Skip already added file: %s\\n\"), filename_abs);\n        else\n            ui_files_changed();\n    }\n\n    /**\n     * Remove user interface file from project. Close buffer manually.\n     *\n     * @param filename Path to file to unregister.\n     * @return `true` on success else `false` (e.g. if file was not found).\n     */\n    public bool remove_ui_file (string filename) {\n        var filename_abs = get_absolute_path (filename);\n        debug_msg (_(\"Remove user interface file: %s\\n\"), filename_abs);\n        if (!u_files.remove (filename_abs))\n            return false;\n        ui_files_changed();\n        return true;\n    }\n\n    /**\n     * Add file to build system list.\n     *\n     * @param filename Path to file.\n     * @param directory Add directory.\n     */\n    public void add_buildsystem_file (string? filename, bool directory = false) {\n        if (builder == null || filename == null || (!directory &&\n                    !builder.check_buildsystem_file (filename)))\n            return;\n        var filename_abs = get_absolute_path (filename);\n\n        var f = File.new_for_path (filename_abs);\n        if (!f.query_exists()) {\n            if (!directory)\n                warning_msg (_(\"Build system file does not exist: %s\\n\"), filename_abs);\n            else\n                warning_msg (_(\"Build system directory does not exist: %s\\n\"), filename_abs);\n            return;\n        }\n\n        if (directory) {\n            buildsystem_dirs.add (filename);\n            buildsystem_files_changed();\n            return;\n        }\n\n        msg (_(\"Found build system file: %s\\n\"), filename_abs);\n        if (files.contains (filename_abs)) {\n            warning_msg (_(\"File already a source file. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (u_files.contains (filename_abs)) {\n            warning_msg (_(\"File already a user interface file. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (d_files.contains (filename_abs)) {\n            warning_msg (_(\"File already a data file. Skip it.\\n\"), filename_abs);\n            return;\n        }\n        if (!this.b_files.add (filename_abs))\n            debug_msg (_(\"Skip already added file: %s\\n\"), filename_abs);\n        else\n            buildsystem_files_changed();\n    }\n\n    /**\n     * Remove build system file from project. Close buffer manually.\n     *\n     * @param filename Path to file to unregister.\n     * @return `true` on success else `false` (e.g. if file was not found).\n     */\n    public bool remove_buildsystem_file (string filename) {\n        var filename_abs = get_absolute_path (filename);\n        debug_msg (_(\"Remove build system file: %s\\n\"), filename_abs);\n        if (!b_files.remove (filename_abs))\n            return false;\n        buildsystem_files_changed();\n        return true;\n    }\n\n    /**\n     * Add file to extra file list.\n     *\n     * @param filename Path to file.\n     * @param directory Add directory.\n     */\n    public void add_data_file (string? filename, bool directory = false) {\n        if (filename == null)\n            return;\n        var filename_abs = get_absolute_path (filename);\n\n        var f = File.new_for_path (filename_abs);\n        if (!f.query_exists()) {\n            if (!directory)\n                warning_msg (_(\"Data file does not exist: %s\\n\"), filename_abs);\n            else\n                warning_msg (_(\"Data directory does not exist: %s\\n\"), filename_abs);\n            return;\n        }\n\n        if (directory) {\n            data_dirs.add (filename);\n            data_files_changed();\n            return;\n        }\n\n        msg (_(\"Found data file: %s\\n\"), filename_abs);\n        if (files.contains (filename_abs)) {\n            warning_msg (_(\"File already a source file. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (u_files.contains (filename_abs)) {\n            warning_msg (_(\"File already a user interface file. Skip it.\\n\"), filename_abs);\n            return;\n        } else if (b_files.contains (filename_abs)) {\n            warning_msg (_(\"File already registered for build system. Skip it.\\n\"), filename_abs);\n            return;\n        }\n        if (!this.d_files.add (filename_abs))\n            debug_msg (_(\"Skip already added file: %s\\n\"), filename_abs);\n        else\n            data_files_changed();\n    }\n\n    /**\n     * Remove data file from project. Close buffer manually.\n     *\n     * @param filename Path to file to unregister.\n     * @return `true` on success else `false` (e.g. if file was not found).\n     */\n    public bool remove_data_file (string filename) {\n        var filename_abs = get_absolute_path (filename);\n        debug_msg (_(\"Remove data file: %s\\n\"), filename_abs);\n        if (!d_files.remove (filename_abs))\n            return false;\n        data_files_changed();\n        return true;\n    }\n\n    /**\n     * Close buffer by file name.\n     *\n     * @param filename Name of file to close view object.\n     */\n    public void close_viewbuffer (string filename) {\n        ViewMap? vmap = null;\n        foreach (var map in vieworder) {\n            if (map.filename == get_absolute_path (filename)) {\n                vmap = map;\n                break;\n            }\n        }\n        if (vmap != null)\n            vieworder.remove (vmap);\n        else\n            // TRANSLATORS:\n            // Context: \"Could not close source view (mapping) for: myfile.vala\"\n            warning_msg (_(\"Could not close source view (mapping) for: %s\\n\"),\n                         filename);\n    }\n\n    /**\n     * Callback to perform action with valid file.\n     *\n     * @param filename Absolute path to existing file.\n     * @param directory Add directory (not used).\n     */\n    public delegate void FileCallback (string filename, bool directory = false);\n    /**\n     * Iterate over directories and files and fill list.\n     *\n     * Check for file existence.\n     *\n     * @param dirlist List of directories.\n     * @param filelist List of files.\n     * @param action Method to perform on each found file in directory or\n     *               file list.\n     * @param checkfile Check file existence.\n     * @param checkdir Check directory existence.\n     */\n    public void generate_file_list (ref TreeSet<string> dirlist,\n                                    ref TreeSet<string> filelist,\n                                    FileCallback? action = null,\n                                    bool checkfile = true,\n                                    bool checkdir = false) {\n        File directory;\n        FileEnumerator enumerator;\n        FileInfo file_info;\n\n        TreeSet<string> removals = null;\n        if (checkfile || checkdir)\n            removals = new TreeSet<string>();\n\n        foreach (var dir in dirlist) {\n            if (!FileUtils.test (dir, FileTest.IS_DIR)) {\n                if (checkdir) {\n                    warning_msg (_(\"No such directory: %s\\n\"), dir);\n                    removals.add (dir);\n                } else {\n                    debug_msg (_(\"No such directory: %s\\n\"), dir);\n                    continue;\n                }\n            }\n            try {\n                directory = File.new_for_path (dir);\n                enumerator = directory.enumerate_children (FileAttribute.STANDARD_NAME, 0);\n\n                while ((file_info = enumerator.next_file()) != null) {\n                    if (file_info.get_file_type() != FileType.REGULAR)  //TODO: Follow symlinks.\n                        continue;\n                    action (Path.build_path (Path.DIR_SEPARATOR_S,\n                                             dir,\n                                             file_info.get_name()));\n                }\n            } catch (GLib.Error e) {\n                errmsg (_(\"Could not open directory '%s': %s\\n\"), dir, e.message);\n                removals.add (dir);\n            }\n        }\n        if (checkdir) {\n            foreach (var dir in removals)\n                dirlist.remove (dir);\n            removals.clear();\n        }\n\n        foreach (var filename in filelist) {\n            var f = File.new_for_path (filename);\n            switch (f.query_file_type (FileQueryInfoFlags.NONE)) {\n                case FileType.REGULAR:\n                    action (filename);\n                    break;\n                default:\n                    if (checkfile) {\n                        warning_msg (_(\"No valid file: %s\\n\"), filename);\n                        removals.add (filename);\n                    } else\n                        debug_msg (_(\"No valid file: %s\\n\"), filename);\n                    break;\n            }\n        }\n        if (checkfile)\n            foreach (var file in removals)\n                filelist.remove (file);\n    }\n\n    private void save_meta() {\n        var path = Path.build_path (Path.DIR_SEPARATOR_S,\n                                    Environment.get_user_cache_dir(),\n                                    \"valama\",\n                                    \"project_meta.xml\");\n        debug_msg (_(\"Save project meta information: %s\\n\"), path);\n        var writer = new TextWriter.filename (path);\n        writer.set_indent (true);\n        writer.set_indent_string (\"    \");\n\n        //TODO: Meta file version.\n        writer.start_element (\"project-meta\");\n        //writer.write_attribute (\"version\", xXx);\n        writer.write_element (\"idemode\", IdeModes.to_string_int (idemode));\n        writer.end_element();\n    }\n\n    private void load_meta() throws LoadingError {\n        var path = Path.build_path (Path.DIR_SEPARATOR_S,\n                                    Environment.get_user_cache_dir(),\n                                    \"valama\",\n                                    \"project_meta.xml\");\n        debug_msg (_(\"Load project meta information: %s\\n\"), path);\n\n        Xml.Doc* doc = Xml.Parser.parse_file (path);\n\n        if (doc == null) {\n            delete doc;\n            throw new LoadingError.FILE_IS_GARBAGE (_(\"Cannot parse file.\"));\n        }\n\n        Xml.Node* root_node = doc->get_root_element();\n        if (root_node == null || root_node->name != \"project-meta\") {\n            delete doc;\n            throw new LoadingError.FILE_IS_EMPTY (_(\"File does not contain enough information.\"));\n        }\n\n        // if (root_node->has_prop (\"version\") != null)\n        //     xXx = root_node->get_prop (\"version\");\n        // if (comp_version (xXx, xXx_VERSION_MIN) < 0) {\n        //     var errstr = _(\"Project file too old: %s < %s\").printf (xXx,\n        //                                                             xXx_VERSION_MIN);\n        //     if (!Args.forceold) {\n        //         throw new LoadingError.FILE_IS_OLD (errstr);\n        //         delete doc;\n        //     } else\n        //         warning_msg (_(\"Ignore project file loading error: %s\\n\"), errstr);\n        // }\n\n        for (Xml.Node* i = root_node->children; i != null; i = i->next) {\n            if (i->type != ElementType.ELEMENT_NODE)\n                continue;\n            switch (i->name) {\n                case \"idemode\":\n                    var mode = IdeModes.from_string (i->get_content());\n                    if (mode != null)\n                        idemode = mode;\n                    else\n                        warning_msg (_(\"Unknown attribute for '%s' line %hu: %s\\n\"),\n                                       \"idemode\", i->line, i->get_content());\n                    break;\n                default:\n                    warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"),\n                                 i->line, i->name);\n                    break;\n            }\n        }\n    }\n\n    public bool close (bool save_all = false) {\n        save_meta();\n        save_project_file();\n\n        if (save_all)\n            return buffer_save_all();\n\n        var changed_files = new TreeSet<string>();\n        foreach (var map in vieworder) {\n            //TODO: Ask here too if dirty.\n            if (map.filename == \"\")\n                continue;\n            if (((SourceBuffer) map.view.buffer).dirty)\n                changed_files.add (map.filename);\n        }\n        if (changed_files.size > 0) {\n            var fstr = \"\";\n            foreach (var file in changed_files)\n                fstr += @\"$file\\n\";\n            var ret = ui_ask_file (_(\"Following files are modified. Do you want to save them?\"),\n                                   Markup.escape_text (fstr));\n            switch (ret) {\n                case ResponseType.REJECT:\n                    return true;\n                case ResponseType.ACCEPT:\n                    return buffer_save_all();\n                case ResponseType.CANCEL:\n                    return false;\n                default:\n                    bug_msg (_(\"Unexpected response value: %s - %u\"),\n                             \"close - ValamaProject\", ret);\n                    return false;\n            }\n        } else\n            return true;\n    }\n\n    /**\n     * Load build system.\n     */\n    public bool add_builder (string? buildsystem, bool lib = false) {\n        if (buildsystem == null) {\n            builder = null;\n            return true;\n        }\n        switch (buildsystem) {\n            case \"plain\":\n            case \"valama\":\n                builder = new BuilderPlain (lib);\n                break;\n            case \"cmake\":\n                builder = new BuilderCMake(lib);\n                break;\n            case \"autotools\":\n                builder = new BuilderAutotools(lib);\n                break;\n            default:\n                warning_msg (_(\"Build system '%s' not supported.\\n\"), buildsystem);\n                return false;\n        }\n        return  true;\n    }\n\n    /**\n     * Select first available package of {@link PkgChoice}. Does not check for\n     * conflicts.\n     *\n     * @param choice {@link PkgChoice} to search for available packages.\n     * @return Return available package name or null.\n     */\n    //TODO: Check version.\n    private PackageInfo? get_choice (PkgChoice choice) {\n        if (guanako_project != null) {\n            //TODO: Do this like init method in ProjectTemplate (check against all vapis).\n            foreach (var pkg in choice.packages)\n                if (guanako_project.get_context_vapi_path (pkg.name) != null) {\n                    debug_msg (_(\"Choose '%s' package.\\n\"), pkg.name);\n                    return pkg;\n                } else\n                    debug_msg (_(\"Skip '%s' choice.\\n\"), pkg.name);\n        } else {\n            //TODO: Do this like init method in ProjectTemplate (check against all vapis).\n            foreach (var pkg in choice.packages)\n                if (Guanako.get_vapi_path (pkg.name) != null) {\n                    debug_msg (_(\"Choose '%s' package.\\n\"), pkg.name);\n                    return pkg;\n                } else\n                    debug_msg (_(\"Skip '%s' choice.\\n\"), pkg.name);\n        }\n        return null;\n    }\n\n    /**\n     * Enable define.\n     *\n     * @param define Define to enable.\n     * @return `true` on success.\n     */\n    public inline bool set_define (string define) {\n        if (used_defines.has_key (define)) {\n            defines.add (define);\n            if (guanako_project.add_define (define)) {\n                defines_update();\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Disable define.\n     *\n     * @param define Define to enable.\n     * @return `true` on success.\n     */\n    public inline bool unset_define (string define) {\n        defines.remove (define);\n        return guanako_project.remove_define (define);\n    }\n\n    /**\n     * Mark define as not available (additionally disable it).\n     *\n     * @param define Define to enable.\n     * @return `true` on success.\n     */\n    public inline bool disable_define (string define) {\n        unset_define (define);\n        return disabled_defines.add (define);\n    }\n\n    /**\n     * Mark define as available again (don't disable it).\n     *\n     * @param define Define to enable.\n     * @return `true` on success.\n     */\n    public inline bool enable_define (string define) {\n        return disabled_defines.remove (define);\n    }\n\n    /**\n     * Mark all (disabled) defines as available.\n     */\n    public inline void enable_defines_all() {\n        disabled_defines.clear();\n    }\n\n    /**\n     * Check if define is already enabled.\n     *\n     * @param define Name of define.\n     * @return `true` if enabled else `false`.\n     */\n    public inline bool define_is_enabled (string define) {\n        return (define in guanako_project.defines);\n    }\n\n    /**\n     * Check if define is already enabled and if so emit define_set signal.\n     *\n     * @param define Name of define.\n     * @return `true` if enabled else `false`.\n     */\n    public inline bool define_is_enabled_emit (string define) {\n        if (define in guanako_project.defines) {\n            define_set (define, true);\n            return true;\n        } else\n            return false;\n    }\n\n    /**\n     * Check if define is marked as not available.\n     *\n     * @param define Name of define.\n     * @return `true` if ''not'' available.\n     */\n    public inline bool define_is_not_available (string define) {\n        return (define in disabled_defines);\n    }\n\n    /**\n     * Emit when undo flag of current {@link SourceBuffer} has changed.\n     *\n     * @param undo_possibility `true` if undo is possible.\n     */\n    public signal void undo_changed (bool undo_possibility);\n    /**\n     * Emit when redo flag of current {@link SourceBuffer} has changed.\n     *\n     * @param redo_possibility `true` if redo is possible.\n     */\n    public signal void redo_changed (bool redo_possibility);\n\n    /**\n     * Open new buffer.\n     *\n     * If file was already loaded by project\n     *\n     * @param txt Containing text. Default is empty.\n     * @param filename Filename to identify buffer. Default is empty.\n     * @param dirty Flag if buffer is dirty. Default is `false`.\n     * @return Return {@link Gtk.SourceView} if new buffer was created else null.\n     */\n    public SuperSourceView? open_new_buffer (string txt = \"\", string filename = \"\", bool dirty = false) {\n        debug_msg (_(\"Load new buffer: %s\\n\"),\n                   (filename == \"\") ? _(\"(new file)\")\n                                    : get_absolute_path (filename));\n\n        foreach (var viewelement in vieworder) {\n            if (viewelement.filename == filename) {\n                vieworder.remove (viewelement);\n                vieworder.offer_head (viewelement);\n                return null;\n            }\n        }\n        if (filename != \"\")\n            files_opened.add (filename);\n\n        var bfr = new SourceBuffer();\n        var view = new SuperSourceView (bfr);\n        view.key_press_event.connect ((key)=>{\n            bfr.last_key_valid = !(key.keyval == Gdk.Key.space || key.keyval == Gdk.Key.Delete\n                                   || key.keyval == Gdk.Key.Tab || key.keyval == Gdk.Key.BackSpace\n                                   || key.keyval == 123 || key.keyval == 125 //Curly brackets\n                                   || key.keyval == Gdk.Key.semicolon || key.keyval == 65293); // That's Enter\n            return false;\n        });\n\n        view.show_line_numbers = true;\n        view.insert_spaces_instead_of_tabs = true;\n        view.override_font (FontDescription.from_string (\"Monospace 10\"));\n        view.auto_indent = true;\n        view.indent_width = 4;\n\n        bfr.begin_not_undoable_action();\n        bfr.text = txt;\n        bfr.end_not_undoable_action();\n\n        bfr.highlight_matching_brackets = true;\n\n        /* Undo manager. */\n        var undoman = bfr.get_undo_manager();\n        undoman.can_undo_changed.connect (() => {\n            undo_changed (undoman.can_undo());\n        });\n        undoman.can_redo_changed.connect (() => {\n            redo_changed (undoman.can_redo());\n        });\n\n        /* Syntax highlighting. */\n        bfr.set_highlight_syntax (true);\n        var langman = new SourceLanguageManager();\n        SourceLanguage lang;\n        if (filename == \"\")\n            lang = langman.get_language (\"vala\");\n        else {\n            var basename = Path.get_basename (filename);\n            lang = langman.guess_language (basename, ContentType.guess (basename, null, null));\n        }\n\n        if (lang != null) {\n            bfr.set_language (lang);\n\n            if (bfr.language.id == \"vala\")\n                try {\n                    view.completion.add_provider (this.comp_provider);\n                } catch (GLib.Error e) {\n                    errmsg (_(\"Could not load completion: %s\\n\"), e.message);\n                }\n        }\n\n        /* Modified flag. */\n        bfr.notify[\"dirty\"].connect (() => {\n            this.buffer_changed (bfr.dirty);\n        });\n        bfr.dirty = dirty;\n        bfr.changed.connect (() => {\n            bfr.dirty = true;\n        });\n\n        /*\n         * NOTE: Remember to connect completion proposals when file was added\n         *       later to project source files.\n         */\n        if (/*bfr.language.id == \"vala\" &&*/ filename in files)\n            bfr.changed.connect (() => {\n                bfr.needs_guanako_update = true;\n\n                /* Update after timeout */\n                if (bfr.timeout_id != -1)\n                    Source.remove (bfr.timeout_id);\n                bfr.timeout_id = Timeout.add (1000, () => {\n                    if (bfr.needs_guanako_update) {\n                        if (parsing) //If we are already parsing, try again next time\n                            return true;\n                        update_guanako (bfr);\n                    }\n                    bfr.timeout_id = -1;\n                    return false;\n                });\n\n                /* Immediate update after switching to a new line */\n                if (!parsing) {\n                    var mark = source_viewer.current_srcbuffer.get_insert();\n                    TextIter iter;\n                    source_viewer.current_srcbuffer.get_iter_at_mark (out iter, mark);\n                    var line = iter.get_line() + 1;\n                    if (bfr.last_active_line == line)\n                        return;\n                    bfr.last_active_line = line;\n                    update_guanako (bfr);\n                }\n            });\n\n        var vmap = new ViewMap (view, filename);\n        vieworder.offer_head (vmap);\n        debug_msg (_(\"Buffer loaded.\\n\"));\n        return view;\n    }\n\n    /**\n     * Update Guanako completion proposals for buffer and run update for\n     * current source file focus.\n     *\n     * @param buffer {@link Gtk.SourceBuffer} to look for completions.\n     */\n    private void update_guanako (SourceBuffer buffer) {\n        parsing = true;\n        buffer.needs_guanako_update = false;\n        try {\n            /* Get a copy of the buffer that is safe to work on\n             * Otherwise, the thread might crash accessing it\n             */\n            string buffer_content =  buffer.text;\n            new Thread<void*>.try (_(\"Buffer update\"), () => {\n                guanako_update_started();\n                var source_file = this.guanako_project.get_source_file_by_name (\n                                                source_viewer.current_srcfocus);\n                this.guanako_project.update_file (source_file, buffer_content);\n                Idle.add (() => {\n                    guanako_update_finished();\n                    parsing = false;\n                    return false;\n                });\n                return null;\n            });\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not create thread to update buffer: %s\\n\"), e.message);\n            parsing = false;\n        }\n    }\n\n    /**\n     * Emit signal if buffer has changed.\n     *\n     * @param has_changes `true` if buffer is dirty else `false`.\n     */\n    public signal void buffer_changed (bool has_changes);\n\n    /**\n     * Emit signal when Guanako update is finished.\n     */\n    public signal void guanako_update_finished();\n\n    /**\n     * Emit signal when Guanako update has started.\n     */\n    public signal void guanako_update_started();\n\n    public signal void completion_finished (Vala.Symbol? current_symbol);\n\n    /**\n     * Save all opened project files.\n     *\n     * @return Return `true` on success else `false`.\n     */\n    public bool buffer_save_all() {\n        bool ret = true;\n        foreach (var map in vieworder) {\n            //TOOD: Ask here too if dirty.\n            if (map.filename == \"\")\n                continue;\n            var srcbuf = (SourceBuffer) map.view.buffer;\n            srcbuf.dirty = !save_file (map.filename, srcbuf.text);\n            if (ret && srcbuf.dirty)\n                ret = false;\n        }\n        return  ret;\n    }\n\n    /**\n     * Save specific project file and update dirty flag.\n     *\n     * @param filename Filename of buffer to save. If empty current buffer is\n     *                 chosen. If filename is relative project path is\n     *                 prepended.\n     * @return Return `true` on success else `false`.\n     */\n    public bool buffer_save (string filename = \"\") {\n        /* Use temporary variable to work around unowned var issue. */\n        string filepath = filename;\n        if (filepath == \"\") {\n            if (source_viewer.current_srcfocus == null) {\n                warning_msg (_(\"No file selected.\\n\"));\n                return false;\n            }\n            filepath = source_viewer.current_srcfocus;\n        } else\n            filepath = get_absolute_path (filepath);\n        foreach (var map in vieworder)\n            if (map.filename == filepath) {\n                var srcbuf = (SourceBuffer) map.view.buffer;\n                srcbuf.dirty = !save_file (map.filename, srcbuf.text);\n                return !srcbuf.dirty;\n            }\n        warning_msg (_(\"Couldn't save project file: %s\\n\"), filename);\n        return false;\n    }\n\n    /**\n     * Check if buffer is dirty.\n     *\n     * @param filename Buffer by filename to check.\n     * @return Return negated dirty flag of buffer or `false` if buffer does\n     *         not exist in project file context.\n     */\n    public bool buffer_is_dirty (string filename) {\n        foreach (var map in vieworder)\n            if (map.filename == filename) {\n                var srcbuf = (SourceBuffer) map.view.buffer;\n                return srcbuf.dirty;\n            }\n        // TRANSLATORS:\n        // File has to be registered with Valama (loaded) to check if the\n        // buffer was modified.\n        warning_msg (_(\"File not registered in project to check if buffer is dirty: %s\\n\"),\n                     filename);\n        return false;\n    }\n\n    /**\n     * Show dialog if {@link Gtk.SourceView} wasn't saved yet.\n     *\n     * @param view {@link Gtk.SourceView} to check if closing is ok.\n     * @param filename Name of file to close.\n     * @return Return `true` to indicate buffer can now closed safely.\n     */\n    public bool close_buffer (Gtk.SourceView view, string? filename) {\n        var bfr = (SourceBuffer) view.buffer;\n        if (bfr.dirty) {\n            var ret = ui_ask_file (_(\"File is modified. Do you want to save it?\"),\n                                   Markup.escape_text (filename));\n            switch (ret) {\n                case ResponseType.REJECT:\n                    files_opened.remove (filename);\n                    return true;\n                case ResponseType.ACCEPT:\n                    files_opened.remove (filename);\n                    return buffer_save (filename);\n                case ResponseType.CANCEL:\n                    return false;\n                default:\n                    bug_msg (_(\"Unexpected response value: %s - %u\"),\n                             \"close_buffer - ValamaProject\", ret);\n                    return false;\n            }\n        }\n        debug_msg (_(\"Close buffer.\\n\"));\n        return true;\n    }\n\n    /**\n     * Hold filename -> view/dirty mappings for {@link vieworder}.\n     */\n    private class ViewMap : Object {\n        public ViewMap (Gtk.SourceView view, string filename) {\n            this.view = view;\n            this.filename = filename;\n        }\n\n        public Gtk.SourceView view;\n        public string filename;\n        /**\n         * Use unique id to support multiple views for same file.\n         */\n        // private static int size = 0;\n        // public int id = size++;\n    }\n\n    /**\n     * Get {@link SourceBuffer} by file name.\n     *\n     * @param filename Filename to get buffer from.\n     * @return Return {@link SourceBuffer} on success else null.\n     */\n    public SourceBuffer? get_buffer_by_file (string filename) {\n        foreach (var map in vieworder)\n            if (map.filename == filename)\n                return (SourceBuffer) map.view.buffer;\n        return null;\n    }\n\n    /**\n     * Provide delegate to perform action on opened views. See\n     * {@link foreach_buffer}.\n     *\n     * @param filename Filename of currently processed buffer.\n     * @param buffer Currently processed buffer.\n     */\n    public delegate void ViewCallback (string filename, SourceBuffer buffer);\n    /**\n     * Perform {@link ViewCallback} action for each opened\n     * {@link Gtk.SourceView}.\n     *\n     * @param action Action to perform on each opened buffer.\n     */\n    public void foreach_buffer (ViewCallback action) {\n        foreach (var map in vieworder)\n            action (map.filename, (SourceBuffer) map.view.buffer);\n    }\n\n\n}\n\n/**\n* Add dirty flag to {@link Gtk.SourceBuffer}.\n*/\npublic class SourceBuffer : Gtk.SourceBuffer {\n    /**\n     * Manually indicate if buffer has unsaved changes.\n     */\n    //TODO: Look at is_modified.\n    public bool dirty { get; set; default = false; }\n    public int last_active_line = -1;\n    public bool needs_guanako_update = false;\n    public uint timeout_id = -1;\n    public bool last_key_valid = false;\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/project/project_file.vala",
    "content": "/*\n * src/project/project_file.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\nusing Gee;\nusing Xml;\n\n/**\n * Current compatible version of project file.\n */\nconst string VLP_VERSION_MIN = \"0.1\";\n\npublic class ProjectFile : Object {\n    internal ProjectFile.empty(string project_file)\n    {\n        this.project_file_path = project_file;\n        var proj_file = File.new_for_path (project_file);\n        project_path = proj_file.get_parent().get_path(); //TODO: Check valid path?\n    \n    }\n    \n    public ProjectFile (string project_file) throws LoadingError {\n        this.project_file_path = project_file;\n        var proj_file = File.new_for_path (project_file);\n        project_path = proj_file.get_parent().get_path(); //TODO: Check valid path?\n\n        load_project_file();\n    }\n\n    /**\n     * Load project data from string.\n     *\n     * When turning this into real project don't forget to update\n     * {@link project_file_path}, {@link proj_file} and {@link project_path}.\n     */\n    public ProjectFile.from_data (string project_file_data) throws LoadingError {\n        this.project_file_data = project_file_data;\n        load_project_file (project_file_data);\n    }\n\n    public string project_file_path  { get; private set; }\n    public string project_file_data { get; private set; }\n\n    //TODO: eliminate one of these two...\n    public File project_path_file { get; private set; }\n    private string _project_path;\n    /**\n     * Absolute path to project root.\n     */\n    public string project_path {\n        get {\n            return _project_path;\n        }\n        private set {\n            _project_path = value;\n            project_path_file = File.new_for_path (value);\n        }\n    }\n\n    public string project_name { get; set; default = _(\"valama_project\"); }\n    public string project_file_version { get; private set; default = \"0\"; }\n\n    public int version_major { get; set; default = 0; }\n    public int version_minor { get; set; default = 0; }\n    public int version_patch { get; set; default = 0; }\n    \n    public string flags { get; set; }\n\n    public ArrayList<PkgChoice?> package_choices { get; private set; default = new ArrayList<PkgChoice?>(); }\n\n    protected TreeSet<string> _source_dirs = new TreeSet<string>();\n    public TreeSet<string> source_dirs { get { return _source_dirs; } protected set { _source_dirs = value; } }\n\n    protected TreeSet<string> _source_files = new TreeSet<string>();\n    public TreeSet<string> source_files { get { return _source_files; } protected set { _source_files = value; } }\n\n    protected TreeSet<string> _ui_dirs = new TreeSet<string>();\n    public TreeSet<string> ui_dirs { get { return _ui_dirs; } protected set { _ui_dirs = value; } }\n\n    protected TreeSet<string> _ui_files = new TreeSet<string>();\n    public TreeSet<string> ui_files { get { return _ui_files; } protected set { _ui_files = value; } }\n\n    protected TreeSet<string> _buildsystem_dirs = new TreeSet<string>();\n    public TreeSet<string> buildsystem_dirs { get { return _buildsystem_dirs; } set { _buildsystem_dirs = value; } }\n\n    protected TreeSet<string> _buildsystem_files = new TreeSet<string>();\n    public TreeSet<string> buildsystem_files { get { return _buildsystem_files; } protected set { _buildsystem_files = value; } }\n\n    protected TreeSet<string> _data_dirs = new TreeSet<string>();\n    public TreeSet<string> data_dirs { get { return _data_dirs; } protected set { _data_dirs = value; } }\n\n    protected TreeSet<string> _data_files = new TreeSet<string>();\n    public TreeSet<string> data_files { get { return _data_files; } protected set { _data_files = value; } }\n\n    /**\n     * List of source files.\n     */\n    public TreeSet<string> files { get; private set; default = new TreeSet<string>(); }\n    /**\n     * List of user interface files.\n     */\n    public TreeSet<string> u_files { get; private set; default = new TreeSet<string>(); }\n    /**\n     * List of build system files.\n     */\n    public TreeSet<string> b_files { get; private set; default = new TreeSet<string>(); }\n    /**\n     * List of extra files.\n     */\n    public TreeSet<string> d_files { get; private set; default = new TreeSet<string>(); }\n\n\n    public TreeMap<string, PackageInfo> packages { get; private set;\n        default = new TreeMap<string, PackageInfo> (Guanako.compare_string_case_insensitive, PackageInfo.compare_data_func);\n    }\n\n    /**\n     * List of opened files.\n     */\n    //TODO: Support only for templates and not normal projects.\n    public ArrayList<string> files_opened { get; protected set; default = new ArrayList<string>(); }\n\n    public string buildsystem { get; set; default = \"\"; }\n    public bool library { get; set; default = false; }\n\n     /**\n     * Load Valama project from .vlp (xml) file.\n     *\n     * @throws LoadingError Throw if file to load contains errors. E.g. it\n     *                      does not exist or does not contain enough\n     *                      information.\n     */\n    private void load_project_file (string? buffer = null) throws LoadingError {\n        Xml.Doc* doc;\n        if (buffer == null)\n            doc = Xml.Parser.parse_file (project_file_path);\n        else\n            doc = Xml.Parser.parse_doc (buffer);\n\n        if (doc == null) {\n            delete doc;\n            throw new LoadingError.FILE_IS_GARBAGE (_(\"Cannot parse file.\"));\n        }\n\n        Xml.Node* root_node = doc->get_root_element();\n        if (root_node == null || root_node->name != \"project\") {\n            delete doc;\n            throw new LoadingError.FILE_IS_EMPTY (_(\"File does not contain enough information.\"));\n        }\n\n        if (root_node->has_prop (\"version\") != null)\n            project_file_version = root_node->get_prop (\"version\");\n        if (comp_version (project_file_version, VLP_VERSION_MIN) < 0) {\n            var errstr = _(\"Project file too old: %s < %s\").printf (project_file_version,\n                                                                    VLP_VERSION_MIN);\n            if (!Args.forceold) {\n                throw new LoadingError.FILE_IS_OLD (errstr);\n                delete doc;\n            } else\n                warning_msg (_(\"Ignore project file loading error: %s\\n\"), errstr);\n        }\n\n        for (Xml.Node* i = root_node->children; i != null; i = i->next) {\n            if (i->type != ElementType.ELEMENT_NODE)\n                continue;\n            switch (i->name) {\n\t\t\t\tcase \"flags\":\n\t\t\t\t\tflags = i->get_content();\n\t\t\t\t\tbreak;\n                case \"name\":\n                    project_name = i->get_content();\n                    break;\n                case \"buildsystem\":\n                    buildsystem = i->get_content();\n                    if (i->get_prop (\"library\") == \"true\")\n                        library = true;\n                    break;\n                case \"version\":\n                    for (Xml.Node* p = i->children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"major\":\n                                version_major = int.parse (p->get_content());\n                                break;\n                            case \"minor\":\n                                version_minor = int.parse (p->get_content());\n                                break;\n                            case \"patch\":\n                                version_patch = int.parse (p->get_content());\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"),\n                                             p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"packages\":\n                    for (Xml.Node* p = i->children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"choice\":\n                                var choice = get_package_choice (p);\n                                if (choice.packages.size > 1)\n                                    package_choices.add (choice);\n                                else if (choice.packages.size == 1)\n                                    packages[choice.packages[0].name] = choice.packages[0];\n                                else\n                                    warning_msg (_(\"No packages to choose between: line %hu\\n\"), p->line);\n                                break;\n                            case \"package\":\n                                var pkg = get_package_info (p);\n                                if (pkg != null)\n                                    packages[pkg.name] = pkg;\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"source-directories\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"directory\":\n                                source_dirs.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"source-files\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"file\":\n                                source_files.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"ui-directories\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"directory\":\n                                ui_dirs.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"ui-files\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"file\":\n                                ui_files.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"buildsystem-directories\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"directory\":\n                                buildsystem_dirs.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"buildsystem-files\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"file\":\n                                print(get_absolute_path (p->get_content())+\"\\n\");\n                                buildsystem_files.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"data-directories\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"directory\":\n                                data_dirs.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"data-files\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"file\":\n                                data_files.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                case \"opened-files\":\n                    for (Xml.Node* p = i-> children; p != null; p = p->next) {\n                        if (p->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (p->name) {\n                            case \"file\":\n                                files_opened.add (get_absolute_path (p->get_content()));\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                break;\n                        }\n                    }\n                    break;\n                default:\n                    warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), i->line, i->name);\n                    break;\n            }\n        }\n\n        delete doc;\n    }\n\n\n    /**\n     * Save project to {@link project_file_path}.\n     *\n     * @param balance If `true` balance file and directory lists.\n     */\n    public void save_project_file (bool balance = true) {\n        debug_msg (_(\"Save project file: %s\\n\"), project_file_path);\n\n        if (balance)\n            balance_pfile_dirs();\n\n        var writer = new TextWriter.filename (project_file_path);\n        writer.set_indent (true);\n        writer.set_indent_string (\"    \");\n\n        writer.start_element (\"project\");\n        writer.write_attribute (\"version\", project_file_version);\n        writer.write_element (\"name\", project_name);\n        if (buildsystem != \"\"){\n            writer.start_element (\"buildsystem\");\n            writer.write_attribute (\"library\", library.to_string());\n            writer.write_string (buildsystem);\n            writer.end_element();\n        }\n        writer.start_element (\"version\");\n        writer.write_element (\"major\", version_major.to_string());\n        writer.write_element (\"minor\", version_minor.to_string());\n        writer.write_element (\"patch\", version_patch.to_string());\n        writer.end_element();\n        \n        writer.write_element (\"flags\", flags);\n\n        if (packages.size > 0 || package_choices.size > 0) {\n            writer.start_element (\"packages\");\n            foreach (var choice in package_choices)\n                write_choice (writer, choice);\n            foreach (var pkg in packages.values) {\n                if (pkg.choice != null)\n                    continue;\n                write_pkg (writer, pkg);\n            }\n            writer.end_element();\n        }\n\n        if (source_dirs.size > 0) {\n            writer.start_element (\"source-directories\");\n            foreach (var directory in source_dirs)\n                writer.write_element (\"directory\", get_relative_path (directory));\n            writer.end_element();\n        }\n\n        if (source_files.size > 0) {\n            writer.start_element (\"source-files\");\n            foreach (var filename in source_files)\n                writer.write_element (\"file\", get_relative_path (filename));\n            writer.end_element();\n        }\n\n        if (ui_dirs.size > 0) {\n            writer.start_element (\"ui-directories\");\n            foreach (var directory in ui_dirs)\n                writer.write_element (\"directory\", get_relative_path (directory));\n            writer.end_element();\n        }\n\n        if (ui_files.size > 0) {\n            writer.start_element (\"ui-files\");\n            foreach (var filename in ui_files)\n                writer.write_element (\"file\", get_relative_path (filename));\n            writer.end_element();\n        }\n\n        if (buildsystem_dirs.size > 0) {\n            writer.start_element (\"buildsystem-directories\");\n            foreach (var directory in buildsystem_dirs)\n                writer.write_element (\"directory\", get_relative_path (directory));\n            writer.end_element();\n        }\n\n        if (buildsystem_files.size > 0) {\n            writer.start_element (\"buildsystem-files\");\n            foreach (var filename in buildsystem_files)\n                writer.write_element (\"file\", get_relative_path (filename));\n            writer.end_element();\n        }\n\n        if (data_dirs.size > 0) {\n            writer.start_element (\"data-directories\");\n            foreach (var directory in data_dirs)\n                writer.write_element (\"directory\", get_relative_path (directory));\n            writer.end_element();\n        }\n\n        if (data_files.size > 0) {\n            writer.start_element (\"data-files\");\n            foreach (var filename in data_files)\n                writer.write_element (\"file\", get_relative_path (filename));\n            writer.end_element();\n        }\n\n        writer.end_element();\n    }\n\n    /**\n     * Load package choice information from {@link Xml.Node}.\n     *\n     * Can return empty {@link PkgChoice}. Verify with\n     * {@link PkgChoice.packages.size} > 0.\n     *\n     * @param node Package choice {@link Xml.Node} to search for infos.\n     * @return Return {@link PkgChoice}.\n     */\n    private PkgChoice get_package_choice (Xml.Node* node) {\n        var choice = new PkgChoice();\n        if (node->has_prop (\"all\") != null)\n            switch (node->get_prop (\"all\")) {\n                case \"yes\":\n                    choice.all = true;\n                    break;\n                case \"no\":\n                    choice.all = false;\n                    break;\n                default:\n                    warning_msg (_(\"Unknown property for '%s' line %hu: %s\\n\"\n                                        + \"Will choose '%s'\\n\"),\n                                 \"rel\", node->line, node->get_prop (\"all\"), \"no\");\n                    choice.all = false;\n                    break;\n            }\n        for (Xml.Node* p = node->children; p != null; p = p->next) {\n            if (p->type != ElementType.ELEMENT_NODE)\n                continue;\n            switch (p->name) {\n                case \"description\":\n                    choice.description = p->get_content();\n                    break;\n                case \"package\":\n                    var pkg = get_package_info (p);\n                    if (pkg != null)\n                        choice.add_package (pkg);\n                    break;\n                default:\n                    warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                    break;\n            }\n        }\n        return choice;\n    }\n\n    /**\n     * Load package information from {@link Xml.Node}.\n     *\n     * @param node Package {@link Xml.Node} to search for infos.\n     * @return Return {@link PackageInfo} or null if no package found.\n     */\n    private PackageInfo? get_package_info (Xml.Node* node) {\n        if (node->has_prop (\"name\") == null) {\n            warning_msg (_(\"No package name line %hu.\\n\"), node->line);\n            return null;\n        }\n        var package = new PackageInfo();\n        package.name = node->get_prop (\"name\");\n\n        if (node->has_prop (\"version\") != null) {\n            package.version = node->get_prop (\"version\");\n            if (node->has_prop (\"rel\") != null) {\n                var rel = VersionRelation.name_to_rel (node->get_prop (\"rel\"));\n                if (rel != null)\n                    package.rel = rel;\n                else {\n                    warning_msg (_(\"Unknown property for '%s' line %hu: %s\\n\"\n                                        + \"Will choose '%s'\\n\"),\n                                 \"rel\", node->line, node->get_prop (\"rel\"), \"since\");\n                    package.rel = VersionRelation.SINCE;\n                }\n            } else\n                package.rel = VersionRelation.SINCE;\n        } else if (node->has_prop (\"rel\") != null)\n            // TRANSLATORS:\n            // That means we know \"`package' >= \". Something is missing, isn't it?\n            warning_msg (_(\"Package '%s' has relation information but no version: \"\n                                + \"line: %hu: %s\\n\"),\n                         package.name, node->line, node->get_prop (\"rel\"));\n\n        if (node->has_prop (\"vapi\") != null) {\n            var vapi = node->get_prop (\"vapi\");\n            if (vapi.has_suffix (\".vapi\"))\n                package.custom_vapi = vapi;\n            else\n                warning_msg (_(\"Custom vapi '%s' has incorrect file name extension line: %hu\\n\"),\n                             vapi, node->line);\n        }\n        if (node->has_prop (\"nodeps\") != null)\n            switch (node->get_prop (\"nodeps\")) {\n                case \"true\":\n                    package.nodeps = true;\n                    break;\n                case \"false\":\n                    package.nodeps = false;\n                    break;\n                default:\n                    warning_msg (_(\"Unknown property for '%s' line %hu: %s\\n\"\n                                        + \"Will choose '%s'\\n\"),\n                                 \"nodeps\", node->line, node->get_prop (\"nodeps\"), \"false\");\n                    break;\n            }\n        if (node->has_prop (\"define\") != null)\n            package.define = node->get_prop (\"define\");\n\n        for (Xml.Node* p = node->children; p != null; p = p->next) {\n            if (p->type != ElementType.ELEMENT_NODE)\n                continue;\n            switch (p->name) {\n                case \"extracheck\":\n                    var pkgcheck = new PkgCheck();\n                    if (p->has_prop (\"vapi\") != null)\n                        pkgcheck.custom_vapi = p->get_prop (\"vapi\");\n                    if (p->has_prop (\"define\") != null)\n                        pkgcheck.define = p->get_prop (\"define\");\n                    for (Xml.Node* pp = p->children; pp != null; pp = pp->next) {\n                        if (pp->type != ElementType.ELEMENT_NODE)\n                            continue;\n                        switch (pp->name) {\n                            case \"description\":\n                                pkgcheck.description = pp->get_content();\n                                break;\n                            case \"choice\":\n                                var choice = get_package_choice (pp);\n                                if (choice.packages.size > 1)\n                                    pkgcheck.add_choice (choice);\n                                else if (choice.packages.size == 1)\n                                    pkgcheck.add_package (choice.packages[0]);\n                                break;\n                            case \"package\":\n                                var pkg = get_package_info (pp);\n                                if (pkg != null)\n                                    pkgcheck.add_package (pkg);\n                                break;\n                            default:\n                                warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"),\n                                             pp->line, pp->name);\n                                break;\n                        }\n                    }\n                    debug_msg (_(\"PkgCheck for package '%s' found: %s\\n\"), package.name, pkgcheck.to_string());\n                    if (package.extrachecks == null)\n                        package.extrachecks = new ArrayList<PkgCheck>();\n                    package.extrachecks.add (pkgcheck);\n                    break;\n                default:\n                    warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"),\n                                 p->line, p->name);\n                    break;\n            }\n        }\n\n        return package;\n    }\n\n    private void write_choice (TextWriter writer, PkgChoice choice) {\n        writer.start_element (\"choice\");\n        writer.write_attribute (\"all\", (choice.all) ? \"yes\" : \"no\");\n        if (choice.description != null)\n            writer.write_element (\"description\", choice.description);\n        foreach (var pkg in choice.packages)\n            write_pkg (writer, pkg);\n        writer.end_element();\n    }\n\n    private void write_pkg (TextWriter writer, PackageInfo pkg) {\n        writer.start_element (\"package\");\n        writer.write_attribute (\"name\", pkg.name);\n        if (pkg.version != null)\n            writer.write_attribute (\"version\", pkg.version);\n        if (pkg.rel != null)\n            writer.write_attribute (\"rel\", pkg.rel.to_string());\n        if (pkg.custom_vapi != null && pkg.save_vapi)\n            writer.write_attribute (\"vapi\", pkg.custom_vapi);\n        if (pkg.nodeps != null)\n            writer.write_attribute (\"nodeps\", (pkg.nodeps) ? \"true\" : \"false\");\n        if (pkg.define != null)\n            writer.write_attribute (\"define\", pkg.define);\n        if (pkg.extrachecks != null)\n            foreach (var extracheck in pkg.extrachecks) {\n                writer.start_element (\"extracheck\");\n                if (extracheck.description != null)\n                    writer.write_element (\"description\", extracheck.description);\n                if (extracheck.custom_vapi != null)\n                    writer.write_attribute (\"vapi\", extracheck.custom_vapi);\n                if (extracheck.define != null)\n                    writer.write_attribute (\"define\", extracheck.define);\n                foreach (var checkchoice in extracheck.choices)\n                    write_choice (writer, checkchoice);\n                foreach (var checkpkg in extracheck.packages)\n                    write_pkg (writer, checkpkg);\n                writer.end_element();\n            }\n        writer.end_element();\n    }\n\n    /**\n     * Get absolute path to file.\n     *\n     * @param path Absolute path or path relative to project root directory.\n     * @return Return absolute path to directory.\n     */\n    public string get_absolute_path (string path) {\n        if (Path.is_absolute (path))\n            return path;\n        return Path.build_path (Path.DIR_SEPARATOR_S, project_path, path);\n    }\n\n    /**\n     * Get relative path to project directory if file is in same directory\n     * tree.\n     *\n     * @param path Absolute or relative path.\n     * @return Return relative path to project root directory or absolute path\n     *         if file is not in tree below project root.\n     */\n    public string get_relative_path (string path) {\n        if (!Path.is_absolute (path))\n            return path;\n        if (path.has_prefix (project_path)) {  // only simple string comparison\n            var rel = project_path_file.get_relative_path (File.new_for_path (path));\n            if (rel == null)\n                return \"\";\n            return rel;\n        }\n        return path;\n    }\n\n    /**\n     * Reduce length of file list: Prefer directories and optionally remove\n     * directories without content.\n     *\n     * Balance source, ui, build system and data files/directories.\n     *\n     * @param checkfile Check file existence.\n     * @param rmdir Remove empty directories (from list). Implies checkdir.\n     * @param checkdir Check directory existence.\n     */\n    public void balance_pfile_dirs (bool checkfile = true, bool rmdir = false, bool checkdir = false) {\n        var s_dirs_tmp = source_dirs;\n        var s_files_tmp = files;\n        var u_dirs_tmp = ui_dirs;\n        var u_files_tmp = ui_files;\n        var b_dirs_tmp = buildsystem_dirs;\n        var b_files_tmp = b_files;\n        var d_dirs_tmp = data_dirs;\n        var d_files_tmp = d_files;\n\n        balance_dir_file_sets (ref s_dirs_tmp, ref s_files_tmp,\n                               new string[]{\".vala\", \".vapi\"}, null,\n                               checkfile, rmdir, checkdir);\n        balance_dir_file_sets (ref u_dirs_tmp, ref u_files_tmp,\n                               new string[]{\".ui\", \".glade\", \".xml\"}, null,\n                               checkfile, rmdir, checkdir);\n        balance_dir_file_sets (ref b_dirs_tmp, ref b_files_tmp,\n                               new string[]{\".cmake\"}, new string[]{\"CMakeLists.txt\"},\n                               checkfile, rmdir, checkdir);\n        balance_dir_file_sets (ref d_dirs_tmp, ref d_files_tmp,\n                               null, null,\n                               checkfile, rmdir, checkdir);\n\n        source_dirs = s_dirs_tmp;\n        source_files = s_files_tmp;\n        ui_dirs = u_dirs_tmp;\n        ui_files = u_files_tmp;\n        buildsystem_dirs = b_dirs_tmp;\n        buildsystem_files = b_files_tmp;\n        data_dirs = d_dirs_tmp;\n        data_files = d_files_tmp;\n    }\n\n    /**\n     * Reduce length of file list: Prefer directories and optionally remove\n     * directories without content.\n     *\n     * @param c_dirs Directories.\n     * @param c_files Files.\n     * @param extensions Valid file extensions.\n     * @param checkfile Check file existence.\n     * @param rmdir Remove empty directories (from list). Implies checkdir.\n     * @param checkdir Check directory existence.\n     */\n    private void balance_dir_file_sets (ref TreeSet<string> c_dirs,\n                                        ref TreeSet<string> c_files,\n                                        string[]? extensions = null,\n                                        string[]? filenames = null,\n                                        bool checkfile = true,\n                                        bool rmdir = false,\n                                        bool checkdir = false) {\n        var visited_bad = new TreeSet<string>();\n        var new_c_files = new TreeSet<string>();\n\n        if (checkdir || rmdir) {\n            var removals = new TreeSet<string>();\n            foreach (var dir in c_dirs)\n                if (!FileUtils.test (dir, FileTest.IS_DIR))\n                    removals.add (dir);\n            foreach (var dir in removals)\n                c_dirs.remove (dir);\n        }\n        var new_c_dirs = (rmdir) ? new TreeSet<string>() : c_dirs;\n\n        foreach (var filename in c_files) {\n            if (checkfile && !FileUtils.test (filename, FileTest.IS_REGULAR))\n                continue;\n\n            var dirname = Path.get_dirname (filename);\n\n            if (dirname in c_dirs) {\n                new_c_dirs.add (dirname);\n                continue;\n            }\n\n            if (dirname in visited_bad) {\n                new_c_files.add (filename);\n                continue;\n            }\n\n            try {\n                var enumerator = File.new_for_path (dirname).enumerate_children (\n                                                                \"standard::*\",\n                                                                FileQueryInfoFlags.NONE,\n                                                                null);\n                FileInfo info = null;\n                var matching = false;\n                while (!matching && (info = enumerator.next_file()) != null) {\n                    if (info.get_file_type() != FileType.REGULAR ||  //TODO: Follow symlinks.\n                                            c_files.contains (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                                               dirname,\n                                                                               info.get_name())))\n                        continue;\n\n                    if (filenames != null) {\n                        foreach (var name in filenames)\n                            if (Path.get_basename (info.get_name()) == name) {\n                                matching = true;\n                                break;\n                            }\n                        if (matching)\n                            break;\n                    }\n\n                    if (extensions != null)\n                        foreach (var ext in extensions) {\n                            if (info.get_name().has_suffix (ext)) {\n                                matching = true;\n                                break;\n                            }\n                        }\n                    else\n                        matching = true;\n                }\n                if (matching) {\n                    visited_bad.add (dirname);\n                    new_c_files.add (filename);\n                } else {\n                    c_dirs.add (dirname);\n                    new_c_dirs.add (dirname);\n                }\n            } catch (GLib.Error e) {\n                warning_msg (_(\"Could not list or iterate through directory content of '%s': %s\\n\"),\n                             dirname, e.message);\n            }\n        }\n        c_files = new_c_files;\n\n        if (rmdir) {\n            foreach (var dirname in c_dirs) {\n                if (dirname in new_c_dirs)\n                    continue;\n                try {\n                    var enumerator = File.new_for_path (dirname).enumerate_children (\n                                                                    \"standard::*\",\n                                                                    FileQueryInfoFlags.NONE,\n                                                                    null);\n                    FileInfo info = null;\n                    var matching = false;\n                    while (!matching && (info = enumerator.next_file()) != null) {\n                        if (info.get_file_type() != FileType.REGULAR)  //TODO: Other FileTypes?\n                            continue;\n\n                        if (filenames != null) {\n                            foreach (var name in filenames)\n                                if (Path.get_basename (info.get_name()) == name) {\n                                    matching = true;\n                                    break;\n                                }\n                            if (matching)\n                                break;\n                        }\n\n                        if (extensions != null)\n                            foreach (var ext in extensions) {\n                                if (info.get_name().has_suffix (ext)) {\n                                    matching = true;\n                                    break;\n                                }\n                            }\n                        else\n                            matching = true;\n                    }\n                    if (matching)\n                        new_c_dirs.add (dirname);\n                } catch (GLib.Error e) {\n                    warning_msg (_(\"Could not list or iterate through directory content of '%s': %s\\n\"),\n                                 dirname, e.message);\n                }\n            }\n            c_dirs = new_c_dirs;\n        }\n    }\n}\n\n\n/**\n * Throw on project file loading errors.\n */\npublic errordomain LoadingError {\n    /**\n     * File content probably too old.\n     */\n    FILE_IS_OLD,\n    /**\n     * File does not contain enough information.\n     */\n    FILE_IS_EMPTY,\n    /**\n     * Unable to load file.\n     */\n    FILE_IS_GARBAGE,\n    /**\n     * Could not load Guanako completion.\n     */\n    //TODO: Disable completion instead. This is ValamaProject specific so remove it.\n    COMPLETION_NOT_AVAILABLE\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/project/project_templates.vala",
    "content": "/*\n * src/project/project_templates.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Xml;\nusing Gee;\n\npublic class ProjectTemplate {\n    public Gdk.Pixbuf? icon = null;\n    public ArrayList<TemplateAuthor?> authors;\n    public ArrayList<TemplateValaVersion?> versions;\n    public ArrayList<TemplateSubstition?> substitutions;\n    public string version = \"0\";\n    public string name;\n    public string path;\n    public string description;\n    public string? long_description = null;\n\n    public ArrayList<PackageInfo?>? unmet_deps { get; private set; default = null; }\n    public TreeSet<string>? s_files  { get; private set; default = null; }\n    public string[]? b_files { get; private set; default = null; }\n\n    public ValamaProject? vproject { get; private set; default = null; }\n\n    public ProjectTemplate() {\n        authors = new ArrayList<TemplateAuthor?>();\n        versions = new ArrayList<TemplateValaVersion?>();\n        substitutions = new ArrayList<TemplateSubstition?>();\n    }\n\n    /**\n     * Partly load {@link ValamaProject} and initialize package and file list\n     * and get unmet dependencies.\n     */\n    public void init() throws LoadingError requires (path != null) {\n        if (path.length > 0)\n            vproject = new ValamaProject (Path.build_path (Path.DIR_SEPARATOR_S, path, \"template.vlp\"), null, false);\n        else {\n            vproject = new ValamaProject.from_data (\"\"\"\n<project version=\"%s\">\n    <name></name>\n    <buildsystem>cmake</buildsystem>\n    <version>\n        <major>0</major>\n        <minor>0</minor>\n        <patch>0</patch>\n    </version>\n    <packages>\n        <package name=\"glib-2.0\"/>\n        <package name=\"gobject-2.0\"/>\n    </packages>\n    <source-directories>\n        <directory>src</directory>\n        <directory>vapi</directory>\n    </source-directories>\n    <ui-directories>\n        <directory>ui</directory>\n    </ui-directories>\n    <buildsystem-directories>\n        <directory></directory>\n        <directory>cmake</directory>\n    </buildsystem-directories>\n</project>\n\"\"\".printf (TEMPLATE_VERSION_MIN), null, false);\n        }\n\n        s_files = new TreeSet<string>();\n        var source_dirs = vproject.source_dirs;\n        var source_files = vproject.source_files;\n        vproject.generate_file_list (ref source_dirs,\n                                     ref source_files,\n                                     (filename) => {\n            if (!(filename.has_suffix (\".vala\") || filename.has_suffix (\".vapi\")))\n                return;\n            s_files.add (vproject.get_relative_path (filename));\n        });\n\n        //TODO: Get build system files.\n        if (vproject.builder != null)\n            switch (vproject.builder.get_name_id()) {\n                default:\n                    debug_msg (_(\"Build system '%s' currently not supported by template selector.\\n\"),\n                               vproject.builder.get_name());\n                    break;\n            }\n\n        unmet_deps = new ArrayList<PackageInfo?>();\n        foreach (var pkg in vproject.packages.values)\n            if (!(pkg.name in Guanako.get_available_packages().get_keys()))\n                unmet_deps.add (pkg);\n            else {\n                string pkg_ver;\n                if (package_exists (pkg.name, out pkg_ver) && pkg.version != null) {\n                    var pkg_rel = (pkg.rel != null) ? pkg.rel : VersionRelation.SINCE;\n                    bool unmet;\n                    switch (pkg_rel) {\n                        case VersionRelation.AFTER:\n                            unmet = comp_version (pkg_ver, pkg.version) < 0;\n                            break;\n                        case VersionRelation.SINCE:\n                            unmet = comp_version (pkg_ver, pkg.version) <= 0;\n                            break;\n                        case VersionRelation.UNTIL:\n                            unmet = comp_version (pkg_ver, pkg.version) >= 0;\n                            break;\n                        case VersionRelation.BEFORE:\n                            unmet = comp_version (pkg_ver, pkg.version) > 0;\n                            break;\n                        case VersionRelation.ONLY:\n                            unmet = comp_version (pkg_ver, pkg.version) != 0;\n                            break;\n                        case VersionRelation.EXCLUDE:\n                            unmet = comp_version (pkg_ver, pkg.version) == 0;\n                            break;\n                        default:\n                            bug_msg (_(\"Unexpected enum value: %s: %u\\n\"),\n                                     \"ProjectTemplate - init\", pkg_rel);\n                            unmet = true;\n                            break;\n                    }\n                    if (unmet)\n                        unmet_deps.add (pkg);\n                }\n            }\n    }\n}\n\npublic class TemplateAuthor {\n    public string? name = null;\n    public string? mail = null;\n    public string? date = null;\n    public string? comment = null;\n}\n\npublic class TemplateValaVersion {\n    public VersionRelation? rel = null;\n    public string? version = null;\n}\n\npublic class TemplateSubstition {\n    public string? file = null;\n    public string? match = null;\n    public string? replace = null;\n    public bool line = false;\n}\n\n/**\n * Current compatible version of template file.\n */\npublic const string TEMPLATE_VERSION_MIN = \"0.1\";\n\n/**\n * Load all available {@link ProjectTemplate} information.\n *\n * @param reload Reload templates.\n * @return `true` if actually (re)load templates else `false`.\n */\npublic bool load_templates (bool reload = false) {\n    if (templates == null)\n        templates = new Gee.TreeMap<string, ProjectTemplate>();\n    else if (reload)\n        templates.clear();\n    else\n        return false;\n\n    load_default_template();\n\n    string[] dirpaths;\n    if (Args.templatesdirs == null)\n        dirpaths = new string[] {\n                                  Path.build_path (Path.DIR_SEPARATOR_S,\n                                                   Environment.get_user_data_dir(),\n                                                   \"valama\",\n                                                   \"templates\"),\n                                  Path.build_path (Path.DIR_SEPARATOR_S,\n                                                   Config.PACKAGE_DATA_DIR,\n                                                   \"templates\")\n                                };\n    else\n        dirpaths = Args.templatesdirs;\n\n    foreach (var dirpath in dirpaths) {\n        if (!FileUtils.test (dirpath, FileTest.IS_DIR))\n            continue;\n        debug_msg (\"Checking template directory: %s\\n\", dirpath);\n        try {\n            var enumerator = File.new_for_path (dirpath).enumerate_children (FileAttribute.STANDARD_NAME, 0);\n\n            FileInfo file_info;\n            while ((file_info = enumerator.next_file()) != null) {\n                var infof = File.new_for_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                                dirpath,\n                                                                file_info.get_name(),\n                                                                file_info.get_name() + \".info\"));\n                if (!infof.query_exists())\n                    continue;\n                var filename = infof.get_path();\n\n                var new_template = new ProjectTemplate();\n                new_template.name = file_info.get_name();\n                new_template.path = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                     dirpath,\n                                                     new_template.name,\n                                                     \"template\");\n                foreach (var filetype in get_insensitive_cases({\"png\",\"jpg\",\"jpeg\",\"svg\"})) {\n                    var icon_path = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                     dirpath,\n                                                     new_template.name,\n                                                     new_template.name + \".\" + filetype);\n                    if (FileUtils.test (icon_path, FileTest.EXISTS)) {\n                        try {\n                            var pbuf = new Gdk.Pixbuf.from_file (icon_path);\n                            new_template.icon = pbuf.scale_simple (33, 33, Gdk.InterpType.BILINEAR);\n                            break;\n                        } catch (GLib.Error e) {\n                            warning_msg (_(\"Could not load template image: %s\\n\"), e.message);\n                        }\n                    }\n                }\n\n                Xml.Doc* doc = Xml.Parser.parse_file (filename);\n                Xml.Node* root_node;\n\n                try {\n                    if (doc == null) {\n                        delete doc;\n                        throw new LoadingError.FILE_IS_GARBAGE (_(\"Cannot parse file.\"));\n                    }\n\n                    root_node = doc->get_root_element();\n                    if (root_node == null) {\n                        delete doc;\n                        throw new LoadingError.FILE_IS_EMPTY (_(\"File does not contain enough information\"));\n                    }\n\n                    if (root_node->has_prop (\"version\") != null)\n                        new_template.version = root_node->get_prop (\"version\");\n                    if (comp_version (new_template.version, TEMPLATE_VERSION_MIN) < 0) {\n                        var errstr = _(\"Template file '%s' too old: %s < %s\").printf (new_template.path,\n                                                                                      new_template.version,\n                                                                                      TEMPLATE_VERSION_MIN);\n                        if (!Args.forceold) {\n                            delete doc;\n                            throw new LoadingError.FILE_IS_OLD (errstr);\n                        } else\n                            warning_msg (_(\"Ignore template file loading error: %s\\n\"), errstr);\n                    }\n                } catch (LoadingError e) {\n                    warning_msg (_(\"Could not load template '%s': %s\\n\"), filename, e.message);\n                    continue;\n                }\n\n                for (Xml.Node* i = root_node->children; i != null; i = i->next) {\n                    if (i->type != ElementType.ELEMENT_NODE)\n                        continue;\n                    switch (i->name) {\n                        case \"vala-version\":\n                            var version = new TemplateValaVersion();\n                            version.version = i->get_content();\n                            if (i->has_prop (\"rel\") != null) {\n                                var rel = VersionRelation.name_to_rel (i->get_prop (\"rel\"));\n                                if (rel != null)\n                                    version.rel = rel;\n                                else {\n                                    warning_msg (_(\"Unknown property for '%s' line %hu: %s\\n\"\n                                                            + \"Will choose '%s'\\n\"),\n                                                 \"rel\", i->line, i->get_prop (\"rel\"), \"only\");\n                                    version.rel = VersionRelation.ONLY;\n                                }\n                            }\n                            new_template.versions.add (version);\n                            break;\n                        case \"author\":\n                            var author = new TemplateAuthor();\n                            for (Xml.Node* p = i->children; p != null; p = p->next) {\n                                if (p->type != ElementType.ELEMENT_NODE)\n                                    continue;\n                                switch (p->name) {\n                                    case \"name\":\n                                        author.name = p->get_content();\n                                        break;\n                                    case \"mail\":\n                                        author.mail = p->get_content();\n                                        break;\n                                    case \"date\":\n                                        author.date = p->get_content();\n                                        break;\n                                    case \"comment\":\n                                        author.comment = get_lang_content (p);\n                                        break;\n                                    default:\n                                        warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                        break;\n                                }\n                            }\n                            new_template.authors.add (author);\n                            break;\n                        case \"name\":\n                            new_template.name = get_lang_content (i);\n                            if (new_template == null) {\n                                warning_msg (_(\"Template has no name: line %hu\"), i->line);\n                                new_template.name = \"\";\n                            }\n                            break;\n                        case \"description\":\n                            new_template.description = get_lang_content (i);\n                            if (new_template.description == null) {\n                                debug_msg (_(\"Template has no description: line %hu\"), i->line);\n                                new_template.description = \"\";\n                            }\n                            break;\n                        case \"long-description\":\n                            new_template.long_description = get_lang_content (i);\n                            break;\n                        case \"substitutions\":\n                            for (Xml.Node* p = i->children; p != null; p = p->next) {\n                                if (p->type != ElementType.ELEMENT_NODE)\n                                    continue;\n                                switch (p->name) {\n                                    case \"sub\":\n                                        var substitution = new TemplateSubstition();\n                                        substitution.file = p->get_content();\n                                        if (p->has_prop (\"match\") != null)\n                                            substitution.match = p->get_prop (\"match\");\n                                        else {\n                                            warning_msg (_(\"Ignore substitution with missing '%s' property line %hu.\"),\n                                                         \"match\", p->line);\n                                            break;\n                                        }\n                                        if (p->has_prop (\"replace\") != null)\n                                            substitution.replace = p->get_prop (\"replace\");\n                                        else {\n                                            warning_msg (_(\"Ignore substitution with missing '%s' property line %hu.\"),\n                                                         \"replace\", p->line);\n                                            break;\n                                        }\n                                        if (p->has_prop (\"line\") != null) {\n                                            switch (p->get_prop (\"line\")) {\n                                                case \"yes\":\n                                                    substitution.line = true;\n                                                    break;\n                                                case \"no\":\n                                                    substitution.line = false;\n                                                    break;\n                                                default:\n                                                    warning_msg (_(\"Unknown value for substitution property '%s' line %hu (assume '%s'): %s\"),\n                                                                 \"line\", p->line, \"no\", p->get_prop (\"line\"));\n                                                    break;\n                                            }\n                                        }\n                                        new_template.substitutions.add (substitution);\n                                        break;\n                                    default:\n                                        warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), p->line, p->name);\n                                        break;\n                                }\n                            }\n                            break;\n                        default:\n                            warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"), i->line, i->name);\n                            break;\n                    }\n                }\n                delete doc;\n                templates[new_template.name] = new_template;\n            }\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not process files in template directory: %s\\n\"), e.message);\n        }\n    }\n\n    return true;\n}\n\n\nprivate void load_default_template() {\n    var new_template = new ProjectTemplate();\n    new_template.name = _(\"Default\");\n    new_template.path = \"\";\n    new_template.version = Config.PACKAGE_VERSION;\n    new_template.description = _(\"Default empty project\");\n    new_template.long_description = _(\"Builtin template project without any files.\");\n    templates[new_template.name] = new_template;\n}\n\n\n/**\n * Load item from list and select only valid locales (from priority list).\n *\n * @param node {@link Xml.Node} pointer to start (plain) lookup.\n * @return Return highest priority item or null if no matching locale found.\n */\npublic string? get_lang_content (Xml.Node* node) {\n    int locid = get_locales().size;\n    string? desc_start = null;\n    string? desc = null;\n    for (Xml.Node* p = node->children; p != null; p = p->next) {\n        if (p->type != ElementType.ELEMENT_NODE)\n            continue;\n        if (desc_start == null)\n            desc_start = p->get_content();\n        var tmpid = locales.index_of (p->name);\n        if (0 <= tmpid < locid) {\n            locid = tmpid;\n            desc = p->get_content();\n            if (tmpid == 0)\n                break;\n        }\n    }\n    if (desc != null)\n        return desc;\n    else if (desc_start != null)\n        return desc_start;\n    return null;\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/settings.vala",
    "content": "/*\n * src/settings.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nclass ValamaSettings {\n\n    public ValamaSettings() {\n        settings = new Settings (\"org.valama\");\n    }\n    Settings settings;\n\n    public int window_size_x {\n        get { return settings.get_int (\"window-size-x\"); }\n        set { settings.set_int (\"window-size-x\", value); }\n    }\n    public int window_size_y {\n        get { return settings.get_int (\"window-size-y\"); }\n        set { settings.set_int (\"window-size-y\", value); }\n    }\n\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/app_output.vala",
    "content": "/*\n * src/ui/build_output.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing GLib;\n\npublic class AppOutput : UiElement {\n    private TextView textview;\n    private bool focused;\n\n    public AppOutput() {\n        focused = false;\n\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        var toolbar_title = new Toolbar ();\n        toolbar_title.get_style_context().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        var ti_title = new ToolItem();\n        var plabel = new Label (_(\"Application output\"));\n        ti_title.add (plabel);\n        toolbar_title.add(ti_title);\n\n        var separator_stretch = new SeparatorToolItem();\n        separator_stretch.set_expand (true);\n        separator_stretch.draw = false;\n        toolbar_title.add (separator_stretch);\n\n        var btn_clear = new Gtk.ToolButton (null, null);\n        btn_clear.icon_name = \"edit-clear-all-symbolic\";\n        toolbar_title.add (btn_clear);\n        btn_clear.set_tooltip_text (_(\"Clear output\"));\n        btn_clear.clicked.connect (() => {\n            textview.buffer.text = \"\";\n        });\n        vbox.pack_start (toolbar_title, false, true);\n\n        textview = new TextView();\n        textview.override_font (Pango.FontDescription.from_string (\"Monospace 10\"));\n        textview.editable = false;\n        textview.wrap_mode = WrapMode.NONE;\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (textview);\n        vbox.pack_start (scrw, true, true);\n\n        widget = vbox;\n        widget.show_all();\n\n        project_builder.notify[\"app-running\"].connect (() => {\n            if (project_builder.app_running) {\n                if (!focused) {\n                    focused = true;\n                    widget_main.focus_dock_item (this.dock_item);\n                }\n                textview.buffer.text = \"\";\n            } else\n                focused = false;\n        });\n        project_builder.app_output.connect (show_output);\n    }\n\n    private inline void show_output (string output) {\n        textview.buffer.insert_at_cursor (output, -1);\n    }\n\n    protected override void build() {}\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/breakpoints.vala",
    "content": "/*\n * src/ui/breakpoints.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\nusing Guanako;\n\n/**\n * Setting break points etc.\n */\nclass UiBreakpoints : UiElement {\n    TreeView tree_view;\n    Guanako.FrankenStein frankenstein;\n    Gtk.ListStore? store = null;\n    MainLoop resume_wait_loop = new MainLoop();\n\n    InfoBar info_bar;\n\n    ToolButton btn_add;\n    ToolButton btn_remove;\n    ToolButton btn_resume;\n    ToggleToolButton btn_line_by_line;\n\n    public UiBreakpoints (Guanako.FrankenStein frankenstein) {\n        this.frankenstein = frankenstein;\n        frankenstein.timer_finished.connect (timer_finished);\n        frankenstein.stop_reached.connect (stop_reached);\n        frankenstein.line_reached.connect (line_reached);\n        frankenstein.received_invalid_id.connect (()=> {\n            info_bar.visible = true;\n        });\n        project_builder.build_started.connect (() => {\n            info_bar.visible = false;\n        });\n\n        var box_main = new Box (Orientation.VERTICAL, 0);\n\n        tree_view = new TreeView();\n\n        tree_view.insert_column_with_attributes (-1,\n                                                 _(\"Line\"),\n                                                 new CellRendererText(),\n                                                 \"text\",\n                                                 0,\n                                                 null);\n        tree_view.insert_column_with_attributes (-1,\n                                                 _(\"File\"),\n                                                 new CellRendererText(),\n                                                 \"text\",\n                                                 1,\n                                                 null);\n        tree_view.insert_column_with_attributes (-1,\n                                                 _(\"Time\"),\n                                                 new CellRendererText(),\n                                                 \"text\",\n                                                 2,\n                                                 null);\n\n        build();\n\n        tree_view.can_focus = false;\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (tree_view);\n        box_main.pack_start (scrw, true, true);\n\n        var toolbar = new Toolbar();\n        toolbar.icon_size = IconSize.MENU;\n\n        btn_add = new ToolButton (null, null);\n        btn_add.sensitive = false;\n        btn_add.icon_name = \"list-add-symbolic\";\n        btn_add.clicked.connect (on_btn_add_clicked);\n        toolbar.add (btn_add);\n\n        btn_remove = new ToolButton (null, null);\n        btn_remove.sensitive = false;\n        btn_remove.icon_name = \"list-remove-symbolic\";\n        btn_remove.clicked.connect (on_btn_remove_clicked);\n        toolbar.add (btn_remove);\n\n        btn_resume = new ToolButton (null, null);\n        btn_resume.sensitive = false;\n        btn_resume.icon_name = \"media-playback-start\";\n        btn_resume.clicked.connect (on_btn_resume_clicked);\n        toolbar.add (btn_resume);\n\n        btn_line_by_line = new ToggleToolButton ();\n        btn_line_by_line.sensitive = true;\n        btn_line_by_line.icon_name = \"format-indent-less-rtl-symbolic\";\n        btn_line_by_line.toggled.connect (on_btn_line_by_line_toggled);\n        toolbar.add (btn_line_by_line);\n\n        box_main.pack_start (toolbar, false, true);\n\n        info_bar = new InfoBar();\n        var content_area = (Container)info_bar.get_content_area();\n        var info_box = new Box(Orientation.HORIZONTAL, 5);\n        info_box.pack_start (new Image.from_icon_name (\"dialog-error\", IconSize.LARGE_TOOLBAR), false, true);\n        info_box.pack_start (new Label (_(\"Received invalid ID. Try to rebuild.\")), true, true);\n        content_area.add (info_box);\n        content_area.show_all();\n        info_bar.no_show_all = true;\n        box_main.pack_start (info_bar, false, true);\n\n        mode_to_show (IdeModes.DEBUG);\n\n        source_viewer.current_sourceview_changed.connect (() => {\n            /* Don't enable button on non-source files. */\n            if (source_viewer.current_srcfocus != null &&\n                        project.guanako_project.get_source_file_by_name (\n                                    source_viewer.current_srcfocus) != null)\n                btn_add.sensitive = true;\n            else\n                btn_add.sensitive = false;\n        });\n\n        project.guanako_update_finished.connect(update_source_marks);\n\n        tree_view.cursor_changed.connect (() => {\n            TreePath path;\n            tree_view.get_cursor (out path, null);\n            if (path == null)\n                btn_remove.sensitive = false;\n            else\n                btn_remove.sensitive = true;\n        });\n\n        widget = box_main;\n    }\n\n    void timer_finished (FrankenStein.FrankenTimer timer, int timer_id, double time) {\n        widget_main.focus_dock_item (this.dock_item);\n\n        var pth = new TreePath.from_indices (timer_id);\n        TreeIter iter;\n        store.get_iter (out iter, pth);\n        store.set (iter, 2, time.to_string(), -1);\n        tree_view.set_cursor (pth, null, false);\n        source_viewer.focus_src (timer.file.filename);\n        var view = source_viewer.get_sourceview_by_file (timer.file.filename);\n        view.highlight_line (timer.start_line - 1);\n    }\n\n    void stop_reached (FrankenStein.FrankenStop stop, int stop_id) {\n        widget_main.focus_dock_item (this.dock_item);\n\n        var pth = new TreePath.from_indices (frankenstein.frankentimers.size + stop_id);\n        tree_view.set_cursor (pth, null, false);\n        btn_resume.sensitive = true;\n        source_viewer.focus_src (stop.file.filename);\n        var view = source_viewer.get_sourceview_by_file (stop.file.filename);\n        view.highlight_line (stop.line - 1);\n        resume_wait_loop.run();\n    }\n\n    void line_reached (int line, string filename) {\n        var view = source_viewer.get_sourceview_by_file (filename);\n        source_viewer.jump_to_position (filename, line - 1, 0, false);\n        view.highlight_line (line - 1);\n        btn_resume.sensitive = true;\n        resume_wait_loop.run();\n    }\n\n    void on_btn_line_by_line_toggled() {\n        frankenstein.activate_frankenline = btn_line_by_line.active;\n    }\n\n    void on_btn_resume_clicked() {\n        btn_resume.sensitive = false;\n        resume_wait_loop.quit();\n    }\n\n    void on_btn_add_clicked() {\n        TextIter iter_start;\n        TextIter iter_end;\n        /* Make sure current_srcfocus != null. */\n        var focus_file = project.guanako_project.get_source_file_by_name (\n                                                        source_viewer.current_srcfocus);\n        if (!source_viewer.current_srcbuffer.get_selection_bounds (out iter_start, out iter_end)) {\n            var mark_insert = source_viewer.current_srcbuffer.get_insert();\n            source_viewer.current_srcbuffer.get_iter_at_mark (out iter_start, mark_insert);\n            iter_end = iter_start;\n        }\n        if (iter_start.get_line() == iter_end.get_line()){\n            var new_stop = new FrankenStein.FrankenStop(focus_file, iter_start.get_line() + 1, true);\n            if (stop_exists (new_stop))\n                return;\n            frankenstein.frankenstops.add (new_stop);\n            btn_remove.sensitive = true;\n        } else {\n            var new_timer = new FrankenStein.FrankenTimer(focus_file, iter_start.get_line() + 1, iter_end.get_line() + 1, true);\n            if (timer_exists (new_timer))\n                return;\n            frankenstein.frankentimers.add (new_timer);\n            btn_remove.sensitive = true;\n        }\n        project_builder.request_compile();\n        build();\n    }\n\n    bool stop_exists (FrankenStein.FrankenStop stop) {\n        foreach (FrankenStein.FrankenStop s in frankenstein.frankenstops)\n            if (s != stop && s.line == stop.line && s.file == stop.file)\n                return true;\n        return false;\n    }\n\n    bool timer_exists (FrankenStein.FrankenTimer timer) {\n        foreach (FrankenStein.FrankenTimer t in frankenstein.frankentimers)\n            if (t != timer && t.start_line == timer.start_line && t.end_line == timer.end_line && t.file == timer.file)\n                return true;\n        return false;\n    }\n\n    void on_btn_remove_clicked() {\n        TreePath path;\n        tree_view.get_cursor (out path, null);\n        if (path == null)\n            return;\n        int index = path.get_indices()[0];\n        if (index < frankenstein.frankentimers.size)\n            frankenstein.frankentimers.remove_at (index);\n        else\n            frankenstein.frankenstops.remove_at (index - frankenstein.frankentimers.size);\n\n        if (frankenstein.frankentimers.size == 0 && frankenstein.frankenstops.size == 0)\n            btn_remove.sensitive = false;\n\n        project_builder.request_compile();\n        build();\n    }\n\n    public override void build() {\n        debug_msg (_(\"Run %s update!\\n\"), get_name());\n        \n        TreePath old_cursor;\n        tree_view.get_cursor (out old_cursor, null);\n\n        store = new Gtk.ListStore (3, typeof (string), typeof (string), typeof (string));\n        tree_view.set_model (store);\n\n\n        foreach (Guanako.FrankenStein.FrankenTimer timer in frankenstein.frankentimers) {\n            TreeIter next;\n            store.append (out next);\n            store.set (next,\n                       0,\n                       timer.start_line.to_string() + \" - \" + timer.end_line.to_string(),\n                       1,\n                       project.get_relative_path (timer.file.filename),\n                       -1);\n        }\n\n        foreach (Guanako.FrankenStein.FrankenStop stop in frankenstein.frankenstops) {\n            TreeIter next;\n            store.append (out next);\n            store.set (next,\n                       0,\n                       stop.line.to_string(),\n                       1,\n                       project.get_relative_path (stop.file.filename),\n                       -1);\n\n        }\n\n        if (old_cursor != null)\n            tree_view.set_cursor (old_cursor, null, false);\n\n        /* Clear existing marks */\n        project.foreach_buffer((s, bfr)=>{\n            TextIter first_iter;\n            TextIter end_iter;\n            bfr.get_start_iter (out first_iter);\n            bfr.get_end_iter (out end_iter);\n            bfr.remove_source_marks(first_iter, end_iter, \"timer\");\n            bfr.remove_source_marks(first_iter, end_iter, \"stop\");\n        });\n        map_timer_starts = new Gee.HashMap<Guanako.FrankenStein.FrankenTimer?, SourceMark>();\n        map_timer_ends = new Gee.HashMap<Guanako.FrankenStein.FrankenTimer?, SourceMark>();\n        map_breakpoints = new Gee.HashMap<Guanako.FrankenStein.FrankenStop?, SourceMark>();\n\n        /* Add marks */\n        foreach (FrankenStein.FrankenTimer timer in frankenstein.frankentimers) {\n            var bfr = project.get_buffer_by_file (timer.file.filename);\n            TextIter iter_start;\n            TextIter iter_end;\n            bfr.get_iter_at_line (out iter_start, timer.start_line - 1);\n            bfr.get_iter_at_line (out iter_end, timer.end_line - 1);\n\n            map_timer_starts[timer] = bfr.create_source_mark (null, \"timer\", iter_start);\n            map_timer_ends[timer] = bfr.create_source_mark (null, \"timer\", iter_end);\n        }\n        foreach (FrankenStein.FrankenStop stop in frankenstein.frankenstops) {\n            var bfr = project.get_buffer_by_file (stop.file.filename);\n            TextIter iter;\n            bfr.get_iter_at_line (out iter, stop.line - 1);\n\n            map_breakpoints[stop] = bfr.create_source_mark (null, \"stop\", iter);\n        }\n\n        debug_msg (_(\"%s update finished!\\n\"), get_name());\n    }\n\n    Gee.HashMap<FrankenStein.FrankenTimer?, SourceMark> map_timer_starts;\n    Gee.HashMap<FrankenStein.FrankenTimer?, SourceMark> map_timer_ends;\n    Gee.HashMap<FrankenStein.FrankenStop?, SourceMark> map_breakpoints;\n    void update_source_marks() {\n        bool need_update = false;\n\n        TextIter? iter = null;\n        map_timer_starts.map_iterator().foreach ((timer, mark) => {\n            var bfr = project.get_buffer_by_file (timer.file.filename);\n            bfr.get_iter_at_mark (out iter, mark);\n            if (iter == null)\n                return true;\n            if (timer.start_line != iter.get_line() + 1) {\n                timer.start_line = iter.get_line() + 1;\n                if (timer_exists (timer))\n                    frankenstein.frankentimers.remove (timer);\n                need_update = true;\n            }\n            return true;\n        });\n\n        map_timer_ends.map_iterator().foreach ((timer, mark) => {\n            var bfr = project.get_buffer_by_file (timer.file.filename);\n            bfr.get_iter_at_mark (out iter, mark);\n            if (iter == null)\n                return true;\n            if (timer.end_line != iter.get_line() + 1) {\n                timer.end_line = iter.get_line() + 1;\n                if (timer_exists (timer))\n                    frankenstein.frankentimers.remove (timer);\n                need_update = true;\n            }\n            return true;\n        });\n\n        map_breakpoints.map_iterator().foreach ((stop, mark) => {\n            var bfr = project.get_buffer_by_file (stop.file.filename);\n            bfr.get_iter_at_mark (out iter, mark);\n            if (iter == null)\n                return true;\n            if (stop.line != iter.get_line() + 1) {\n                stop.line = iter.get_line() + 1;\n                if (stop_exists (stop))\n                    frankenstein.frankenstops.remove (stop);\n                need_update = true;\n            }\n            return true;\n        });\n\n        if (need_update) {\n            project_builder.request_compile();\n            build();\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/build_output.vala",
    "content": "/*\n * src/ui/build_output.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Vala;\nusing GLib;\n\n/**\n * Browse source code.\n */\npublic class BuildOutput : UiElement {\n    private TextView textview;\n    private ProgressBar progressbar;\n    private bool focused;\n    private InfoBar info_bar;\n    private Label info_label;\n    private Image info_icon;\n\n    public BuildOutput() {\n        focused = false;\n\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        info_bar = new InfoBar();\n        info_bar.no_show_all = true;\n        var content_area = (Container)info_bar.get_content_area();\n        var info_box = new Box(Orientation.HORIZONTAL, 5);\n        info_label = new Label(\"\");\n        info_icon = new Image();\n        info_icon.icon_size = Gtk.IconSize.LARGE_TOOLBAR;\n        info_box.pack_start (info_icon, false, true);\n        info_box.pack_start (info_label, true, true);\n        content_area.add (info_box);\n        vbox.pack_start (info_bar, false, true);\n\n        textview = new TextView();\n        textview.override_font (Pango.FontDescription.from_string (\"Monospace 10\"));\n        textview.editable = false;\n        textview.wrap_mode = WrapMode.NONE;\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (textview);\n        vbox.pack_start (scrw, true, true);\n\n        double? prev_pos = null;\n        textview.size_allocate.connect (() => {\n            var adj = scrw.vadjustment;\n            if (prev_pos == null || adj.get_value() == prev_pos)\n                adj.set_value (adj.upper - adj.page_size);\n            prev_pos = adj.upper - adj.page_size;\n        });\n\n        progressbar = new ProgressBar();\n        vbox.pack_start (progressbar, false, true);\n        progressbar.visible = false;\n        progressbar.no_show_all = true;\n\n        widget = vbox;\n        widget.show_all();\n\n        project_builder.build_started.connect ((clear) => {\n            info_bar.no_show_all = false;\n            info_bar.show_all();\n            info_label.label = _(\"Running...\");\n            info_icon.icon_name = \"system-run\";\n            info_bar.set_message_type (MessageType.INFO);\n\n            if (clear) {\n                textview.buffer.text = \"\";\n                prev_pos = null;\n            }\n            focused = false;\n            progressbar.visible = true;\n        });\n        project_builder.build_finished.connect ((success)=> {\n            info_bar.no_show_all = false;\n            info_bar.show_all();\n            focused = false;\n            progressbar.visible = false;\n\n            if (success) {\n                info_label.label = _(\"Succeeded\");\n                info_icon.icon_name = \"gtk-ok\";\n                info_bar.set_message_type (MessageType.INFO);\n            } else {\n                info_label.label = _(\"Failed\");\n                info_icon.icon_name = \"dialog-error\";\n                info_bar.set_message_type (MessageType.ERROR);\n            }\n        });\n        project_builder.build_progress.connect (show_progress);\n        project_builder.build_output.connect (show_output);\n    }\n\n    private inline void show_progress (int percent) {\n        progressbar.fraction = percent / 100f;\n    }\n\n    private void show_output (string output) {\n        if (!focused) {\n            focused = true;\n            widget_main.focus_dock_item (this.dock_item);\n        }\n        textview.buffer.insert_at_cursor (output, -1);\n    }\n\n    protected override void build() {}\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/current_file_structure.vala",
    "content": "/*\n * src/ui/current_file_structure.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Vala;\nusing GLib;\n\n/**\n * Show current file's basic structure\n */\npublic class UiCurrentFileStructure : UiElement {\n    TreeView tree_view;\n    ToggleToolButton btn_show_private;\n    Gee.HashMap<string, Symbol> map_iter_symbols = new Gee.HashMap<string, Symbol>();\n    TreeStore store;\n    ToolButton btn_jump_to_declaration;\n    ToolButton btn_find_references;\n\n    Symbol current_symbol = null;\n\n    public UiCurrentFileStructure () {\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        var toolbar_title = new Toolbar ();\n        toolbar_title.get_style_context().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        var ti_title = new ToolItem();\n        ti_title.add (new Label (_(\"Current file\")));\n        toolbar_title.add(ti_title);\n\n        var separator_stretch = new SeparatorToolItem();\n        separator_stretch.set_expand (true);\n        separator_stretch.draw = false;\n        toolbar_title.add (separator_stretch);\n\n        btn_show_private = new ToggleToolButton ();\n        btn_show_private.clicked.connect (build);\n        btn_show_private.label = _(\"Private\");\n        btn_show_private.is_important = true;\n        toolbar_title.add (btn_show_private);\n\n        vbox.pack_start (toolbar_title, false, true);\n\n        tree_view = new TreeView();\n        tree_view.headers_visible = false;\n\n        var col = new TreeViewColumn();\n\n        tree_view.insert_column (col, -1);\n        var pixbuf_renderer = new CellRendererPixbuf();\n        col.pack_start (pixbuf_renderer, false);\n        col.set_attributes (pixbuf_renderer, \"pixbuf\", 1);\n\n        var text_renderer = new CellRendererText();\n        col.pack_start (text_renderer, true);\n        col.set_attributes (text_renderer, \"text\", 0);\n\n        tree_view.cursor_changed.connect (on_tree_view_cursor_changed);\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (tree_view);\n        vbox.pack_start (scrw, true, true);\n\n        source_viewer.current_sourceview_changed.connect (()=>{\n            cursor_pos_signal_view.disconnect(cursor_pos_signal_id);\n            cursor_pos_signal_id = source_viewer.current_srcview.buffer.notify[\"cursor-position\"].connect (text_cursor_moved);\n            build();\n        });\n        project.guanako_update_finished.connect (build);\n        cursor_pos_signal_id = source_viewer.current_srcview.buffer.notify[\"cursor-position\"].connect (text_cursor_moved);\n        cursor_pos_signal_view = source_viewer.current_srcview;\n\n        // Lower toolbar\n        var toolbar_current_symbol = new Toolbar();\n        toolbar_current_symbol.icon_size = IconSize.MENU;\n\n        btn_find_references = new ToolButton (null, null);\n        btn_find_references.icon_name = \"edit-redo-symbolic\";\n        btn_find_references.tooltip_text = _(\"find references\");\n        btn_find_references.is_important = true;\n        btn_find_references.clicked.connect (()=>{\n            TreeIter iter;\n            tree_view.get_selection().get_selected (null, out iter);\n            var path = store.get_path(iter);\n            if (path == null)\n                return;\n            Symbol smb = map_iter_symbols[path.to_string()];\n\n            var sf = project.guanako_project.get_source_file_by_name (source_viewer.current_srcfocus);\n            var refs = Guanako.Refactoring.find_references(project.guanako_project, sf, smb);\n            if (refs.length > 0) {\n                wdg_search.display_source_refs (refs, smb.name);\n            }\n\n        });\n        toolbar_current_symbol.add (btn_find_references);\n\n        btn_jump_to_declaration = new ToolButton (null, null);\n        btn_jump_to_declaration.icon_name = \"edit-undo-symbolic\";\n        btn_jump_to_declaration.tooltip_text = _(\"jump to declaration\");\n        btn_jump_to_declaration.is_important = true;\n        btn_jump_to_declaration.clicked.connect (()=>{\n            var smb = current_symbol; //Need to make a copy here, as current_symbol will change after jump\n            source_viewer.jump_to_position (smb.source_reference.file.filename,\n                                     smb.source_reference.begin.line - 1,\n                                     smb.source_reference.begin.column - 1);\n            source_viewer.current_srcview.highlight_line (smb.source_reference.begin.line - 1);\n        });\n        toolbar_current_symbol.add (btn_jump_to_declaration);\n\n        vbox.pack_start (toolbar_current_symbol, false, true);\n\n\n        widget = vbox;\n\n        lock (store)\n            build();\n    }\n\n    ulong cursor_pos_signal_id;\n    Gtk.SourceView cursor_pos_signal_view;\n\n    // Limit updating after cursor move to a reasonable interval\n    bool build_queued = false;\n    bool build_timeout = false;\n    void text_cursor_moved () {\n        if (!build_timeout) {\n            build();\n            update_current_symbol();\n            build_timeout = true;\n            Timeout.add (500, ()=>{\n                build_timeout = false;\n                if (build_queued) {\n                    build();\n                    update_current_symbol();\n                }\n                build_queued = false;\n                return false;\n            });\n        } else\n            build_queued = true;\n    }\n\n    void on_tree_view_cursor_changed() {\n        TreePath path;\n        tree_view.get_cursor (out path, null);\n        if (path == null)\n            return;\n        donotbuild = true;\n        Symbol smb = map_iter_symbols[path.to_string()];\n        source_viewer.jump_to_position (source_viewer.current_srcfocus,\n                                        smb.source_reference.begin.line - 1,\n                                        smb.source_reference.begin.column - 1);\n        source_viewer.current_srcview.highlight_line (smb.source_reference.begin.line - 1);\n    }\n\n    bool donotbuild = false;\n    protected override void build() {\n        if (donotbuild) {\n            donotbuild = false;\n            return;\n        }\n\n        store = new TreeStore (2, typeof (string), typeof (Gdk.Pixbuf));\n        tree_view.set_model (store);\n\n        if (!(source_viewer.current_srcfocus in project.files))\n            return;\n        debug_msg (_(\"Run %s update!\\n\"), get_name());\n\n        var focus_file = project.guanako_project.get_source_file_by_name (source_viewer.current_srcfocus);\n        if (focus_file == null) {\n            // TRANSLATORS: E.g. \"Project browser update finished ...\"\n            debug_msg (_(\"%s update finished (not a valid source buffer)!\\n\"), get_name());\n            return;\n        }\n\n        map_iter_symbols = new Gee.HashMap<string, Symbol>();\n\n        var mark_insert = source_viewer.current_srcbuffer.get_insert();\n        TextIter iter;\n        source_viewer.current_srcbuffer.get_iter_at_mark (out iter, mark_insert);\n\n        var current_symbol = project.guanako_project.get_symbol_at_pos (focus_file,\n                                                                        iter.get_line() + 1,\n                                                                        iter.get_line_offset() + 1);\n        TreeIter? current_iter = null;\n        foreach (CodeNode node in focus_file.get_nodes()) {\n            if (!(node is Namespace ||\n                  node is Property ||\n                  node is Vala.Signal ||\n                  node is Subroutine ||\n                  node is Variable ||\n                  node is TypeSymbol))\n                continue;\n\n            TreeIter parent;\n            store.append (out parent, null);\n\n            store.set (parent, 0, ((Symbol)node).name, 1, get_pixbuf_for_symbol ((Symbol) node), -1);\n            map_iter_symbols[store.get_path(parent).to_string()] = (Symbol)node;\n            if (node == current_symbol)\n                current_iter = parent;\n\n            TreeIter[] iters = new TreeIter[0];\n            Guanako.iter_symbol ((Symbol)node, (smb, depth) => {\n                if (depth == 0)\n                    return Guanako.IterCallbackReturns.CONTINUE;\n\n                if (smb.name != null && (smb is Constant ||\n                                         smb is Namespace ||\n                                         smb is Property ||\n                                         smb is Vala.Signal ||\n                                         smb is Subroutine ||\n                                         smb is Variable ||\n                                         smb is TypeSymbol)) {\n\n                    if (smb.access == SymbolAccessibility.PRIVATE)\n                        if (!btn_show_private.active)\n                            return Guanako.IterCallbackReturns.ABORT_BRANCH;\n\n                    TreeIter next;\n                    if (depth == 1)\n                        store.append (out next, parent);\n                    else\n                        store.append (out next, iters[depth - 2]);\n                    store.set (next, 0, smb.name, 1, get_pixbuf_for_symbol(smb), -1);\n                    if (smb == current_symbol)\n                        current_iter = next;\n                    map_iter_symbols[store.get_path(next).to_string()] = smb;\n                    if (iters.length < depth)\n                        iters += next;\n                    else\n                        iters[depth - 1] = next;\n                    return Guanako.IterCallbackReturns.CONTINUE;\n                } else\n                    return Guanako.IterCallbackReturns.ABORT_BRANCH;\n            });\n        }\n        tree_view.expand_all();\n        if (current_iter != null) {\n            tree_view.get_selection().select_iter (current_iter);\n            var path = store.get_path (current_iter);\n            tree_view.scroll_to_cell (path, null, true, 0.5f, 0);\n        }\n        btn_find_references.sensitive = current_iter != null;\n\n        debug_msg (_(\"%s update finished!\\n\"), get_name());\n    }\n\n    void update_current_symbol () {\n        TextIter iter;\n        source_viewer.current_srcbuffer.get_iter_at_mark (out iter, source_viewer.current_srcbuffer.get_insert());\n        var sf = project.guanako_project.get_source_file_by_name (source_viewer.current_srcfocus);\n        var line = iter.get_line() + 1;\n        var col = iter.get_line_offset() + 1;\n\n        current_symbol = Guanako.Refactoring.find_declaration(project.guanako_project, sf, line, col);\n\n        TextIter first_iter;\n        TextIter end_iter;\n        source_viewer.current_srcbuffer.get_start_iter (out first_iter);\n        source_viewer.current_srcbuffer.get_end_iter (out end_iter);\n        source_viewer.current_srcbuffer.remove_tag_by_name (\"symbol_used\", first_iter, end_iter);\n\n        if (current_symbol != null) {\n            btn_jump_to_declaration.label = current_symbol.name;\n\n            var srefs = Guanako.Refactoring.find_references (project.guanako_project, sf, current_symbol);\n            foreach (SourceReference sref in srefs) {\n                TextIter? match_start = null;\n                TextIter? match_end = null;\n                get_safe_iters_from_source_ref (source_viewer.current_srcbuffer, sref, ref match_start, ref match_end);\n                source_viewer.current_srcbuffer.apply_tag_by_name (\"symbol_used\", match_start, match_end);\n            }\n        }\n        btn_jump_to_declaration.sensitive = current_symbol != null;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/disabled/stylechecker.vala",
    "content": "/*\n * src/ui/stylechecker.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\n\n/**\n * Code style checker widget.\n */\npublic class UiStyleChecker : UiElement {\n    TreeView tree_view;\n\n    public UiStyleChecker() {\n        tree_view = new TreeView();\n        var line_renderer = new CellRendererText();\n        line_renderer.yalign = 0;\n        tree_view.cursor_changed.connect (on_tree_view_cursor_changed);\n        tree_view.insert_column_with_attributes (-1,\n                                                 _(\"Line\"),\n                                                 line_renderer,\n                                                 \"text\",\n                                                 0,\n                                                 null);\n\n        tree_view.insert_column_with_attributes (-1,\n                                                 \"\",\n                                                 new CellRendererText(),\n                                                 \"markup\",\n                                                 1,\n                                                 null);\n\n\n        var box_main = new Box (Orientation.VERTICAL, 0);\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (tree_view);\n        box_main.pack_start (scrw, true, true);\n\n        build();\n\n        widget = box_main;\n    }\n\n    public override void build() {\n        debug_msg (_(\"Checker loaded.\\n\"));\n    }\n\n    public void on_tree_view_cursor_changed() {}\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/glade_viewer.vala",
    "content": "using Gtk;\nusing Glade;\nusing Gdl;\n\npublic class GladeViewer : UiElement\n{\n    Box vbox;\n    \n    Project glade_project;\n    Inspector inspector;\n    DesignView design_view;\n    Palette palette;\n    Editor editor;\n    SignalEditor signals;\n    DockItem dv_item;\n    string project_path;\n    \n    public GladeViewer()\n    {\n        vbox = new Box (Orientation.VERTICAL, 0);\n        App.set_window (vbox);\n        glade_project = new Project();\n        App.add_project (glade_project);\n        inspector = new Inspector();\n        palette = new Palette();\n        editor = new Editor();\n        signals = new SignalEditor();\n        inspector.selection_changed.connect (() => {\n            var w = inspector.get_selected_items().nth_data (0);\n            w.show();\n            editor.load_widget (w);\n        });\n        inspector.item_activated.connect (() => {\n            var w = inspector.get_selected_items().nth_data (0);\n            w.show();\n            editor.load_widget (w);\n            signals.load_widget (w);\n        });\n        var dock = new Dock();\n        var bar = new DockBar (dock);\n        var toolbar = new Toolbar ();\n        toolbar.get_style_context().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        var btn_save = new ToolButton (null, null);\n        btn_save.icon_name = \"document-save\";\n        btn_save.tooltip_text = \"save this UI\";\n        btn_save.clicked.connect (() => {\n            try {\n                glade_project.save (project_path);\n            } catch {\n            \n            }\n        });\n        toolbar.add (btn_save);\n        vbox.pack_start (toolbar, false, true, 0);\n        var box = new Box (Orientation.HORIZONTAL, 0);\n        box.pack_start (bar, false, false, 0);\n        box.pack_end (dock, true, true, 0);\n        vbox.pack_start (box);\n        var item1 = new DockItem (\"palette\", \"Palette\", DockItemBehavior.NORMAL);\n        var item2 = new DockItem (\"editor\", \"Editor\", DockItemBehavior.NORMAL);\n        dv_item = new DockItem (\"designview\", \"Design View\", DockItemBehavior.NORMAL);\n        var item4 = new DockItem.with_stock (\"inspector\", \"Inspector\", \"gtk-find\", DockItemBehavior.NORMAL);\n        var item5 = new DockItem.with_stock (\"Signals\", \"Signals\", \"gtk-find\", DockItemBehavior.NORMAL);\n        item1.add (palette);\n        item2.add (editor);\n        item4.add (inspector);\n        item5.add (signals);\n        dock.add_item (item1, DockPlacement.TOP);\n        dock.add_item (item2, DockPlacement.BOTTOM);\n        dock.add_item (dv_item, DockPlacement.RIGHT);\n        dock.add_item (item4, DockPlacement.LEFT);\n        dock.add_item (item5, DockPlacement.LEFT);\n        dv_item.dock_to (item1, DockPlacement.TOP, -1);\n        item1.show();\n        item2.show();\n        item4.show();\n        item5.show();\n        palette.show();\n        editor.show();\n        inspector.show();\n        signals.show();\n        project.guanako_update_finished.connect (build);\n        widget = vbox;\n    }\n    \n    public void load (string path)\n    {\n        if (glade_project != null)\n            App.remove_project (glade_project);\n        project_path = path;\n        glade_project = Project.load (path);\n        App.add_project (glade_project);\n        inspector.project = glade_project;\n        palette.project = glade_project;\n        design_view = new DesignView (glade_project);\n        dv_item.set_child (design_view);\n        dv_item.show();\n        design_view.show();\n        vbox.show_all();\n    }\n    \n    protected override void build ()\n    {\n        \n    }\n}\n"
  },
  {
    "path": "src/ui/project_browser.vala",
    "content": "/*\n * src/ui/project_browser.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Vala;\nusing GLib;\n\n/**\n * Browse source code.\n */\npublic class ProjectBrowser : UiElement {\n    private TreeView tree_view;\n\n    private Gee.ArrayList<TreePath> tree_view_expanded;\n\n    private bool update_needed = true;\n\n    public ProjectBrowser (ValamaProject? vproject = null) {\n        if (vproject != null)\n            project = vproject;\n\n        tree_view = new TreeView();\n        tree_view.headers_visible = false;\n\n        var filename_column = new TreeViewColumn();\n        var filename_column_icon_renderer = new CellRendererPixbuf();\n        var filename_column_text_renderer = new CellRendererText();\n        filename_column.pack_start (filename_column_icon_renderer, false);\n        filename_column.pack_start (filename_column_text_renderer, false);\n        filename_column.set_attributes (filename_column_icon_renderer, \"icon-name\", 0, null);\n        filename_column.set_attributes (filename_column_text_renderer, \"text\", 1, null);\n        tree_view.append_column (filename_column);\n\n        tree_view_expanded = new Gee.ArrayList<TreePath>();\n        build();\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (tree_view);\n\n        var toolbar = new Toolbar();\n        toolbar.icon_size = IconSize.MENU;\n\n        var btn_add = new ToolButton (null, null);\n        btn_add.icon_name = \"list-add-symbolic\";\n        btn_add.clicked.connect (() => {\n            on_add_button();\n        });\n        btn_add.sensitive = false;\n        toolbar.add (btn_add);\n\n        var btn_rem = new ToolButton (null, null);\n        btn_rem.icon_name = \"list-remove-symbolic\";\n        btn_rem.clicked.connect (on_remove_button);\n        btn_rem.sensitive = false;\n        toolbar.add (btn_rem);\n\n        var btn_mkdir = new ToolButton (null, null);\n        btn_mkdir.icon_name = \"folder-symbolic\";\n        btn_mkdir.clicked.connect (() => {\n            on_add_button (true);\n        });\n        btn_mkdir.sensitive = false;\n        btn_mkdir.no_show_all = true;\n        toolbar.add (btn_mkdir);\n\n        var toolbar_title = new Toolbar ();\n        toolbar_title.get_style_context().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        var ti_title = new ToolItem();\n        var plabel = new Label (project.project_name);\n        ti_title.add (plabel);\n        toolbar_title.add(ti_title);\n\n        project.notify[\"project-name\"].connect (() => {\n            ti_title.remove (plabel);\n            plabel = new Label (project.project_name);\n            ti_title.add (plabel);\n            ti_title.show_all();\n        });\n\n        var separator_stretch = new SeparatorToolItem();\n        separator_stretch.set_expand (true);\n        separator_stretch.draw = false;\n        toolbar_title.add (separator_stretch);\n\n        var btnSettings = new Gtk.ToolButton (null, null);\n        btnSettings.icon_name = \"emblem-system-symbolic\";\n        toolbar_title.add (btnSettings);\n        btnSettings.set_tooltip_text (_(\"Settings\"));\n        btnSettings.clicked.connect (() => {\n            ui_project_dialog (project);\n        });\n\n        var vbox = new Box (Orientation.VERTICAL, 0);\n        vbox.pack_start (toolbar_title, false, true);\n        vbox.pack_start (scrw, true, true);\n        vbox.pack_start (toolbar, false, true);\n\n        widget = vbox;\n\n        tree_view.row_activated.connect ((path, column) => {\n            TreeIter iter;\n            if (!tree_view.model.get_iter (out iter, path)) {\n                bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n                return;\n            }\n\n            StoreType store_type;\n            string val;\n            tree_view.model.get (iter, 1, out val, 2, out store_type, -1);\n            switch (store_type) {\n                case StoreType.FILE:\n                    string filepath = val;\n                    while (path.up()) {\n                        if (!tree_view.model.get_iter (out iter, path)) {\n                            bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n                            return;\n                        }\n                        tree_view.model.get (iter, 1, out val, 2, out store_type, -1);\n                        if (store_type == StoreType.FILE_TREE)\n                            break;\n                        filepath = Path.build_path (Path.DIR_SEPARATOR_S, val, filepath);\n                    }\n                    file_selected (project.get_absolute_path (filepath));\n                    break;\n                case StoreType.FILE_TREE:\n                case StoreType.DIRECTORY:\n                case StoreType.PACKAGE_TREE:\n                    on_add_button();\n                    break;\n                case StoreType.PACKAGE:\n                    break;\n                default:\n                    bug_msg (_(\"Unexpected enum value: %s: %u\\n\"),\n                             \"ui_project_browser - row_activated\", store_type);\n                    break;\n            }\n        });\n\n        tree_view.cursor_changed.connect (() => {\n            TreePath path;\n            tree_view.get_cursor (out path, null);\n            if (path == null) {  // no bug -> focus changed to other widget\n                btn_add.sensitive = false;\n                btn_add.tooltip_text = \"\";\n                btn_rem.sensitive = false;\n                btn_rem.tooltip_text = \"\";\n                btn_mkdir.sensitive = false;\n                btn_mkdir.tooltip_text = \"\";\n                return;\n            }\n\n            TreeIter iter;\n            if (!tree_view.model.get_iter (out iter, path)) {\n                bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n                return;\n            }\n\n            StoreType store_type;\n            string val;\n            tree_view.model.get (iter, 1, out val, 2, out store_type, -1);\n\n            switch (store_type) {\n                case StoreType.PACKAGE_TREE:\n                    btn_add.sensitive = true;\n                    btn_add.tooltip_text = _(\"Add new package\");\n                    btn_rem.sensitive = false;\n                    btn_rem.tooltip_text = \"\";\n                    btn_mkdir.hide();\n                    break;\n                case StoreType.FILE_TREE:\n                case StoreType.DIRECTORY:\n                    btn_add.sensitive = true;\n                    btn_add.tooltip_text = _(\"Add new file\");\n                    btn_rem.sensitive = false;\n                    // btn_rem.tooltip_text = _(\"Remove directory (from disk)\");\n                    btn_rem.tooltip_text = \"\";\n                    btn_mkdir.sensitive = true;\n                    btn_mkdir.tooltip_text = _(\"Add new directory\");\n                    btn_mkdir.show();\n                    break;\n                case StoreType.PACKAGE:\n                    btn_add.sensitive = true;\n                    btn_add.tooltip_text = _(\"Add new package\");\n                    btn_rem.sensitive = true;\n                    btn_rem.tooltip_text = _(\"Remove package\");\n                    btn_mkdir.hide();\n                    break;\n                case StoreType.FILE:\n                    btn_add.sensitive = true;\n                    btn_add.tooltip_text = _(\"Add new file\");\n                    btn_rem.sensitive = true;\n                    btn_rem.tooltip_text = _(\"Remove file (from disk)\");\n                    btn_mkdir.sensitive = true;\n                    btn_mkdir.tooltip_text = _(\"Add new directory\");\n                    btn_mkdir.show();\n                    break;\n                default:\n                    bug_msg (_(\"Unexpected enum value: %s: %u\\n\"),\n                             \"ui_project_browser - cursor_changed\", store_type);\n                    btn_add.sensitive = false;\n                    btn_add.tooltip_text = \"\";\n                    btn_rem.sensitive = false;\n                    btn_rem.tooltip_text = \"\";\n                    btn_mkdir.hide();\n                    break;\n            }\n        });\n\n        this.notify[\"project\"].connect (init);\n        init();\n    }\n\n    private void init() {\n        project.source_files_changed.connect (() => {\n            if (!project.add_multiple_files)\n                build();\n            else\n                update_needed = true;;\n        });\n        project.ui_files_changed.connect (() => {\n            if (!project.add_multiple_files)\n                build();\n            else\n                update_needed = true;;\n        });\n        project.buildsystem_files_changed.connect (() => {\n            if (!project.add_multiple_files)\n                build();\n            else\n                update_needed = true;;\n        });\n        project.data_files_changed.connect (() => {\n            if (!project.add_multiple_files)\n                build();\n            else\n                update_needed = true;;\n        });\n        project.packages_changed.connect (() => {\n            if (!project.add_multiple_files)\n                build();\n            else\n                update_needed = true;;\n        });\n        project.notify[\"add-multiple-files\"].connect (() => {\n            if (!project.add_multiple_files && update_needed)\n                build();\n        });\n    }\n\n    public signal void file_selected (string filename);\n\n    /**\n     * Map path name to {@link Gtk.TreeIter} to build up correctly folded\n     * {@link Gtk.TreeView}.\n     */\n    private Gee.HashMap<string, TreeIter?> pathmap;\n    /**\n     * Same as {@link pathmap} for user interface files.\n     */\n    private Gee.HashMap<string, TreeIter?> u_pathmap;\n    /**\n     * Same as {@link pathmap} for build system files.\n     */\n    private Gee.HashMap<string, TreeIter?> b_pathmap;\n    /**\n     * Same as {@link pathmap} for data files.\n     */\n    private Gee.HashMap<string, TreeIter?> d_pathmap;\n\n    //TODO: Don't rebuild complete store on update.\n    protected override void build() {\n        // TRANSLATORS: E.g. \"Run project browser update!\"\n        debug_msg (_(\"Run %s update!\\n\"), get_name());\n        update_needed = false;\n\n        var store = new TreeStore (3, typeof (string), typeof (string), typeof (int));\n        tree_view.set_model (store);\n\n        pathmap = new Gee.HashMap<string, TreeIter?>();\n        u_pathmap = new Gee.HashMap<string, TreeIter?>();\n        b_pathmap = new Gee.HashMap<string, TreeIter?>();\n        d_pathmap = new Gee.HashMap<string, TreeIter?>();\n\n        build_file_treestore (_(\"Sources\"),\n                              project.source_dirs.to_array(),\n                              project.files.to_array(),\n                              ref store, ref u_pathmap);\n        build_file_treestore (_(\"User interface files\"),\n                              project.ui_dirs.to_array(),\n                              project.u_files.to_array(),\n                              ref store, ref pathmap);\n        build_file_treestore (_(\"Build system files\"),\n                              project.buildsystem_dirs.to_array(),\n                              project.b_files.to_array(),\n                              ref store, ref b_pathmap);\n        // TRANSLATORS:\n        // \"Data files\" means the file is neighter a (Vala) source file nor a\n        // a build system file nor a user interface file - it's an other file\n        // or data file.\n        build_file_treestore (_(\"Data files\"),\n                              project.data_dirs.to_array(),\n                              project.d_files.to_array(),\n                              ref store, ref d_pathmap);\n        build_plain_treestore (_(\"Packages\"),\n                              project.packages.keys.to_array(),\n                              ref store);\n\n        tree_view.row_collapsed.connect ((iter, path) => {\n            if (path in tree_view_expanded)\n                tree_view_expanded.remove (path);\n        });\n        tree_view.row_expanded.connect ((iter, path) => {\n            if (!(path in tree_view_expanded))\n                tree_view_expanded.add (path);\n        });\n\n        foreach (var path in tree_view_expanded)\n            tree_view.expand_to_path (path);\n\n        // TRANSLATORS: E.g. \"Project browser update finished!\"\n        debug_msg (_(\"%s update finished!\\n\"), get_name());\n    }\n    \n    /**\n     * Select Vala packages to add/remove to/from build system (with valac).\n     */\n    private static string[] package_selection_dialog (ValamaProject project) {\n\n        Dialog dlg = new Dialog.with_buttons (_(\"Select new packages\"),\n                                              window_main,\n                                              DialogFlags.MODAL,\n                                              _(\"_Cancel\"),\n                                              ResponseType.REJECT,\n                                              _(\"_Ok\"),\n                                              ResponseType.ACCEPT);\n\n        var tree_view = new TreeView();\n        var listmodel = new Gtk.ListStore (3, typeof (bool), typeof (string), typeof (string));\n        tree_view.set_model (listmodel);\n        CellRendererToggle toggle = new CellRendererToggle();\n        toggle.toggled.connect ((toggle, path) => {\n            TreePath tree_path = new TreePath.from_string (path);\n            TreeIter iter;\n            listmodel.get_iter (out iter, tree_path);\n            listmodel.set (iter, 0, !toggle.active);\n        });\n        TreeViewColumn column = new TreeViewColumn();\n        column.pack_start (toggle, false);\n        column.add_attribute (toggle, \"active\", 0);\n        tree_view.append_column (column);\n        \n        CellRendererText text = new CellRendererText();\n        column = new TreeViewColumn();\n        column.title = \"Package\";\n        column.pack_start (text, true);\n        column.add_attribute (text, \"text\", 1);\n        tree_view.append_column (column);\n        \n        CellRendererText desc_text = new CellRendererText();\n        column = new TreeViewColumn();\n        column.title = \"Description\";\n        column.pack_start (desc_text, true);\n        column.add_attribute (desc_text, \"text\", 2);\n        tree_view.append_column (column);\n\n\n        var scrw = new ScrolledWindow (null, null);\n        dlg.get_content_area().pack_start (scrw);\n        /*\n         * TODO: Include dialog into main window or find a solution to don't\n         *       hardcore window size.\n         */\n        dlg.set_default_size (800, 600);\n\n        var pkg_infos = list_all_pkg_config();\n        \n        foreach (var pkg in Guanako.get_available_packages().get_keys()) {\n            if (pkg in project.packages.keys)  //Ignore packages that are already selected\n                continue;\n            TreeIter iter;\n            /*\n                Don't include package in store if .pc file is missing.\n            */\n            if (pkg_infos[pkg] != null)\n            {\n                listmodel.append (out iter);\n                listmodel.set (iter, 0, false, 1, pkg, 2, pkg_infos[pkg]);\n            }\n        }\n        scrw.add (tree_view);\n        scrw.show_all();\n        var glist = new Gee.ArrayList<string>();\n        if (dlg.run() == ResponseType.ACCEPT) {\n            listmodel.foreach((m,p,i) => {\n                Value v1, v2;\n                m.get_value(i, 0, out v1);\n                m.get_value(i, 1, out v2);\n                if((bool)v1)\n                    glist.add((string)v2);\n                return false;\n            });\n        }\n        dlg.destroy();\n        return glist.to_array();\n    }\n\n    private void on_add_button (bool directory = false) {\n        TreePath path;\n        tree_view.get_cursor (out path, null);\n        if (path == null) {\n            // TRANSLATORS: This is a technical information. You might not want\n            // to translate \"TreePath\".\n            bug_msg (_(\"Could not get current TreePath: %s\\n\"), \"ui_project_browser - on_add_button\");\n            return;\n        }\n\n        TreeIter iter;\n        if (!tree_view.model.get_iter (out iter, path)) {\n            // TRANSLATORS: This is a technical information. You might not want\n            // to translate \"TreeView\".\n            bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n            return;\n        }\n        \n        // save current path to prevent future iteration.\n        BrowserPath current_path = new BrowserPath (path);\n\n        StoreType store_type;\n        string val;\n        tree_view.model.get (iter, 1, out val, 2, out store_type, -1);\n\n        switch (store_type) {\n            case StoreType.FILE_TREE:\n                string? filename = null;\n                switch (path.get_indices()[0]) {\n                    case 0:\n                        filename = ui_create_file_dialog (null, \"vala\", directory);\n                        project.add_source_file (filename, directory);\n                        break;\n                    case 1:\n                        filename = ui_create_file_dialog (null, \"ui\", directory);\n                        project.add_ui_file (filename, directory);\n                        break;\n                    case 2:\n                        filename = ui_create_file_dialog (null, null, directory);\n                        project.add_buildsystem_file (filename, directory);\n                        break;\n                    case 3:\n                        filename = ui_create_file_dialog (null, null, directory);\n                        project.add_data_file (filename, directory);\n                        break;\n                    default:\n                        // TRANSLATORS: This is a technical information. You might not want\n                        // to translate \"TreePath\".\n                        bug_msg (_(\"Unknown TreePath start to add a new file: %s\\n\"), path.to_string());\n                        break;\n                }\n                if (filename != null && !directory)\n                    on_file_selected (filename);\n                break;\n            case StoreType.FILE:\n            case StoreType.DIRECTORY:\n                string filepath = val;\n                StoreType stype;\n                while (path.up()) {\n                    if (!tree_view.model.get_iter (out iter, path)) {\n                        bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n                        return;\n                    }\n                    tree_view.model.get (iter, 1, out val, 2, out stype, -1);\n                    if (stype == StoreType.FILE_TREE)\n                        break;\n                    filepath = Path.build_path (Path.DIR_SEPARATOR_S, val, filepath);\n                }\n                if (store_type == StoreType.FILE)\n                    filepath = Path.get_dirname (filepath);\n                    \n                string? filename = null;\n                switch (current_path.path_type) {\n                    case BrowserPathType.SOURCE:\n                        filename = ui_create_file_dialog (filepath, \"vala\", directory);\n                        project.add_source_file (filename, directory);\n                        break;\n                    case BrowserPathType.PACKAGE:\n                        filename = ui_create_file_dialog (filepath, \"vapi\", directory);\n                        project.add_source_file (filename, directory);\n                        break;\n                    case BrowserPathType.UI:\n                        filename = ui_create_file_dialog (filepath, \"ui\", directory);\n                        project.add_ui_file (filename, directory);\n                        break;\n                    case BrowserPathType.BUILDSYSTEM:\n                        filename = ui_create_file_dialog (filepath, null, directory);\n                        project.add_buildsystem_file (filename, directory);\n                        break;\n                    case BrowserPathType.DATA:\n                        filename = ui_create_file_dialog (filepath, null, directory);\n                        project.add_data_file (filename, directory);\n                        break;\n                    default:\n                        bug_msg (_(\"Unknown TreePath start to add a new file: %s\\n\"), path.to_string());\n                        break;\n                }\n                if (filename != null && !directory)\n                    on_file_selected (filename);\n                break;\n            case StoreType.PACKAGE_TREE:\n            case StoreType.PACKAGE:\n                if (!directory) {\n                    var pkgs = package_selection_dialog (project);\n                    if (pkgs.length > 0) {\n                        string[]? missing_packages = project.add_packages_by_names (pkgs);\n                        if (missing_packages != null && missing_packages.length > 0)\n                            ui_missing_packages_dialog (missing_packages);\n                    }\n                } else\n                    bug_msg (_(\"Unexpected enum value: %s: %s\\n\"),\n                             \"ui_project_browser - add_button\", store_type.to_string());\n                break;\n            default:\n                bug_msg (_(\"Unexpected enum value: %s: %u\\n\"),\n                         \"ui_project_browser - add_button\", store_type);\n                break;\n        }\n    }\n\n    private void on_remove_button() {\n        TreePath path;\n        tree_view.get_cursor (out path, null);\n        if (path == null) {\n            bug_msg (_(\"Could not get current TreePath: %s\\n\"), \"ui_project_browser - on_remove_button\");\n            return;\n        }\n\n        TreeIter iter;\n        if (!tree_view.model.get_iter (out iter, path)) {\n            bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n            return;\n        }\n\n        StoreType store_type;\n        string val;\n        tree_view.model.get (iter, 1, out val, 2, out store_type, -1);\n\n        switch (store_type) {\n            case StoreType.PACKAGE_TREE:\n            case StoreType.FILE_TREE:\n            case StoreType.DIRECTORY:  //TODO: Remove directory.\n                break;\n            case StoreType.FILE:\n                string filepath = val;\n                StoreType stype;\n                while (path.up()) {\n                    if (!tree_view.model.get_iter (out iter, path)) {\n                        bug_msg (_(\"Could not get iterator in TreeView: %s\\n\"), path.to_string());\n                        return;\n                    }\n                    tree_view.model.get (iter, 1, out val, 2, out stype, -1);\n                    if (stype == StoreType.FILE_TREE)\n                        break;\n                    filepath = Path.build_path (Path.DIR_SEPARATOR_S, val, filepath);\n                }\n                var abs_filepath = project.get_absolute_path (filepath);\n                var rel_filepath = project.get_relative_path (filepath);\n\n                //TODO: Add possibility to only remove file from project.\n                if (ui_ask_warning (_(\"Do you want to delete this file?\"),\n                                    Markup.escape_text (rel_filepath)) == ResponseType.YES) {\n                    var file = File.new_for_path (abs_filepath);\n                    source_viewer.close_srcitem (abs_filepath);\n\n                    switch (path.get_indices()[0]) {\n                        case 0:\n                            project.remove_source_file (abs_filepath);\n                            break;\n                        case 1:\n                            project.remove_ui_file (abs_filepath);\n                            break;\n                        case 2:\n                            project.remove_buildsystem_file (abs_filepath);\n                            break;\n                        case 3:\n                            project.remove_data_file (abs_filepath);\n                            break;\n                        default:\n                            bug_msg (_(\"Unknown TreePath start to add a new file: %s\\n\"), path.to_string());\n                            break;\n                    }\n                    /*\n                     * Not necessary here because pathmap will completely\n                     * rebuild. But remove it for future better\n                     * implementations.\n                     */\n                    //pathmap.unset (filepath);\n                    try {\n                        //TODO: Backup file?\n                        file.delete();\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Unable to delete source file '%s': %s\\n\"), filepath, e.message);\n                    }\n                }\n                break;\n            case StoreType.PACKAGE:\n                project.remove_package_by_name (val);\n                break;\n            default:\n                bug_msg (_(\"Unexpected enum value: %s: %u\\n\"),\n                         \"ui_project_browser - cursor_changed\", store_type);\n                break;\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/reports.vala",
    "content": "/*\n * src/ui/reports.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\nusing Gee;\nusing Guanako;\n\n/**\n * Report build status and code warnings/errors.\n */\nclass UiReport : UiElement {\n    TreeView tree_view = null;\n    Gtk.ListStore store;\n    ScrolledWindow scrw;\n    Gdk.Pixbuf pixmap_err;\n    Gdk.Pixbuf pixmap_warn;\n    Gdk.Pixbuf pixmap_depr;\n    Gdk.Pixbuf pixmap_exp;\n    Gdk.Pixbuf pixmap_note;\n\n    /* Sort order and sort column for showall display mode. */\n    //TODO: Make this a configuration option.\n    private SortType? sort_order_all = null;\n    private int? sort_id_all = null;\n    /* Sort order and sort column for file specific display mode. */\n    private SortType? sort_order = null;\n    private int? sort_id = null;\n    /**\n     * Synchronize sort order for file specific and display all modes.\n     */\n    private bool sort_sync = true;\n\n    private ReportType _reptype;\n    public ReportType reptype {\n        get {\n            return _reptype;\n        }\n        set {\n            if (tree_view != null)\n                build();\n            _reptype = value;\n        }\n    }\n\n    private bool _showall;\n    public bool showall {\n        get {\n            return _showall;\n        }\n        set {\n            if (tree_view != null)\n                scrw.remove (tree_view);\n\n            tree_view = new TreeView();\n\n            var column_pix = new TreeViewColumn.with_attributes (\n                                                     null,\n                                                     new CellRendererPixbuf(),\n                                                     \"pixbuf\",\n                                                     0,\n                                                     null);\n            column_pix.sort_column_id = 0;\n            tree_view.append_column (column_pix);\n\n            if (value) {\n                var column_file = new TreeViewColumn.with_attributes (\n                                                    _(\"File\"),\n                                                    new CellRendererText(),\n                                                    \"text\",\n                                                    1,\n                                                    null);\n                column_file.sort_column_id = 1;\n                tree_view.append_column (column_file);\n            }\n\n            var column_loc = new TreeViewColumn.with_attributes (\n                                                     _(\"Location\"),\n                                                     new CellRendererText(),\n                                                     \"text\",\n                                                     (int) value + 1,\n                                                     null);\n            if (!value)\n                column_loc.sort_column_id = 1;\n            tree_view.append_column (column_loc);\n\n            var column_errline = new TreeViewColumn.with_attributes (\n                                                     _(\"Error\"),\n                                                     new CellRendererText(),\n                                                     \"text\",\n                                                     (int) value + 2,\n                                                     null);\n            column_errline.sort_column_id = (int) value + 2;\n            tree_view.append_column (column_errline);\n            tree_view.can_focus = false;\n\n            var column_err = new TreeViewColumn();\n            column_err.visible = false;\n            tree_view.append_column (column_err);\n\n            tree_view.row_activated.connect ((path) => {\n                TreeIter iter;\n                store.get_iter (out iter, path);\n\n                Value err_val;\n                store.get_value (iter, (int) value + 3, out err_val);\n                var err = err_val as Reporter.Error;\n                if (err != null) {\n                    source_viewer.jump_to_position (err.source.file.filename,\n                                                    err.source.begin.line - 1,\n                                                    err.source.begin.column - 1);\n                    source_viewer.current_srcview.highlight_line (err.source.begin.line - 1);\n                } else\n                    bug_msg (_(\"Could not get %s from %s: %s\\n\"),\n                             \"Reporter.Error\", \"ListStore\", \"show_all.set\");\n            });\n\n            scrw.add (tree_view);\n            scrw.show_all();\n\n            _showall = value;\n            build();\n\n        }\n    }\n\n    public UiReport (ReportType reptype = ReportType.ALL, bool showall = false) {\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        scrw = new ScrolledWindow (null, null);\n        vbox.pack_start (scrw, true, true);\n\n        this.reptype = reptype;\n        this.showall = showall;\n\n        var btn_showall = new CheckButton.with_label (_(\"Display all\"));\n        btn_showall.active = showall;\n        btn_showall.toggled.connect (() => {\n            this.showall = btn_showall.active;\n        });\n        vbox.pack_start (btn_showall, false, true);\n\n        var theme = IconTheme.get_default();\n        try {\n            //TODO: Does this use fallback icon?\n            pixmap_err = theme.load_icon (\"dialog-error\", IconSize.MENU, IconLookupFlags.GENERIC_FALLBACK);\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not load theme icon: %s\\n\"), e.message);\n        }\n        try {\n            pixmap_warn = theme.load_icon (\"dialog-warning\", IconSize.MENU, IconLookupFlags.GENERIC_FALLBACK);\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not load theme icon: %s\\n\"), e.message);\n        }\n        try {\n            pixmap_depr = theme.load_icon (\"dialog-question\", IconSize.MENU, IconLookupFlags.GENERIC_FALLBACK);\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not load theme icon: %s\\n\"), e.message);\n        }\n        try {\n            pixmap_exp = theme.load_icon (\"help-about\", IconSize.MENU, IconLookupFlags.GENERIC_FALLBACK);\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not load theme icon: %s\\n\"), e.message);\n        }\n        try {\n            pixmap_note = theme.load_icon (\"dialog-information\", IconSize.MENU, IconLookupFlags.GENERIC_FALLBACK);\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not load theme icon: %s\\n\"), e.message);\n        }\n\n        project.guanako_update_finished.connect (build);\n        source_viewer.current_sourceview_changed.connect (() => {\n            if (!this.showall)\n                build();\n        });\n\n        widget = vbox;\n    }\n\n    private int comp_err_filename (TreeModel model, TreeIter a, TreeIter b) {\n        Value a_str;\n        Value b_str;\n        model.get_value (a, 1, out a_str);\n        model.get_value (b, 1, out b_str);\n        var ret = strcmp ((string) a_str, (string) b_str);\n        if (ret != 0)\n            return ret;\n\n        Value a_int;\n        Value b_int;\n        model.get_value (a, 2, out a_int);\n        model.get_value (b, 2, out b_int);\n        return (int) a_int - (int) b_int;\n    }\n\n    private int comp_err_pixbuf (TreeModel model, TreeIter a, TreeIter b) {\n        Value a_pix;\n        Value b_pix;\n        model.get_value (a, 0, out a_pix);\n        model.get_value (b, 0, out b_pix);\n        var ret = errpix_to_int ((Gdk.Pixbuf) a_pix) - errpix_to_int ((Gdk.Pixbuf) b_pix);\n        if (ret != 0)\n            return ret;\n\n        ret = comp_err_filename (model, a, b);\n        if (tree_view.get_column (0).sort_order == SortType.ASCENDING)\n            return ret;\n        else\n            return (-1)*ret;\n    }\n\n    private int errpix_to_int (Gdk.Pixbuf pixbuf) {\n        if (pixbuf == pixmap_err)\n            return 1;\n        else if (pixbuf == pixmap_warn)\n            return 2;\n        else if (pixbuf == pixmap_depr)\n            return 3;\n        else if (pixbuf == pixmap_exp)\n            return 4;\n        else if (pixbuf == pixmap_note)\n            return 5;\n        bug_msg (_(\"No valid pixbuf (%s).\\n\"), \"UiReport.errpix_to_int\");\n        return -1;\n    }\n\n    private int comp_err_errors (TreeModel model, TreeIter a, TreeIter b) {\n        Value a_str;\n        Value b_str;\n        model.get_value (a, (int) showall + 2, out a_str);\n        model.get_value (b, (int) showall + 2, out b_str);\n        var ret = strcmp ((string) a_str, (string) b_str);\n        if (ret != 0)\n            return ret;\n\n        ret = comp_err_filename (model, a, b);\n        if (tree_view.get_column ((int) showall + 2).sort_order == SortType.ASCENDING)\n            return ret;\n        else\n            return (-1)*ret;\n    }\n\n    public override void build() {\n        if (showall) {\n            store = new Gtk.ListStore (5, typeof (Gdk.Pixbuf),\n                                      typeof (string),\n                                      typeof (int),\n                                      typeof (string),\n                                      typeof (Reporter.Error));\n            store.set_sort_func (1, comp_err_filename);\n            store.set_sort_func (0, comp_err_pixbuf);\n            store.set_sort_func ((int) showall + 2, comp_err_errors);\n\n            if (sort_order_all != null && sort_id_all != null)\n                store.set_sort_column_id (sort_id_all, sort_order_all);\n            else\n                store.set_sort_column_id (1, SortType.ASCENDING);\n        } else {\n            store = new Gtk.ListStore (4, typeof (Gdk.Pixbuf),\n                                      typeof (int),\n                                      typeof (string),\n                                      typeof (Reporter.Error));\n            store.set_sort_func (0, comp_err_pixbuf);\n            store.set_sort_func ((int) showall + 2, comp_err_errors);\n\n            if (sort_order != null && sort_id != null)\n                store.set_sort_column_id (sort_id, sort_order);\n            else\n                store.set_sort_column_id (1, SortType.ASCENDING);\n        }\n        store.sort_column_changed.connect (() => {\n            int new_sid;\n            SortType new_sorder;\n            if (store.get_sort_column_id (out new_sid, out new_sorder)) {\n                if (showall) {\n                    sort_order_all = new_sorder;\n                    sort_id_all = new_sid;\n                    if (sort_sync)\n                        switch (new_sid) {\n                            case 0:\n                                sort_order = new_sorder;\n                                sort_id = 0;\n                                break;\n                            case 1: //TODO: Fallthrough to case 2?\n                                break;\n                            case 2: //NOTE: Currently not reachable.\n                                sort_order = new_sorder;\n                                sort_id = 1;\n                                break;\n                            case 3:\n                                sort_order = new_sorder;\n                                sort_id = 2;\n                                break;\n                            default:\n                                bug_msg (_(\"No valid column to sort: %d - %s\\n\"),\n                                         new_sid, \"UiReport.build (showall)\");\n                                break;\n                        }\n                } else {\n                    sort_order = new_sorder;\n                    sort_id = new_sid;\n                    if (sort_sync)\n                        switch (new_sid) {\n                            case 0:\n                                sort_order_all = new_sorder;\n                                sort_id_all = 0;\n                                break;\n                            case 1:\n                                break;\n                            case 2:\n                                sort_order_all = new_sorder;\n                                sort_id_all = 3;\n                                break;\n                            default:\n                                bug_msg (_(\"No valid column to sort: %d - %s\\n\"),\n                                         new_sid, \"UiReport.build\");\n                                break;\n                        }\n                }\n            }\n        });\n        tree_view.set_model (store);\n\n        if (!showall && !(source_viewer.current_srcfocus in project.files))\n            return;\n\n        debug_msg (_(\"Run %s update!\\n\"), get_name());\n\n        int errs = 0;\n        int warns = 0;\n        int depr = 0;\n        int exp = 0;\n        int note = 0;\n\n        foreach (var err in project.get_errorlist()) {\n            if ((err.type & reptype) == 0 ||\n                    (!showall &&\n                     err.source.file.filename != source_viewer.current_srcfocus))\n                continue;\n\n            Gdk.Pixbuf? pixbuf = null;\n            switch (err.type) {\n                case ReportType.ERROR:\n                    pixbuf = pixmap_err;\n                    ++errs;\n                    break;\n                case ReportType.WARNING:\n                    pixbuf = pixmap_warn;\n                    ++warns;\n                    break;\n                case ReportType.DEPRECATED:\n                    pixbuf = pixmap_depr;\n                    ++depr;\n                    break;\n                case ReportType.EXPERIMENTAL:\n                    pixbuf = pixmap_exp;\n                    ++exp;\n                    break;\n                case ReportType.NOTE:\n                    pixbuf = pixmap_note;\n                    ++note;\n                    break;\n                default:\n                    bug_msg (_(\"Unknown ReportType: %s\\n\"), err.type.to_string());\n                    break;\n            }\n\n            TreeIter next;\n            store.append (out next);\n            if (showall)\n                store.set (next,\n                           0, pixbuf,\n                           1, project.get_relative_path (err.source.file.filename),\n                           2, err.source.begin.line,\n                           3, err.message,\n                           4, err,\n                           -1);\n            else\n                store.set (next,\n                           0, pixbuf,\n                           1, err.source.begin.line,\n                           2, err.message,\n                           3, err,\n                           -1);\n        }\n\n        // TRANSLATORS: Notes aren't notices but comments/remarks.\n        debug_msg (_(\"Errors: %d, Warnings: %d, Deprecated: %d, Experimental: %d, Notes: %d  -  %d\\n\"),\n                   errs,\n                   warns,\n                   depr,\n                   exp,\n                   note,\n                   project.get_errorlist().size);\n        debug_msg (_(\"%s update finished!\\n\"), get_name());\n    }\n}\n\npublic class ReportWrapper : Guanako.Reporter {\n    private inline void dbg_ref_msg (ReportType type, Vala.SourceReference? source, string message) {\n        if (source != null)\n            // TRANSLATORS:\n            // E.g.: Warning found: myfile.vala: 12(13)-12(17): unused variable `test'\n            debug_msg_level (2, _(\"%s found: %s: %d(%d)-%d(%d): %s\\n\"),\n                             type.to_string(),\n                             project.get_relative_path (source.file.filename),\n                             source.begin.line,\n                             source.end.column,\n                             source.end.line,\n                             source.end.column,\n                             message);\n    }\n\n    protected override inline void show_note (Vala.SourceReference? source, string message) {\n        dbg_ref_msg (ReportType.NOTE, source, message);\n    }\n\n    protected override inline void show_deprecated (Vala.SourceReference? source, string message) {\n        dbg_ref_msg (ReportType.DEPRECATED, source, message);\n    }\n\n    protected override inline void show_experimental (Vala.SourceReference? source, string message) {\n        dbg_ref_msg (ReportType.EXPERIMENTAL, source, message);\n     }\n\n    protected override inline void show_warning (Vala.SourceReference? source, string message) {\n        dbg_ref_msg (ReportType.WARNING, source, message);\n     }\n\n    protected override inline void show_error (Vala.SourceReference? source, string message) {\n        dbg_ref_msg (ReportType.ERROR, source, message);\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/search.vala",
    "content": "/*\n * src/ui/search.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\n\n/**\n * Search widget\n */\npublic class UiSearch : UiElement {\n    TreeView tree_view;\n    ToggleToolButton btn_all_files;\n    SearchEntry entry_search;\n\n    public UiSearch () {\n        tree_view = new TreeView();\n        var line_renderer = new CellRendererText();\n        line_renderer.yalign = 0;\n        tree_view.cursor_changed.connect (on_tree_view_cursor_changed);\n        tree_view.insert_column_with_attributes (-1,\n                                                 _(\"Line\"),\n                                                 line_renderer,\n                                                 \"text\",\n                                                 0,\n                                                 null);\n\n        tree_view.insert_column_with_attributes (-1,\n                                                 \"\",\n                                                 new CellRendererText(),\n                                                 \"markup\",\n                                                 1,\n                                                 null);\n\n\n        var box_main = new Box (Orientation.VERTICAL, 0);\n\n        var toolbar_title = new Toolbar ();\n        toolbar_title.get_style_context().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        var ti_title = new ToolItem();\n        ti_title.add (new Label (_(\"Search\")));\n        toolbar_title.add(ti_title);\n\n        var separator_stretch = new SeparatorToolItem();\n        separator_stretch.set_expand (true);\n        separator_stretch.draw = false;\n        toolbar_title.add (separator_stretch);\n\n        btn_all_files = new ToggleToolButton ();\n        btn_all_files.clicked.connect (() => {\n            search (entry_search.text);\n        });\n        btn_all_files.label = _(\"All files\");\n        btn_all_files.is_important = true;\n        toolbar_title.add (btn_all_files);\n        box_main.pack_start (toolbar_title, false, true);\n\n        entry_search = new SearchEntry();\n\n        entry_search.changed.connect(() => {\n            search (entry_search.text);\n        });\n        box_main.pack_start (entry_search, false, true);\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (tree_view);\n        box_main.pack_start (scrw, true, true);\n\n        build();\n\n        source_viewer.current_sourceview_changed.connect (() => {\n            search (entry_search.text);\n        });\n\n        widget = box_main;\n    }\n\n    protected override void on_element_show() {\n        search_for_current_selection();\n    }\n\n    protected override void on_element_hide() {}\n\n    public void focus_entry_search() {\n        entry_search.grab_focus();\n        entry_search.select_region (0, entry_search.text.length);\n    }\n\n    Gee.HashMap<string, SearchResult?> map_paths_results;\n    struct SearchResult {\n        public string filename;\n        public int line;\n        // public int col_start;\n        // public int col_end;\n    }\n\n    void on_tree_view_cursor_changed() {\n        TreePath path;\n        tree_view.get_cursor (out path, null);\n        if (path == null)\n            return;\n        SearchResult? result = map_paths_results[path.to_string()];\n        if (result == null)\n            return;\n        TextIter titer;\n        var bfr = project.get_buffer_by_file (result.filename);\n        bfr.get_iter_at_line_offset (out titer,\n                                     result.line,\n                                     0);\n        bfr.select_range (titer, titer);\n        source_viewer.focus_src (result.filename);\n        var source_view = source_viewer.get_sourceview_by_file (result.filename);\n        source_view.scroll_to_iter (titer, 0.42, true, 0, 1.0);\n        source_view.highlight_line (result.line);\n    }\n\n    public void search_for_current_selection() {\n        if (source_viewer.current_srcbuffer != null) {\n            TextIter sel_start, sel_end;\n            source_viewer.current_srcbuffer.get_selection_bounds (out sel_start, out sel_end);\n            entry_search.text = source_viewer.current_srcbuffer.get_text (sel_start, sel_end, true);\n            search (entry_search.text);\n        }\n        show_element (true);\n        widget_main.focus_dock_item (dock_item);\n        focus_entry_search();\n\n    }\n\n    public void search (string search) {\n        remove_search_marks();\n\n        if (search == \"\" || source_viewer.current_srcbuffer == null) {\n            build_results_display (false, new Gee.ArrayList<string>(), new Gee.ArrayList<TextIter?>(), new Gee.ArrayList<TextIter?>());\n            return;\n        }\n\n        var files = new Gee.ArrayList<string>();\n        var starts = new Gee.ArrayList<TextIter?>();\n        var ends = new Gee.ArrayList<TextIter?>();\n        if (!btn_all_files.active)\n            search_buffer (search,\n                           source_viewer.current_srcbuffer,\n                           source_viewer.current_srcfocus, ref files, ref starts, ref ends);\n        else\n            project.foreach_buffer ((filename, bfr) => {\n                search_buffer (search, bfr, filename, ref files, ref starts, ref ends);\n            });\n        build_results_display (btn_all_files.active, files, starts, ends);\n    }\n\n    void remove_search_marks() {\n        project.foreach_buffer ((filename, bfr) => {\n            TextIter first_iter;\n            TextIter end_iter;\n            bfr.get_start_iter (out first_iter);\n            bfr.get_end_iter (out end_iter);\n            bfr.remove_tag_by_name (\"search\", first_iter, end_iter);\n        });\n    }\n\n    void search_buffer (string search, SourceBuffer bfr, string filename, ref Gee.ArrayList<string> files, ref Gee.ArrayList<TextIter?> starts, ref Gee.ArrayList<TextIter?> ends) {\n        TextIter? match_start = null;\n        TextIter? match_end = null;\n        bfr.get_start_iter (out match_end);\n\n        while (match_end.forward_search (search,\n                                         TextSearchFlags.CASE_INSENSITIVE,  //TODO: Make this an option.\n                                         out match_start,  out match_end,  null)) {\n            files.add(filename);\n            starts.add(match_start);\n            ends.add(match_end);\n            bfr.apply_tag_by_name (\"search\", match_start, match_end);\n        }\n    }\n\n    public void display_source_refs (Vala.SourceReference[] refs, string? searchtext = null) {\n        if (searchtext != null)\n            entry_search.text = searchtext;\n\n        var files = new Gee.ArrayList<string>();\n        var starts = new Gee.ArrayList<TextIter?>();\n        var ends = new Gee.ArrayList<TextIter?>();\n        foreach (Vala.SourceReference reference in refs) {\n            var srcview = source_viewer.get_sourceview_by_file(reference.file.filename);\n            // stdout.printf (\"Found \" + reference.file.filename + \"\\n\");\n            if (srcview == null)\n                continue;\n            // stdout.printf (\"Continuing \" + reference.file.filename + \"\\n\");\n            files.add (reference.file.filename);\n            TextIter iter;\n            srcview.buffer.get_iter_at_line_offset (out iter, reference.begin.line - 1, reference.begin.column - 1);\n            starts.add (iter);\n            srcview.buffer.get_iter_at_line_offset (out iter, reference.end.line - 1, reference.end.column);\n            ends.add (iter);\n        }\n        build_results_display (true, files, starts, ends);\n\n        widget_main.focus_dock_item (this.dock_item);\n    }\n\n    void build_results_display (bool split_by_file, Gee.ArrayList<string> files, Gee.ArrayList<TextIter?> starts, Gee.ArrayList<TextIter?> ends) {\n        map_paths_results = new Gee.HashMap<string, SearchResult?>();\n\n        var store = new TreeStore (2, typeof (string), typeof (string));\n\n        var filemap = new Gee.HashMap <string, TreeIter?>();\n        for (int i = 0; i < files.size; i++) {\n\n            TreeIter? iter_parent;\n            if (!split_by_file)\n                iter_parent = null;\n            else if (files[i] in filemap.keys)\n                iter_parent = filemap[files[i]];\n            else {\n                store.append (out iter_parent, null);\n                filemap[files[i]] = iter_parent;\n                store.set (iter_parent, 0, \"\", 1, project.get_relative_path (files[i]), -1);\n            }\n            TreeIter iter_append;\n            store.append (out iter_append, iter_parent);\n\n            var bfr = source_viewer.get_sourceview_by_file (files[i]).buffer;\n\n            var col_start = starts[i].get_line();\n\n            string lines_before = \"\";\n            string matchline_before = \"\";\n            string matchline_after = \"\";\n            string lines_after = \"\";\n\n            var lines_before_start = starts[i];\n            if (lines_before_start.backward_lines (2) || lines_before_start.backward_line()) {\n                var lines_before_end = starts[i];\n                if (lines_before_end.backward_line() && lines_before_end.forward_to_line_end())\n                    lines_before = bfr.get_text (lines_before_start, lines_before_end, true);\n            }\n\n            TextIter matchline_before_start;\n            bfr.get_iter_at_line (out matchline_before_start, col_start);\n            matchline_before = bfr.get_text (matchline_before_start, starts[i], true);\n\n            var matchline_after_end = ends[i];\n            if (!matchline_after_end.ends_line()) {\n                matchline_after_end.forward_to_line_end();\n                matchline_after = bfr.get_text (ends[i], matchline_after_end, true);\n            }\n\n            var lines_after_start = ends[i];\n            if (lines_after_start.forward_line()) {\n                var lines_after_end = lines_after_start;\n                lines_after_end.forward_lines (2);\n                lines_after = bfr.get_text (lines_after_start, lines_after_end, true);\n            }\n\n            var shown_text = \"\"\"<tt><span color=\"#A0A0A0\">\"\"\"\n                        + Markup.escape_text (lines_before + \"\\n\")\n                        + \"</span>\"\n                        + Markup.escape_text (matchline_before)\n                        + \"<b>\"\n                        + Markup.escape_text (bfr.get_text (starts[i], ends[i], true))\n                        + \"</b>\"\n                        + Markup.escape_text (matchline_after + \"\\n\")\n                        + \"\"\"<span color=\"#A0A0A0\">\"\"\"\n                        + Markup.escape_text (lines_after)\n                        + \"</span></tt>\";\n\n            //TODO: Make <b> stuff case insensitive!\n\n            store.set (iter_append, 0, (ends[i].get_line() + 1).to_string(), 1, shown_text, -1);\n\n            map_paths_results[store.get_path ((TreeIter)iter_append).to_string()]\n                                                    = SearchResult() { line = ends[i].get_line(),\n                                                                       filename = files[i] };\n                                                                       // col_start = col_start,\n                                                                       // col_end = col_end };\n        }\n\n        tree_view.set_model (store);\n    }\n\n    public override void build() {\n        debug_msg (_(\"Run %s update!\\n\"), get_name());\n        debug_msg (_(\"%s update finished!\\n\"), get_name());\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/source_viewer.vala",
    "content": "/*\n * src/ui_source_viewer.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\nusing Gdl;\nusing Gee;\n\n/**\n * Report build status and code warnings/errors.\n */\nclass UiSourceViewer : UiElement {\n    /**\n     * Source code dock.\n     */\n    private Dock srcdock;\n    /**\n     * Layout of source code dock {@link srcdock}.\n     */\n    private DockLayout srclayout;\n    /**\n     * List of all {@link Gdl.DockItem} objects in source dock {@link srcdock}.\n     */\n    private ArrayList<DockItem> srcitems = new ArrayList<DockItem>();\n\n    /**\n     * Share map of language mapping across all source elements.\n     */\n    private TreeMap<string, Pair<string, int>> langmap;\n    /**\n     * Share {@link Gtk.SourceLanguageManager} across all source elements.\n     */\n    private SourceLanguageManager langman;\n    /**\n     * Fallback language string.\n     */\n    private const string lang_fallback = N_(\"Plain text\");\n\n    private string? _current_srcfocus = null;\n    /**\n     * Relative path to current selected {@link SourceBuffer}.\n     */\n    public string current_srcfocus {\n        get {\n            return _current_srcfocus;\n        }\n        private set {\n            if (this._current_srcfocus != value) {\n                // TRANSLATORS: Change focus of source view to new file.\n                debug_msg (_(\"Change current focus: %s\\n\"), value);\n\n                this._current_srcfocus = value;\n                this.current_srcid = get_sourceview_id (value);\n                if (0 <= this.current_srcid < this.srcitems.size) {\n                    this.current_srcview = get_sourceview (this.srcitems[this.current_srcid]);\n                    this.current_srcbuffer = (SourceBuffer) this.current_srcview.buffer;\n                } else\n                    warning_msg (_(\"Could not select current source view: %s\\n\" +\n                                 \"Expected behavior may change.\\n\"), this._current_srcfocus);\n                current_sourceview_changed();\n            }\n        }\n    }\n    /**\n     * Id of current {@link Gtk.SourceView} in {@link srcitems}.\n     */\n    private int current_srcid { get; private set; default = -1; }\n    /**\n     * Currently selected {@link Gtk.SourceView}.\n     */\n    public SuperSourceView? current_srcview { get; private set; default = null; }\n    /**\n     * List of currently in used annotations.\n     */\n    private ArrayList<SuperSourceView.LineAnnotation> annotations;\n    /**\n     * Currently selected {@link SourceBuffer}.\n     */\n    public SourceBuffer? current_srcbuffer { get; private set; default = null; }\n    /**\n     * Gets emitted when another {@link Gtk.SourceView} is selected\n     */\n    public signal void current_sourceview_changed();\n\n    /**\n     * Create source viewer object and initialize {@link Gdl.Dock}.\n     */\n    public UiSourceViewer() {\n        locking = false;\n\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        srcdock = new Dock();\n        vbox.pack_start (this.srcdock, true, true);\n        /* Mapping warnings may show up. See #697700 */\n        this.srcdock.master.switcher_style = SwitcherStyle.TABS;\n#if GDL_3_9_91\n        this.srcdock.master.tab_pos = PositionType.TOP;\n        this.srcdock.master.tab_reorderable = true;\n#endif\n        this.srclayout = new DockLayout (this.srcdock);\n\n        langmap = new TreeMap<string, Pair<string, int>>();\n        int num = 0;\n        langmap[lang_fallback] = new Pair<string, int> (lang_fallback, num);\n\n        langman = new SourceLanguageManager();\n        foreach (var lang_id in langman.get_language_ids()) {\n            var language = langman.get_language (lang_id).name;\n            langmap[language] = new Pair<string, int> (lang_id, ++num);\n        }\n\n        annotations = new ArrayList<SuperSourceView.LineAnnotation>();\n\n        widget = vbox;\n    }\n\n    /**\n     * Initialize application signals.\n     */\n    public void init() {\n        source_viewer.buffer_close.connect (project.close_buffer);\n        source_viewer.current_sourceview_changed.connect (() => {\n            var srcbuf = source_viewer.current_srcbuffer;\n            project.undo_changed (srcbuf.can_undo);\n            project.redo_changed (srcbuf.can_redo);\n            if (!is_new_document (source_viewer.current_srcfocus))\n                project.buffer_changed (project.buffer_is_dirty (\n                                                source_viewer.current_srcfocus));\n            else\n                project.buffer_changed (true);\n        });\n\n        project.guanako_update_finished.connect (() => {\n            project.foreach_buffer ((s, bfr) => {\n                TextIter first_iter;\n                TextIter end_iter;\n                bfr.get_start_iter (out first_iter);\n                bfr.get_end_iter (out end_iter);\n                bfr.remove_tag_by_name (\"error_bg\", first_iter, end_iter);\n                bfr.remove_tag_by_name (\"warning_bg\", first_iter, end_iter);\n            });\n\n            foreach (var annotation in annotations)\n                annotation.finished = true;\n            annotations = new ArrayList<SuperSourceView.LineAnnotation>();\n\n            foreach (var err in project.get_errorlist()) {\n                var bfr = project.get_buffer_by_file (err.source.file.filename);\n                if (bfr != null)\n                    apply_annotation (get_sourceview_by_file (err.source.file.filename, false),\n                                      bfr,\n                                      err);\n            }\n        });\n    }\n\n    private void apply_annotation (SuperSourceView view, SourceBuffer bfr, Guanako.Reporter.Error err) {\n        TextIter? iter_start = null;\n        TextIter? iter_end = null;\n\n        // We have broken message positions in some cases ...\n        get_safe_iters_from_source_ref (bfr, err.source, ref iter_start, ref iter_end);\n\n        // end == begin -> we want to make sure that the error is visible\n        // There is also a case where end > begin but I can't remember\n        // how to trigger it. I think it has something to do with main blocks.\n        if (iter_end.compare (iter_start) <= 0) {\n            iter_end = iter_start;\n            bool tmp = iter_end.forward_char();\n            if (tmp == false)\n                iter_start.backward_char();\n\n            // We have to make sure that there is at least one\n            // visible character between start and end\n            // Example: \"public class Foo {\"\n            // => The missing-}-error is invisible\n            if (!contains_invisible_char (iter_start, iter_end))\n                extend_to_invisible_char (ref iter_start, ref iter_end);\n        }\n\n        var annotation_line = err.source.begin.line - 1;\n        int offset = 1;\n        foreach (var annotation in annotations)\n            if (annotation.line == annotation_line)\n                offset++;\n\n        switch (err.type) {\n            case Guanako.ReportType.ERROR:\n                bfr.apply_tag_by_name (\"error_bg\", iter_start, iter_end);\n                annotations.add (view.annotate (annotation_line, err.message, 1.0, 0.0, 0.0, false, offset));\n                break;\n            case Guanako.ReportType.WARNING:\n                bfr.apply_tag_by_name (\"warning_bg\", iter_start, iter_end);\n                annotations.add (view.annotate (annotation_line, err.message, 1.0, 1.0, 0.0, false, offset));\n                break;\n            case Guanako.ReportType.DEPRECATED:\n                annotations.add (view.annotate (annotation_line, err.message, 0.0, 0.0, 1.0, false, offset));\n                break;\n            case Guanako.ReportType.EXPERIMENTAL:\n                annotations.add (view.annotate (annotation_line, err.message, 1.0, 1.0, 0.0, false, offset));\n                break;\n            case Guanako.ReportType.NOTE:\n                break;\n            default:\n                bug_msg (_(\"Unknown ReportType: %s\\n\"), err.type.to_string());\n                break;\n        }\n    }\n\n    private inline bool contains_invisible_char (TextIter start, TextIter end) {\n        return start.forward_find_char ((c) => { return c.iscntrl() == false; }, end);\n    }\n\n    private inline void extend_to_invisible_char (ref TextIter iter_start, ref TextIter iter_end) {\n        TextIter iter = iter_end;\n        do {\n                if (iter.get_char().iscntrl() == false) {\n                        iter_start = iter;\n                        iter_end = iter;\n                        iter_end.forward_char();\n                        return;\n                }\n        } while (iter.forward_char());\n\n        iter = iter_start;\n        do {\n                if (iter.get_char().iscntrl() == false) {\n                        iter_start = iter;\n                        iter_end = iter;\n                        iter_end.forward_char();\n                        return;\n                }\n        } while (iter.backward_char());\n    }\n\n    /**\n     * Focus source view {@link Gdl.DockItem} in {@link Gdl.Dock} and select\n     * recursively all {@link Gdl.DockNotebook} tabs.\n     *\n     * @param filename Absolute name of file to focus.\n     */\n    public void focus_src (string filename) {\n        foreach (var srcitem in srcitems) {\n            if (project.get_absolute_path (srcitem.long_name) == filename) {\n                widget_main.focus_dock_item (srcitem);\n                Idle.add (() => {\n                    get_sourceview (srcitem).grab_focus();\n                    return false;\n                });\n                return;\n            }\n        }\n        // TRANSLATORS: Could not change source view focus to new file.\n        warning_msg (_(\"Could not change focus to: %s\\n\"), filename);\n    }\n\n    /**\n     * Connect to this signal to interrupt hiding (closing) of\n     * {@link Gdl.DockItem} with {@link Gtk.SourceView}.\n     *\n     * @param view {@link Gtk.SourceView} to close.\n     * @param filename Name of file to close.\n     * @return Return `false` to interrupt or return `true` to proceed.\n     */\n    public signal bool buffer_close (Gtk.SourceView view, string? filename);\n\n    /**\n     * Close {@link Gdl.DockItem} with {@link Gtk.SourceView} by\n     * filename.\n     *\n     * @param filename Absolute name of source file to close.\n     */\n    public void close_srcitem (string filename) {\n        DockItem? item = null;\n        if (!is_new_document (filename)) {\n            foreach (var srcitem in srcitems)\n                if (project.get_absolute_path (srcitem.long_name) == filename) {\n                    item = srcitem;\n                    break;\n                }\n        } else {\n            foreach (var srcitem in srcitems)\n                if (srcitem.long_name == filename) {\n                    item = srcitem;\n                    break;\n                }\n        }\n        if (item != null) {\n            close_srcitem_pr (item, filename);\n            project.close_viewbuffer (filename);\n        } else\n            warning_msg (_(\"Could not close view: %s\\n\"), filename);\n    }\n\n    private inline void close_srcitem_pr (DockItem item, string filename) {\n        debug_msg (_(\"Close view and buffer: %s\\n\"), filename);\n        srcitems.remove (item);\n        item.unbind();\n        if (srcitems.size == 1)\n            srcitems[0].show_item();\n        var fname = srcitems[srcitems.size - 1].long_name;\n        if (is_new_document (fname))\n            current_srcfocus = fname;\n        else\n            current_srcfocus = project.get_absolute_path (fname);\n    }\n\n    /**\n     * Add new source view item to source dock {@link srcdock}.\n     *\n     * @param view {@link Gtk.SourceView} object to add.\n     * @param filepath Name of file (used to identify item).\n     */\n    public void add_srcitem (SuperSourceView view, string filepath = \"\") {\n        string displayname, filename = filepath;\n        if (filename == \"\")\n            displayname = filename = _(\"New document\");\n        else {\n            filename = project.get_absolute_path (filename);\n            displayname = project.get_relative_path (filename);\n        }\n\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        var src_view = new ScrolledWindow (null, null);\n        vbox.pack_start (src_view, true, true);\n        src_view.add (view);\n\n        var srcbuf = (SourceBuffer) view.buffer;\n        var attr = new SourceMarkAttributes();\n        attr.icon_name = \"media-seek-forward\";\n        view.set_mark_attributes (\"timer\", attr, 0);\n        var attr2 = new SourceMarkAttributes();\n        attr2.icon_name = \"media-seek-stop\";\n        view.set_mark_attributes (\"stop\", attr2, 0);\n        view.show_line_marks = true;\n\n        TextTag tag = srcbuf.create_tag (\"error_bg\", null);\n        tag.underline = Pango.Underline.ERROR;\n        tag = srcbuf.create_tag (\"warning_bg\", null);\n        tag.background_rgba = Gdk.RGBA() { red = 1.0, green = 1.0, blue = 0.8, alpha = 1.0 };\n        tag = srcbuf.create_tag (\"search\", null);\n        tag.background_rgba = Gdk.RGBA() { red = 1.0, green = 1.0, blue = 0, alpha = 0.8 };\n        tag = srcbuf.create_tag (\"symbol_used\", null);\n        tag.background_rgba = Gdk.RGBA() { red = 0, green = 0, blue = 0, alpha = 0.2 };\n\n        if (project != null)\n            foreach (var err in project.get_errorlist())\n                if (err.source.file.filename == filename)\n                    apply_annotation (view, srcbuf, err);\n\n        /* Statusbar */\n        var statusbar = new Statusbar();\n        vbox.pack_start (statusbar, false);\n\n        var lbl = new Label (_(\"Language: \"));\n        statusbar.pack_start (lbl, false);\n\n        var cbox = new ComboBoxText();\n        statusbar.pack_start (cbox, false);\n        cbox.append_text (lang_fallback);\n\n        foreach (var lang_id in langman.get_language_ids())\n            cbox.append_text (langman.get_language (lang_id).name);\n\n        string? lang_selected;\n        var lang = ((SourceBuffer) view.buffer).language;\n        if (lang != null) {\n            lang_selected = langman.get_language (lang.id).name;\n            cbox.active = langmap[lang_selected].value;\n        } else {\n            cbox.active = 0;\n            lang_selected = lang_fallback;\n        }\n\n        cbox.changed.connect (() => {\n            var new_lang = cbox.get_active_text();\n\n            if (new_lang == null)\n                cbox.active = 0;\n\n            if (new_lang != lang_selected) {\n                if (langmap[lang_selected].key == \"vala\")\n                    try {\n                        view.completion.remove_provider (project.comp_provider);\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Could not unload completion: %s\\n\"), e.message);\n                    }\n                lang_selected = new_lang;\n                if (lang_selected == null || langmap[lang_selected].key == \"vala\")\n                    try {\n                        view.completion.add_provider (project.comp_provider);\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Could not load completion: %s\\n\"), e.message);\n                    }\n\n                lang = (lang_selected != null) ? langman.get_language (langmap[lang_selected].key)\n                                               : null;\n                ((SourceBuffer) view.buffer).set_language (lang);\n            }\n        });\n\n        var lgrid = new Grid();\n        lgrid.valign = Align.CENTER;\n        statusbar.pack_start (lgrid, false);\n\n        var pos_col_lbl = new Label (get_label_row_col (view));\n        pos_col_lbl.width_request = 100;\n        lgrid.attach (pos_col_lbl, 0, 0, 1, 1);\n        view.buffer.notify[\"cursor-position\"].connect (() => {\n            pos_col_lbl.label = get_label_row_col (view);\n        });\n\n        // TRANSLATORS: overwrite input mode\n        var insmode_lbl = new Label ((view.overwrite) ? _(\"OVR\")\n        // TRANSLATORS: insert input mode\n                                                      : _(\"INS\"));\n        insmode_lbl.width_request = 50;\n        lgrid.attach (insmode_lbl, 1, 0, 1, 1);\n        view.notify[\"overwrite\"].connect (() => {\n            insmode_lbl.label = (view.overwrite) ? _(\"OVR\") : _(\"INS\");\n        });\n\n        var sepu = new Separator (Orientation.HORIZONTAL);\n        vbox.pack_start (sepu, false);\n\n        /*\n         * NOTE: Keep this in sync with get_sourceview method.\n         */\n        var item = new DockItem.with_stock (\"SourceView \" + srcitems.size.to_string(),\n                                            displayname,\n                                            (srcbuf.dirty) ? \"gtk-new\" : \"gtk-edit\",\n                                            DockItemBehavior.LOCKED);\n        srcbuf.notify[\"dirty\"].connect (() => {\n            item.stock_id = (srcbuf.dirty) ? \"gtk-new\" : \"gtk-edit\";\n        });\n        item.add (vbox);\n\n        /* Set focus on tab change. */\n        item.selected.connect (() => {\n            this.current_srcfocus = filename;\n        });\n        /* Set focus on click. */\n        view.grab_focus.connect (() => {\n            this.current_srcfocus = filename;\n        });\n\n        if (srcitems.size == 0) {\n            item.behavior |= DockItemBehavior.CANT_CLOSE;\n            this.srcdock.add_item (item, DockPlacement.RIGHT);\n        } else {\n            /* Handle dock item closing. */\n            item.hide.connect (() => {\n                /* Suppress dialog by removing item at first from srcitems list. */\n                if (!(item in srcitems))\n                    return;\n                /*\n                 * TODO: Better solution to prevent emission of hiding? We\n                 *       want hide it at a later point after confirm dialog.\n                 */\n                /*\n                 * This will work properly with gdl-3.0 >= 3.5.5\n                 */\n                item.show_item();\n#if !GDL_3_9_91\n                set_notebook_tabs (item);\n#endif\n\n                if (buffer_close (get_sourceview (item), displayname)) {\n                    close_srcitem_pr (item, filename);  // closes the item\n                    project.close_viewbuffer (filename);\n                }\n            });\n\n            item.behavior = DockItemBehavior.CANT_ICONIFY;\n\n            /*\n             * Hide default source view if it is empty.\n             * Dock new items to focused dock item.\n             *\n             * NOTE: Custom unsaved views are ignored (even if empty).\n             */\n            int id = 0;\n            if (this.current_srcfocus != null)\n                id = get_sourceview_id (this.current_srcfocus);\n            if (id != -1)\n                this.srcitems[id].dock (item, DockPlacement.CENTER, 0);\n            else {\n                bug_msg (_(\"Source view id out of range.\\n\"));\n                return;\n            }\n            if (srcitems.size == 1) {\n                var view_widget = get_sourceview (srcitems[0]);\n                //TODO: Use dirty flag of buffer.\n                if (view_widget.buffer.text == \"\")\n                    srcitems[0].hide_item();\n            }\n        }\n        srcitems.add (item);\n        item.show_all();\n\n        /*\n         * Set notebook tab properly if needed.\n         */\n#if !GDL_3_9_91\n        item.dock.connect (() => {\n            set_notebook_tabs (item);\n        });\n#endif\n    }\n\n    /**\n     * Update row and column statusbar string.\n     *\n     * @param view Corresponding view with {@link Gtk.TextBuffer}.\n     * @return Row and column info.\n     */\n    private inline string get_label_row_col (Gtk.SourceView view) {\n        TextIter iter;\n        view.buffer.get_iter_at_mark (out iter, view.buffer.get_insert());\n        var row = iter.get_line();\n        var column = view.get_visual_column (iter);\n        // TRANSLATORS: Short name for Line X, Column Y\n        return _(\"Ln %d, Col %d\").printf (row + 1, column + 1);\n    }\n\n    /**\n     * Set up {@link Gtk.Notebook} tab properties.\n     *\n     * @param item {@link Gdl.DockItem} to setup.\n     */\n#if !GDL_3_9_91\n    private void set_notebook_tabs (DockItem item) {\n        var pa = item.parent;\n        if (pa is Notebook) {\n            var nbook = (Notebook) pa;\n            nbook.scrollable = true;\n            nbook.set_tab_pos (PositionType.TOP);\n            foreach (var child in nbook.get_children())\n                nbook.set_tab_reorderable (child, true);\n        }\n    }\n#endif\n\n    /**\n     * Get {@link Gtk.SourceView} from within {@link Gdl.DockItem}.\n     *\n     * @param item {@link Gdl.DockItem} to get {@link Gtk.SourceView} from.\n     * @return Return associated {@link Gtk.SourceView}.\n     */\n    /*\n     * NOTE: Be careful. This have to be exactly the same objects as the\n     *       objects at creation of new source views.\n     */\n    private inline SuperSourceView get_sourceview (DockItem item) {\n        return (SuperSourceView) ((ScrolledWindow) ((Box) item.get_child()).get_children().nth_data (0)).get_child();\n    }\n\n    /**\n     * Get id of {@link Gtk.SourceView} by filename.\n     *\n     * @param filename Name of source file to search for in {@link srcitems}.\n     * @param warn `true` to warn if no such view.\n     * @return If file was found return id of {@link Gtk.SourceView} in\n     *         {@link srcitems}. Else -1.\n     */\n    private int get_sourceview_id (string filename, bool warn = true) {\n        if (!is_new_document (filename)) {\n            for (int i = 0; i < srcitems.size; ++i)\n                if (project.get_absolute_path (srcitems[i].long_name) == filename)\n                    return i;\n        } else {\n            for (int i = 0; i < srcitems.size; ++i)\n                if (srcitems[i].long_name == filename)\n                    return i;\n        }\n        if (warn)\n            warning_msg (_(\"No such file found in opened buffers: %s\\n\"), filename);\n        return -1;\n    }\n\n    /**\n     * Set focus and insert mark to the given position and open file if\n     * necessary.\n     *\n     * @param filename Name of file to switch to.\n     * @param line Line where to jump.\n     * @param col Column where to jump.\n     * @param setcursor If `true` set cursor to position.\n     * @param focus If `true` focus item.\n     */\n    public void jump_to_position (string filename, int line, int col,\n                                  bool setcursor = true, bool focus = true) {\n        on_file_selected (filename, focus);\n        var srcbuffer = project.get_buffer_by_file (filename);\n        if (srcbuffer == null)\n            return;\n        TextIter titer;\n        srcbuffer.get_iter_at_line_offset (out titer, line, col);\n        srcbuffer.select_range (titer, titer);\n        var srcview = get_sourceview_by_file (filename);\n        GLib.Idle.add(()=>{\n            if (focus)\n                srcview.grab_focus();\n            srcview.scroll_to_iter (titer, 0.42, true, 1.0, 1.0);\n            return false;\n        });\n        if (setcursor)\n            srcbuffer.place_cursor (titer);\n    }\n\n    /**\n     * Get {@link Gtk.SourceView} by filename.\n     *\n     * @param filename Name of source file.\n     * @param warn `true` to warn if no such view.\n     * @return If file was found return {@link Gtk.SourceView} object else\n     *         null.\n     */\n    public SuperSourceView? get_sourceview_by_file (string filename, bool warn = true) {\n        var id = get_sourceview_id (filename, warn);\n        if (id == -1)\n            return null;\n        return get_sourceview (this.srcitems[id]);\n    }\n\n    public override void build() {\n        debug_msg (_(\"Run %s update!\\n\"), get_name());\n        debug_msg (_(\"%s update finished!\\n\"), get_name());\n    }\n}\n\npublic static inline bool is_new_document (string filename) {\n    return filename.has_prefix (_(\"New document\"));\n}\n"
  },
  {
    "path": "src/ui/structure_view.vala",
    "content": "/*\n * src/ui/structure_view.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Clutter;\nusing GtkClutter;\nusing Vala;\n\npublic class UiStructureView : UiElement {\n\n    public UiStructureView() {\n        var box_main = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);\n\n        var toolbar_title = new Toolbar ();\n        toolbar_title.get_style_context().add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        var ti_title = new ToolItem();\n        ti_title.add (new Label (_(\"Search\")));\n        toolbar_title.add(ti_title);\n\n        var separator_stretch = new SeparatorToolItem();\n        separator_stretch.set_expand (true);\n        separator_stretch.draw = false;\n        toolbar_title.add (separator_stretch);\n\n        var btn_update_all = new ToolButton (null, \"update symbols\");\n        btn_update_all.is_important = true;\n        btn_update_all.clicked.connect (() => {\n            update_stuff();\n        });\n        toolbar_title.add (btn_update_all);\n\n        var btn_update_lines = new ToolButton (null, \"update refs\");\n        btn_update_lines.is_important = true;\n        btn_update_lines.clicked.connect (update_lines);\n        toolbar_title.add (btn_update_lines);\n\n        box_main.pack_start (toolbar_title, false, true);\n\n        embed = new GtkClutter.Embed();\n        stage = embed.get_stage();\n\n        var scrw = new ScrolledWindow(null, null);\n        scrw.add (embed);\n\n        box_main.pack_start (scrw);\n\n        stage.background_color = Clutter.Color () { red = 100, green = 100, blue = 100, alpha = 255 };\n\n        widget = box_main;\n        if (false == true)\n            update_stuff();\n    }\n    GtkClutter.Embed embed;\n    Clutter.Actor stage;\n\n    public override void build() {}\n\n    void update_stuff() {\n        float countx = 0;\n        float county = 0;\n        foreach (Vala.SourceFile file in project.guanako_project.sourcefiles) {\n            var vs_file = new vsFile(file);\n            vs_files[file] = vs_file;\n\n            vs_file.box.x = countx;\n            vs_file.box.y = county;\n\n            stage.add_child (vs_file.box);\n            countx += 300;\n            if (countx == 1500) {\n                countx = 0;\n                county += 500;\n            }\n        }\n        embed.set_size_request (1500, (int)county + 500);\n        /*var visitor = new Guanako.SymbolVisitor((smb, depth)=>{\n\n            last_text = vs_file.add_symbol (smb, depth, countx);\n            stage.add (last_text);\n            return Guanako.IterCallbackReturns.CONTINUE;\n        });*/\n        Guanako.iter_symbol (project.guanako_project.root_symbol, (smb, depth)=>{\n            if (depth > 0) {\n                var file = smb.source_reference.file;\n                if (file in vs_files.keys) {\n                    stdout.printf (smb.name + \"\\n\");\n                    stdout.printf (@\"File $(file.filename) in list\\n\");\n                    vs_files[file].add_symbol (smb, depth);\n                }\n\n            }\n            return Guanako.IterCallbackReturns.CONTINUE;\n        });\n        GLib.Timeout.add (1000, () => {\n        foreach (vsFile vs_file in vs_files.values)\n            foreach (Symbol smb in vs_file.map_symbols.keys) {\n                if (!(smb is Subroutine || smb is Variable))\n                    continue;\n                var refs = Guanako.Refactoring.find_references (project.guanako_project, smb.source_reference.file, smb);\n                foreach (SourceReference re in refs) {\n                    var smb_at_pos = project.guanako_project.get_symbol_at_pos (re.file, re.begin.line, re.begin.column);\n                    if (smb_at_pos != null) {\n                        var ctext_dec = vs_file.map_symbols[smb];\n                        var ctext_ref = vs_files[re.file].map_symbols[smb_at_pos];\n                        vs_file.references.add(reference() {from_text = ctext_dec, to_text = ctext_ref, to_symbol = smb_at_pos, to_file = vs_files[re.file]});\n                    }\n                }\n            }\n            return false;\n        });\n    }\n\n    void update_lines() {\n        foreach (vsFile vs_file in vs_files.values)\n            vs_file.update_ref_lines (stage);\n    }\n\n    internal struct reference {\n        //Symbol from_symbol;\n        Symbol to_symbol;\n        Clutter.Text from_text;\n        Clutter.Text to_text;\n        vsFile to_file;\n    }\n\n\n    internal static Clutter.Color color_of_symbol (Symbol smb) {\n        if (smb is Subroutine)\n            return Clutter.Color.from_string (\"yellow\");\n        else if (smb is Variable)\n            return Clutter.Color.from_string (\"blue\");\n        else if (smb is Namespace)\n            return Clutter.Color.from_string (\"red\");\n        else if (smb is Class)\n            return Clutter.Color.from_string (\"green\");\n        else\n            return Clutter.Color.from_string (\"white\");\n    }\n\n    internal Gee.HashMap <Vala.SourceFile, vsFile> vs_files = new Gee.HashMap <Vala.SourceFile, vsFile>();\n    internal class vsFile : Object {\n        public vsFile (Vala.SourceFile file) {\n\n            var splt = file.filename.split (\"/\");\n            var text = new Clutter.Text.full (\"Bitstream Vera Sans 12\",\n                              splt[splt.length-1],\n                              Clutter.Color.from_string (\"white\"));\n\n            box.reactive = true;\n            box.enter_event.connect(()=>{\n                foreach (Clutter.Actor rect in ref_lines)\n                    rect.opacity = 255;\n                return false;\n            });\n            box.leave_event.connect(()=>{\n                foreach (Clutter.Actor rect in ref_lines)\n                    rect.opacity = 25;\n                return false;\n            });\n\n            box.add_action (new Clutter.DragAction());\n            box.set_layout_manager (new Clutter.FixedLayout());\n            vbox_private.set_layout_manager (new Clutter.FlowLayout(Clutter.FlowOrientation.VERTICAL));\n            vbox_public.set_layout_manager (new Clutter.FlowLayout(Clutter.FlowOrientation.VERTICAL));\n            vbox_private.x = 150;\n            vbox_private.y = 30;\n            vbox_public.y = 30;\n            box.add_child (text);\n            box.add_child (vbox_private);\n            box.add_child (vbox_public);\n        }\n        public void update_ref_lines (Clutter.Actor stage) {\n            foreach (Clutter.Actor r in ref_lines)\n                r.destroy();\n            foreach (reference refe in references) {\n                var box1 = refe.from_text.get_allocation_box();\n                var box2 = refe.to_text.get_allocation_box();\n                var r = draw_line (box1.x1 + box.x, box1.y1 + box.y, box2.x1 + refe.to_file.box.x, box2.y1 + refe.to_file.box.y, color_of_symbol (refe.to_symbol));\n                ref_lines.add (r);\n                stage.add (r);\n            }\n        }\n        float county = 30;\n        public Clutter.Text add_symbol (Symbol smb, int depth) {\n            var text = new Clutter.Text.full (\"Bitstream Vera Sans 8\",\n                              smb.name, color_of_symbol(smb));\n\n            text.x = depth * 20;\n\n            if (smb.access == SymbolAccessibility.PUBLIC)\n                vbox_public.add_child (text);\n            else\n                vbox_private.add_child (text);\n\n            county += text.height;\n            map_symbols[smb] = text;\n            return text;\n        }\n\n        public Clutter.Actor box = new Clutter.Actor();\n        public Clutter.Actor vbox_public = new Clutter.Actor();\n        public Clutter.Actor vbox_private = new Clutter.Actor();\n        public Gee.LinkedList<Clutter.Actor> ref_lines = new Gee.LinkedList<Clutter.Actor>();\n        public Gee.LinkedList<reference?> references = new Gee.LinkedList<reference?>();\n        public Gee.HashMap <Symbol, Clutter.Text> map_symbols = new Gee.HashMap <Symbol, Clutter.Text> ();\n\n        Clutter.Actor draw_line (float x1, float y1, float x2, float y2, Clutter.Color color) {\n            #if VALA_0_28\n\t\t\t    var r = new Clutter.Actor();\n\t\t\t#else\n\t\t\t    var r = new Clutter.Rectangle();\n\t\t\t#endif\n            var dist = Math.sqrtf ((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));\n\n            r.width = 2;\n            r.height = dist;\n            r.x = x1;\n            r.y = y1;\n            if (y2 > y1)\n                r.rotation_angle_z = -Math.asinf ((x2 - x1) / dist) / Math.PI * 180;\n            else\n                r.rotation_angle_z = Math.asinf ((x2 - x1) / dist) / Math.PI * 180 + 180;\n            r.set_easing_mode (Clutter.AnimationMode.EASE_OUT_QUAD);\n            r.set_easing_duration (250);\n            r.opacity = 25;\n            #if VALA_0_28\n                r.background_color = color;\n            #else\n\t\t\t    r.color = color;\n\t\t\t#endif\n            return r;\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/super_source_view.vala",
    "content": "/*\n * src/ui/super_source_view.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Vala;\n\n/**\n * Enhanced GtkSourceView\n */\npublic class SuperSourceView : Gtk.SourceView {\n    public SuperSourceView(SourceBuffer bfr) {\n        this.buffer = bfr;\n        int old_line = -1;\n\n        this.motion_notify_event.connect ((event)=>{\n            int bfrx, bfry;\n            this.window_to_buffer_coords (TextWindowType.WIDGET, (int)event.x, (int)event.y, out bfrx, out bfry);\n            TextIter line_iter;\n            this.get_line_at_y (out line_iter, bfry, null);\n            int line = line_iter.get_line();\n            if (line != old_line) {\n                old_line = line;\n                foreach (Animation anim in animations)\n                    anim.mouse_move (line);\n            }\n            return false;\n        });\n\n        Timeout.add (30, ()=>{\n            foreach (Animation anim in animations)\n                if (anim.animated) {\n                    anim.advance ();\n                    anim.queue_draw ();\n                }\n            while (true) {\n                for (int q = 0; q < animations.size; q++)\n                    if (animations[q].finished) {\n                        animations[q].queue_draw ();\n                        animations.remove_at(q);\n                        continue;\n                    }\n                break;\n            }\n            return true;\n        });\n    }\n    public override bool draw (Cairo.Context cr) {\n        base.draw (cr);\n        foreach (Animation anim in animations)\n            anim.draw (cr);\n        return true;\n    }\n    public void highlight_line (int line) {\n        var animation = new LineHighlight();\n        animation.line = line;\n        animation.view = this;\n        animations.add (animation);\n    }\n    public LineAnnotation annotate (int line, string text, double r, double g, double b, bool always_visible, int offset = 1) {\n        var animation = new LineAnnotation(this, line, r, g, b, offset);\n        animation.text = text;\n        animation.always_visible = always_visible;\n        animations.add (animation);\n        return animation;\n    }\n    internal Gee.ArrayList<Animation> animations = new Gee.ArrayList<Animation>();\n\n    public abstract class Animation {\n        public bool finished = false;\n        public bool animated = false;\n        internal SuperSourceView view;\n        internal abstract void advance();\n        internal abstract void queue_draw();\n        internal abstract void mouse_move (int line);\n        internal abstract void draw (Cairo.Context cr);\n    }\n    public class LineAnnotation : Animation{\n        public LineAnnotation(SuperSourceView view, int line, double r, double g, double b, int offset) {\n            this.r = r;\n            this.g = g;\n            this.b = b;\n            this.view = view;\n            this.line = line;\n            this.offset = offset;\n            animated = false;\n            queue_draw();\n        }\n        public int line;\n        public int offset;\n        public string text;\n        public bool always_visible = false;\n\n        public double r = 1.0;\n        public double g = 0.0;\n        public double b = 0.0;\n\n        bool visible = false;\n        double proc = 0.0;\n        public override void mouse_move (int line) {\n            if (visible != (this.line == line)) {\n                animated = true;\n                visible = this.line == line;\n            }\n        }\n        public override void queue_draw() {\n            int y, height, wx, wy;\n            TextIter iter;\n            view.buffer.get_iter_at_line (out iter, line);\n            view.get_line_yrange (iter, out y, out height);\n            view.buffer_to_window_coords (TextWindowType.WIDGET, 0, y, out wx, out wy);\n            view.queue_draw_area (0, wy + offset * height - 3, view.get_allocated_width(), height + 6);\n        }\n        public override void advance() {\n            if (!always_visible) {\n                if (visible && proc < 1.0)\n                    proc += 0.1;\n                else if (!visible && proc > 0.0)\n                    proc -= 0.1;\n                else\n                    animated = false;\n            }\n        }\n        public override void draw(Cairo.Context cr) {\n            if (always_visible)\n                proc = 1.0;\n            else\n                if (proc == 0)\n                    return;\n            int y, height, wx, wy;\n            TextIter iter;\n\n            view.buffer.get_iter_at_line (out iter, line);\n            view.get_line_yrange (iter, out y, out height);\n            view.buffer_to_window_coords (TextWindowType.WIDGET, 0, y, out wx, out wy);\n            var gutter_width = \n            #if GTK_SOURCE_VIEW_3_12\n                this.view.get_window (TextWindowType.LEFT).get_width();\n            #elif GTK_SOURCE_VIEW_3_14\n                this.view.get_window (TextWindowType.LEFT).get_width();\n            #elif GTK_SOURCE_VIEW_3_14_3\n                this.view.get_window (TextWindowType.LEFT).get_width();\n            #else\n                this.view.get_gutter (TextWindowType.LEFT).get_window().get_width();\n            #endif\n\n            cr.select_font_face (\"Monospace\", Cairo.FontSlant.NORMAL, Cairo.FontWeight.NORMAL);\n            cr.set_font_size (10);\n            Cairo.TextExtents extents;\n            cr.text_extents (text, out extents);\n\n            rounded_rectangle (cr, gutter_width, wy + offset * height, extents.width + 6, extents.height + 3, 7);\n            cr.set_source_rgba (r, g, b, 1.0 * proc);\n            cr.set_line_width (2);\n            cr.stroke_preserve();\n            cr.set_source_rgba (r + 0.3, g + 0.3, b + 0.3, 0.75 * proc);\n            cr.fill();\n\n            cr.move_to (gutter_width + 3, wy + (offset + 1) * height - 5);\n            cr.set_source_rgba (0.0, 0.0, 0.0, 1.0 * proc);\n            cr.show_text (text);\n        }\n        void rounded_rectangle (Cairo.Context cr, double x, double y, double width, double height, double r) {\n            cr.move_to (x, y);\n            cr.line_to (x + width - r, y);\n            cr.curve_to(x + width, y, x + width, y, x + width, y + r);\n            cr.line_to(x + width, y + height - r);\n            cr.curve_to(x + width, y + height, x + width, y + height, x + width - r, y + height);\n            cr.line_to(x + r, y + height);\n            cr.curve_to(x, y + height, x, y + height, x, y + height - r);\n            cr.line_to(x, y + r);\n            cr.curve_to(x, y, x, y, x + r, y);\n        }\n    }\n    class LineHighlight : Animation{\n        public LineHighlight() {\n            animated = true;\n        }\n        public int line;\n        double proc = 0;\n        public override void mouse_move (int line) {\n        }\n        public override void queue_draw() {\n            int y, height, wx, wy;\n            TextIter iter;\n            view.buffer.get_iter_at_line (out iter, line);\n            view.get_line_yrange (iter, out y, out height);\n            view.buffer_to_window_coords (TextWindowType.WIDGET, 0, y, out wx, out wy);\n            view.queue_draw_area (0, wy - 10, view.get_allocated_width(), height + 20);\n        }\n        public override void advance() {\n            proc += 0.3;\n            finished = proc >= 10;\n        }\n        public override void draw(Cairo.Context cr) {\n            int y, height, wx, wy;\n            TextIter iter;\n\n            view.buffer.get_iter_at_line (out iter, line);\n            view.get_line_yrange (iter, out y, out height);\n            view.buffer_to_window_coords (TextWindowType.WIDGET, 0, y, out wx, out wy);\n\n            int width = view.get_allocated_width();// - view.get_margin_left() - 10;\n            cr.move_to (wx, wy - proc);\n            cr.set_source_rgba (1.0, 0, 0, 1.0 - proc / 10);\n            cr.rel_line_to (width, 0);\n            cr.rel_line_to (0, height + proc * 2);\n            cr.rel_line_to (-width, 0);\n            cr.close_path ();\n            cr.stroke();\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/symbol_browser.vala",
    "content": "/*\n * src/ui/symbol_browser.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gtk;\nusing Vala;\n\n/**\n * Browser symbols.\n */\npublic class SymbolBrowser : UiElement {\n    TreeView tree_view;\n    private bool update_needed = true;\n    private ulong build_init_id;\n\n    private bool init_done = false;\n    private TreeViewColumn column_sym;\n    private uint timer_id;\n\n    private SortType? sort_order = null;\n    private int? sort_id = null;\n\n    public SymbolBrowser (ValamaProject? vproject=null) {\n        if (vproject != null)\n            project = vproject;\n\n        tree_view = new TreeView();\n\n        tree_view.insert_column_with_attributes (-1,\n                                                 null,\n                                                 new CellRendererPixbuf(),\n                                                 \"pixbuf\",\n                                                 3,\n                                                 null);\n\n        var column_vissym = new TreeViewColumn.with_attributes (\n                                                 _(\"Symbol\"),\n                                                 new CellRendererText(),\n                                                 \"markup\",\n                                                 5,\n                                                 null);\n        column_vissym.sort_column_id = 0;\n        tree_view.append_column (column_vissym);\n\n        column_sym = new TreeViewColumn.with_attributes (\n                                                 null,\n                                                 new CellRendererText(),\n                                                 \"text\",\n                                                 0,\n                                                 null);\n        column_sym.visible = false;\n        tree_view.append_column (column_sym);\n\n        var column_type = new TreeViewColumn.with_attributes (\n                                                 null,\n                                                 new CellRendererText(),\n                                                 \"text\",\n                                                 1,\n                                                 null);\n        column_type.visible = false;\n        tree_view.append_column (column_type);\n\n        var column_access = new TreeViewColumn();\n        column_access.visible = false;\n        tree_view.append_column (column_access);\n\n        var column_tooltip = new TreeViewColumn.with_attributes (\n                                                 null,\n                                                 new CellRendererText(),\n                                                 \"markup\",\n                                                 4,\n                                                 null);\n        column_tooltip.visible = false;\n        tree_view.tooltip_column = 4;\n\n        var store = new TreeStore (6, typeof (string), typeof (string), typeof (uint),\n                                      typeof (Gdk.Pixbuf),\n                                      typeof (string), typeof (string));\n        tree_view.set_model (store);\n        TreeIter iter;\n        store.append (out iter, null);\n\n        tree_view.sensitive = false;\n\n        int state = -1;\n        timer_id = Timeout.add (800, () => {\n            switch (state) {\n                case 0:\n                    store.set (iter, 5, \"<i>\" + Markup.escape_text (_(\"Loading\")) + \".  </i>\", -1);\n                    ++state;\n                    break;\n                case 1:\n                    store.set (iter, 5, \"<i>\" + Markup.escape_text (_(\"Loading\")) + \".. </i>\", -1);\n                    ++state;\n                    break;\n                case 2:\n                    store.set (iter, 5, \"<i>\" + Markup.escape_text (_(\"Loading\")) + \"...</i>\", -1);\n                    ++state;\n                    break;\n                default:\n                    store.set (iter, 5, \"<i>\" + Markup.escape_text (_(\"Loading\")) + \"   </i>\", -1);\n                    state = 0;\n                    break;\n            }\n            return true;\n        });\n\n        /*\n         * NOTE: Build symbol table after threaded Guanako update has\n         *       finished. This might be later than this point, so connect\n         *       a single time to this signal.\n         */\n        build_init_id = project.guanako_update_finished.connect (() => {\n            project.disconnect (build_init_id);\n            build();\n        });\n\n        var scrw = new ScrolledWindow (null, null);\n        scrw.add (tree_view);\n\n        this.notify[\"project\"].connect (init);\n        init();\n\n        widget = scrw;\n    }\n\n    private void init() {\n        project.packages_changed.connect (() => {\n            if (!project.add_multiple_files)\n                build();\n            else\n                update_needed = true;\n        });\n        project.notify[\"add-multiple-files\"].connect (() => {\n            if (!project.add_multiple_files && update_needed)\n                build();\n        });\n    }\n\n    private int comp_sym (TreeModel model, TreeIter a, TreeIter b) {\n        Value a_type;\n        Value b_type;\n        model.get_value (a, 1, out a_type);\n        model.get_value (b, 1, out b_type);\n        var ret = symtype_to_int ((string) a_type) - symtype_to_int ((string) b_type);\n        if (ret != 0)\n            return ret;\n\n        Value a_access;\n        Value b_access;\n        model.get_value (a, 2, out a_access);\n        model.get_value (b, 2, out b_access);\n        ret = symaccess_to_int ((uint) a_access) - symaccess_to_int ((uint) b_access);\n        if (ret != 0) {\n            if (tree_view.get_column (1).sort_order == SortType.ASCENDING)\n                return ret;\n            else\n                return (-1)*ret;\n        }\n\n        Value a_str;\n        Value b_str;\n        model.get_value (a, 0, out a_str);\n        model.get_value (b, 0, out b_str);\n        ret = strcmp ((string) a_str, (string) b_str);\n        if (tree_view.get_column (1).sort_order == SortType.ASCENDING)\n            return ret;\n        else\n            return (-1)*ret;\n    }\n\n    private int symtype_to_int (string type) {\n        //TODO: Hash table to speed lookup up?\n        switch (type) {\n            case \"Namespace\":\n                return 0;\n            case \"Constant\":\n                return 1;\n            case \"Enum\":\n                return 2;\n            case \"Enum_value\":\n                return 3;\n            case \"Error_domain\":\n                return 4;\n            case \"Error_code\":\n                return 5;\n            case \"Struct\":\n                return 6;\n            case \"Interface\":\n                return 7;\n            case \"Class\":\n                return 8;\n            case \"Property\":\n                return 9;\n            case \"Field\":\n                return 10;\n            case \"Delegate\":\n                return 11;\n            case \"Method\":\n                return 12;\n            case \"Signal\":\n                return 13;\n            //TODO; What about CreationMethod?\n            default:\n                bug_msg (_(\"No valid type: %s - %s\\n\"), type, \"UiReport.symtype_to_int\");\n                return -1;\n        }\n    }\n\n    private int symaccess_to_int (uint access) {\n        switch (access) {\n            case SymbolAccessibility.INTERNAL:\n                return 0;\n            case SymbolAccessibility.PRIVATE:\n                return 1;\n            case SymbolAccessibility.PROTECTED:\n                return 2;\n            case SymbolAccessibility.PUBLIC:\n                return 3;\n            default:\n                bug_msg (_(\"No valid type: %u - %s\\n\"), access, \"UiReport.symaccess_to_int\");\n                return -1;\n        }\n    }\n\n    public override void build() {\n        new Thread<void*> (_(\"Symbol browser update\"), () => {\n            update_needed = false;\n            debug_msg (_(\"Run %s update!\\n\"), get_name());\n            var store = new TreeStore (6, typeof (string), typeof (string), typeof (uint),\n                                          typeof (Gdk.Pixbuf),\n                                          typeof (string), typeof (string));\n            store.set_sort_func (5, comp_sym);\n            if (sort_order != null && sort_id != null)\n                store.set_sort_column_id (sort_id, sort_order);\n            else\n                store.set_sort_column_id (5, SortType.ASCENDING);\n\n            TreeIter[] iters = new TreeIter[0];\n\n            Guanako.iter_symbol (project.guanako_project.root_symbol, (smb, depth) => {\n                if (smb.name != null) {\n                    TreeIter next;\n                    if (depth == 1)\n                        store.append (out next, null);\n                    else\n                        store.append (out next, iters[depth - 2]);\n                    string typename = get_symbol_type_name(smb);\n                    store.set (next, 0, smb.name,\n                                     1, typename.up(1) + typename.substring(1),\n                                     2, (uint) smb.access,\n                                     3, get_pixbuf_for_symbol (smb),\n                                     4, Markup.escape_text (Guanako.symbolsig_to_string (smb)),\n                                     5, Markup.escape_text (Guanako.symbolsig_to_string (smb, null)),\n                                     -1);\n                    if (iters.length < depth)\n                        iters += next;\n                    else\n                        iters[depth - 1] = next;\n                }\n                return Guanako.IterCallbackReturns.CONTINUE;\n            });\n            Idle.add (() => {\n                if (!init_done) {\n                    init_done = true;\n                    Source.remove (timer_id);\n                    tree_view.sensitive = true;\n                }\n                tree_view.set_model (store);\n                return false;\n            });\n\n            debug_msg (_(\"%s update finished!\\n\"), get_name());\n            return null;\n        });\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/ui_elements.vala",
    "content": "/*\n * src/ui/ui_elements.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gee;\n\n/**\n * Provides an abstraction for all pluggable UI elements.\n *\n */\n/*\n * Do not use an interface because we already have some precise definitions\n * (e.g. an instance field ui_connections).\n * Dependency interface is implemented (update calls).\n */\npublic abstract class UiElement : Object{\n    /**\n     * Possibility to lock gdl items (lock and hide grip).\n     */\n    protected bool locking;\n\n    /**\n     * Containing {@link Gtk.Widget}.\n     */\n    public Gtk.Widget widget;\n    /**\n     * Associated {@link Gdl.DockItem}.\n     */\n    public Gdl.DockItem? dock_item { get; set; default = null; }\n\n    private bool? _visible = null;\n    /**\n     * Visibility of {@link dock_item}.\n     */\n    public bool? visible {\n        get {\n            return _visible;\n        }\n        private set {\n            if (_visible != value) {\n                _visible = value;\n                visible_changed (_visible);\n            }\n        }\n    }\n\n    /**\n     * Indicate if UI is initialized.\n     */\n    private static bool initialized = false;\n\n    /**\n     * Last opened {@link Gdl.DockItem} ({@link UiElement}).\n     */\n    private static Gdl.DockItem? latest_item = null;\n    /**\n     * Saved {@link Gdl.DockItemBehavior} after hiding/locking.\n     */\n    private Gdl.DockItemBehavior? saved_behavior;\n\n    /**\n     * Emit when visibility of {@link dock_item} has changed (either iconified\n     * or closed).\n     */\n    public signal void visible_changed (bool status);\n\n    /**\n     * Status of dock_item. `true` if shown, `false` if hidden and `null` if\n     * undefined.\n     */\n    private bool? show;\n\n    /**\n     * Indicate if dock_item is/should be hidden cause of it's {@link IdeModes}.\n     */\n    private bool modehide = false;\n\n    /**\n     * Emit to show search.\n     *\n     * @param show `true` to show, `false` to hide.\n     */\n    public signal void show_element (bool show);\n\n\n    /**\n     * Share the project ({@link ValamaProject}) between all elements.\n     */\n    public static ValamaProject project { get; set; }\n\n    /**\n     * Connect locking and unlocking signals.\n     */\n    public UiElement() {\n        if (widget_main is Object) {\n            widget_main.lock_items.connect (lock_item);\n            widget_main.unlock_items.connect (unlock_item);\n            widget_main.initialized.connect (() => {\n                initialized = true;\n            });\n        } else\n            error_msg (_(\"Could not initialize locking signals.\\n\"));\n        locking = true;\n        saved_behavior = null;\n        show = null;\n\n        this.notify[\"dock-item\"].connect (() => {\n            if (dock_item != null) {\n                latest_item = dock_item;\n                saved_behavior = null;\n                visible = dock_item.visible;\n                dock_item.notify[\"visible\"].connect (() => {\n                    visible = dock_item.visible;\n                });\n                dock_item.notify[\"master\"].connect (() => {\n                    if (dock_item.master != null)\n                        dock_item.master.layout_changed.connect (() => {\n                            show = !dock_item.is_closed();\n                        });\n                });\n            }\n        });\n\n        this.visible_changed.connect ((status) => {\n            show = status;\n            show_element (status);\n        });\n\n        this.show_element.connect ((show) => {\n            if (this.show == null || show != this.show) {\n                this.show = show;\n                if (show) {\n                    modehide = true;\n                    dock_item.show_item();\n                    widget_main.focus_dock_item (dock_item);\n                    on_element_show();\n                } else {\n//                     /* Hide also iconified item by making it visible first. */\n//                     if (dock_item.is_iconified())\n//                         dock_item.show_item();\n                    modehide = false;\n                    on_element_hide();\n                    dock_item.hide_item();\n                }\n            }\n        });\n    }\n\n    /**\n     * Run after show and focus {@link dock_item}.\n     */\n    protected virtual void on_element_show() {}\n\n    /**\n     * Run after hide {@link dock_item}.\n     */\n    protected virtual void on_element_hide() {}\n\n    /**\n     * Hide dock item grip and lock it.\n     */\n    private void lock_item() {\n        if (!locking || dock_item == null || saved_behavior != null)\n            return;\n        saved_behavior = dock_item.behavior;\n#if GDL_3_9_91\n        dock_item.hide_grip();\n#else\n        /* Work arround gdl bug #515755 to not hide dockbar properly. */\n        dock_item.behavior = Gdl.DockItemBehavior.NO_GRIP;\n        dock_item.forall_internal (true, (child) => {\n            if (child is Gdl.DockItemGrip)\n                child.hide();\n        });\n#endif\n    }\n\n    /**\n     * Show dock item grip and unlock it.\n     */\n    private void unlock_item() {\n        if (!locking || dock_item == null)\n            return;\n        if (saved_behavior != null)\n            dock_item.behavior = saved_behavior;\n        saved_behavior = null;\n#if GDL_3_9_91\n        dock_item.show_grip();\n#else\n        /* See note above. */\n        dock_item.forall_internal (true, (child) => {\n            if (child is Gdl.DockItemGrip)\n                child.show();\n        });\n#endif\n    }\n\n    /**\n     * Query element name to identify class object.\n     *\n     * @return Return name.\n     */\n    public inline virtual string get_name() {\n        return this.get_type().name();\n    }\n\n    /**\n     * Show item in some {@link IdeModes} modes.\n     */\n    public void mode_to_show (IdeModes mode) {\n        project.notify[\"idemode\"].connect(() => {\n            if (dock_item != null) {\n                if ((project.idemode & mode) != 0) {\n                    if (modehide) {\n                        if (initialized) {\n                            dock_item.show_item();\n                            dock_item.show_all();\n                        }\n                    }\n                } else\n                    dock_item.hide_item();\n            }\n        });\n    }\n\n    /**\n      * Update and generate this {@link UiElement}.\n      *\n      * This build method is not called directly by others. Instead\n      * {@link update} is used (which calls all dependent build methods).\n      */\n    protected abstract void build();\n\n    //private Thread<void*> t;\n    /**\n     * Call {@link build} methods from this and all dependent\n     * {@link UiElement} class instances.\n     *\n     * Dependencies can be added with {@link add_deps}. They are invoked in\n     * parallel with {@link GLib.Thread} instances.\n     */\n    public void update (ValamaProject? vproject=null) {\n        if (vproject != null)\n            project = vproject;\n        /* Already start first update. */\n        //t = new Thread<void*> (get_name(), (ThreadFunc<void*>) build);\n        //t.join();\n        update_deps();\n    }\n\n    /**\n      * Queue of dependencies which have same priority (resolve in parallel).\n      */\n    private static Gee.PriorityQueue<UiElement> q = new Gee.PriorityQueue<UiElement>();\n    /**\n      * Queue of dependencies which have different priorities (resolve\n      * sequentially).\n      */\n    //TODO: Not implemented.\n    //private static Gee.PriorityQueue<UiElement> s_q = new Gee.PriorityQueue<UiElement>();\n\n    /**\n     * Add all dependencies to queue {@link q} and avoid duplicates.\n     */\n    private void add_deps() {\n        if (!q.contains (this))\n            q.add (this);\n        foreach (UiElement ui_element in ui_connections)\n            ui_element.add_deps();\n    }\n\n    /**\n     * Dependencies between {@link UiElement} instances.\n     * Be careful to avoid circular dependencies and deadlocks.\n     */\n    /* Order is not interesting. These \"dependencies\" are equitable. */\n    private ArrayList<UiElement> ui_connections = new ArrayList<UiElement>();\n    /*\n     * Order is important. These dependencies have to be called before this\n     * element.\n     */\n    //TODO: Not implemented.\n    //private ArrayList<UiElement> ui_dependencies;\n    /**\n     * Add an existing {@link UiElement} to equitable dependencies.\n     */\n    public new void connect (UiElement element) {\n        ui_connections.add (element);\n    }\n    /**\n     * Remove an existing {@link UiElement} from equitable dependencies.\n     */\n    public new void disconnect (UiElement element) {\n        ui_connections.remove (element);\n    }\n    //public void s_connect (UiElement element) {\n    //    ui_connections.add (element);\n    //}\n    //public void s_disconnect (UiElement element) {\n    //    ui_connections.remove (element);\n    //}\n\n    /**\n     * Calculate order of dependencies then update everything in pool\n     * {@link q}.\n     */\n    private void update_deps() {\n        /* First of all mark all dependencies as dirty (add it to queue). */\n\n        build();\n        foreach (UiElement ui_element in ui_connections)\n            ui_element.update();\n        //    ui_element.add_deps();\n\n        /* Then run all updates. */\n        /*try {\n            var tp = new ThreadPool<UiElement>.with_owned_data ((worker) => {worker.build();},\n                                                                q.size,\n                                                                false);\n            UiElement queue_element;\n            while ((queue_element = q.poll()) != null)\n                tp.add (queue_element);\n            q.clear();\n        } catch (GLib.ThreadError e) {\n            errmsg (_(\"Could not start new thread: %s\\n\"), e.message);\n        }*/\n    }\n\n    /* Abort all updates. */\n    //TODO: Not implemented.\n    //public void abort() {}\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/valadoc_browser.vala",
    "content": "/*\n * src/ui/structure_view.vala\n * Copyright (C) 2014, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\nusing WebKit;\n\npublic class UiValadocBrowser : UiElement {\n    public UiValadocBrowser() {\n        var vbox = new Box (Orientation.VERTICAL, 0);\n\n        var sw = new ScrolledWindow (null, null);\n        vbox.pack_start (sw, true, true);\n\n        var webview = new WebView();\n        webview.load_changed.connect ((event) => {\n            if (event == LoadEvent.STARTED && !webview.get_uri().has_prefix (\"http://www.valadoc.org/\")) {\n                webview.stop_loading();\n                //TODO: Show visible message.\n                debug_msg (\"Tried to access content outside of documentation domain: %s\\n\",\n                           webview.get_uri());\n            }\n        });\n        //TODO: Make this configurable.\n        webview.load_uri (\"http://www.valadoc.org\");\n        sw.add (webview);\n\n        widget = vbox;\n        widget.show_all();\n    }\n\n    protected override void build() {}\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/welcome_screen/create_project_buildsystem.vala",
    "content": "/*\n * src/ui/welcome_screen/create_project_buildsystem.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n// Project creation: Name and location\n\nusing Gtk;\n\nnamespace WelcomeScreen {\n\n    protected class CreateProjectBuildsystem : TemplatePageWithHeader {\n        public CreateProjectBuildsystem (ref ProjectCreationInfo info) {\n            this.info = info;\n            check_btn = new Gtk.CheckButton.with_label (_(\"make library\"));\n            go_to_next_clicked.connect (() => { \n                switch (bs) {\n                    case \"plain\":\n                        this.info.template.vproject.builder = new BuilderPlain (check_btn.active);\n                        break;\n                    case \"cmake\":\n                        this.info.template.vproject.builder = new BuilderCMake(check_btn.active);\n                        break;\n                    case \"autotools\":\n                        this.info.template.vproject.builder = new BuilderAutotools(check_btn.active);\n                        break;\n                    default:\n                        this.info.template.vproject.builder = new BuilderPlain (check_btn.active);\n                        bug_msg (_(\"Buildsystem '%s' not recognized.\"), bs);\n                        break;\n                }\n                this.info.buildsystem = this.info.template.vproject.builder.get_name_id();\n                this.info.make_library = check_btn.active;\n            });\n        }\n        private ProjectCreationInfo info;\n        private string bs;\n        Gtk.CheckButton check_btn;\n\n        protected override void clean_up() {\n\n        }\n        protected override Gtk.Widget build_inner_widget() {\n            heading = _(\"Choose Buildsystem\");\n            description = _(\"Choose a buildsystem for current project.\");\n            BuildSystemTemplate.load_buildsystems (true);\n            var frame = new Frame(null);\n            var box = new Gtk.Box (Orientation.VERTICAL, 20);\n            var list = new Gtk.ListBox ();\n            list.row_activated.connect (row => {\n                bs = (row.get_child() as Gtk.Label).label;\n            });\n            var row = new ListBoxRow();\n            var lbl = new Label (\"plain\");\n            row.add (lbl);\n            list.add (row);\n            ListBoxRow? row_selected = null;\n            buildsystems.foreach (entry => {\n                row = new Gtk.ListBoxRow();\n                lbl = new Gtk.Label (entry.key);\n                row.add (lbl);\n                list.add (row);\n                if (row_selected == null && entry.key == info.template.vproject.buildsystem) {\n                    row_selected = row;\n                    bs = entry.key;\n                }\n                return true;\n            });\n            list.select_row (row_selected);\n            box.pack_start (list);\n            box.pack_start (check_btn);\n            check_btn.active = info.template.vproject.library;\n            frame.add(box);\n            var align = new Alignment (0.5f, 0.1f, 1.0f, 0.0f);\n            align.add (frame);\n            return align;\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/welcome_screen/create_project_location.vala",
    "content": "/*\n * src/ui/welcome_screen/create_project_location.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n\n// Project creation: Name and location\n\nusing Gtk;\n\nnamespace WelcomeScreen {\n\n    // Class to hold all information on the new project across pages\n    protected class ProjectCreationInfo {\n        public string name = \"\";\n        public string buildsystem = \"\";\n        public bool make_library = false;\n        public string directory = \"\";\n        public string[] packages = new string[0];\n        public ProjectTemplate template;\n    }\n\n    protected class CreateProjectLocation : TemplatePageWithHeader {\n        public CreateProjectLocation (ref ProjectCreationInfo info) {\n            this.info = info;\n        }\n        private ProjectCreationInfo info;\n        private Entry ent_pname;\n        private FileChooserButton chooser_location;\n        protected override void clean_up() {\n            info.name = ent_pname.text;\n            info.directory = Path.build_path (Path.DIR_SEPARATOR_S,\n                                     chooser_location.get_filename(),\n                                     ent_pname.text);\n        }\n        protected override Gtk.Widget build_inner_widget() {\n            heading = _(\"Create project\");\n            description = _(\"Project settings\");\n            btn_next.sensitive = false;\n\n            var frame = new Frame(null);\n            var list = new Gtk.ListBox ();\n            list.selection_mode = SelectionMode.NONE;\n            list.row_selected.connect((row)=>{row.activate();}); //TODO: Possibly unnecessary in future GTK versions\n\n            // Project name row\n            var row = new ListBoxRow();\n            var box = new Box(Orientation.HORIZONTAL, 0);\n            var lbl_pname = new Label (_(\"Project name\"));\n            lbl_pname.halign = Align.START;\n            box.pack_start (lbl_pname, true, true);\n\n            var valid_chars = /^[a-z0-9.:_-]+$/i;  // keep \"-\" at the end!\n            ent_pname = new Entry.with_inputcheck (null, valid_chars);\n            ent_pname.set_placeholder_text (_(\"project name\"));\n            ent_pname.valid_input.connect (() => {\n                btn_next.sensitive = true;\n            });\n            ent_pname.invalid_input.connect (() => {\n                btn_next.sensitive = false;\n            });\n            box.pack_start (ent_pname, true, true);\n\n            row.add (box);\n            standardize_listbox_row (row);\n            list.add (row);\n\n\n            // Project location row\n            row = new ListBoxRow();\n            box = new Box(Orientation.HORIZONTAL, 0);\n            var lbl_plocation = new Label (_(\"Location\"));\n            lbl_plocation.halign = Align.START;\n            box.pack_start (lbl_plocation, true, true);\n            //TODO: Use in place dialog (FileChooserWidget).\n            chooser_location = new FileChooserButton (_(\"New project location\"),\n                                                          Gtk.FileChooserAction.SELECT_FOLDER);\n            chooser_location.set_current_folder (Environment.get_current_dir());\n\n            box.pack_start (chooser_location, true, true);\n            row.add (box);\n            standardize_listbox_row (row);\n            list.add (row);\n\n\n            frame.add(list);\n            var align = new Alignment (0.5f, 0.1f, 1.0f, 0.0f);\n            align.add (frame);\n            return align;\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4"
  },
  {
    "path": "src/ui/welcome_screen/create_project_packages.vala",
    "content": "using Gtk;\n\nnamespace WelcomeScreen {\n    protected class CreateProjectPackages : TemplatePageWithHeader {\n        public CreateProjectPackages (ref ProjectCreationInfo info)\n        {\n            this.info = info;\n            listmodel = new Gtk.ListStore (3, typeof (bool), typeof (string), typeof (string));\n            go_to_next_clicked.connect (() => {\n                var pkgs = new string[0];\n                listmodel.foreach((m,p,i) => {\n                    Value v1, v2;\n                    m.get_value(i, 0, out v1);\n                    m.get_value(i, 1, out v2);\n                    if((bool)v1)\n                        pkgs += (string)v2;\n                    return false;\n                });\n                this.info.packages = pkgs;\n            });\n        }\n        \n        private ProjectCreationInfo info;\n        Gtk.ListStore listmodel;\n    \n        protected override void clean_up(){}\n        \n      \n        \n        protected override Gtk.Widget build_inner_widget() {\n            heading = _(\"Choose packages\");\n            description = _(\"packages for current project\");\n            \n            var frame = new Frame (null);\n            var sw = new ScrolledWindow (null, null);\n            frame.add (sw);\n            var tree_view = new TreeView();\n            tree_view.set_model (listmodel);\n            CellRendererToggle toggle = new CellRendererToggle();\n            toggle.toggled.connect ((toggle, path) => {\n                TreePath tree_path = new TreePath.from_string (path);\n                TreeIter iter;\n                listmodel.get_iter (out iter, tree_path);\n                listmodel.set (iter, 0, !toggle.active);\n            });\n            TreeViewColumn column = new TreeViewColumn();\n            column.pack_start (toggle, false);\n            column.add_attribute (toggle, \"active\", 0);\n            tree_view.append_column (column);\n            \n            CellRendererText text = new CellRendererText();\n            column = new TreeViewColumn();\n            column.title = \"Package\";\n            column.pack_start (text, true);\n            column.add_attribute (text, \"text\", 1);\n            tree_view.append_column (column);\n            \n            CellRendererText desc_text = new CellRendererText();\n            column = new TreeViewColumn();\n            column.title = \"Description\";\n            column.pack_start (desc_text, true);\n            column.add_attribute (desc_text, \"text\", 2);\n            tree_view.append_column (column);\n            \n            var pkg_infos = list_all_pkg_config();\n            \n            pkg_infos.foreach (entry => {\n                if (info.template.vproject.packages.has_key (entry.key))\n                    return true;\n                TreeIter iter;\n                listmodel.append (out iter);\n                listmodel.set (iter, 0, false, 1, entry.key, 2, entry.value);\n                return true;\n            }); \n            sw.add (tree_view); \n            return frame;\n        }\n    }\n}\n"
  },
  {
    "path": "src/ui/welcome_screen/create_project_template.vala",
    "content": "/*\n * src/ui/welcome_screen/create_project_location.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n\n// Project creation: Template\n\nusing Gtk;\n\nnamespace WelcomeScreen {\n\nusing GLib;\nusing Gtk;\nusing Gee;\n\npublic class CreateProjectTemplate : TemplatePageWithHeader {\n    private TreeView tree_view;\n    private Gtk.ListStore store;\n    private ToggleToolButton btn_credits;\n    private ToggleToolButton btn_vlpinfo;\n    private ToggleToolButton btn_info;\n\n    private bool has_content;\n\n    private Widget tinfo;\n\n    private AccelGroup accel_group = new AccelGroup();\n\n    private ProjectCreationInfo info;\n    public CreateProjectTemplate (ref ProjectCreationInfo info) {\n        this.info = info;\n    }\n\n    protected override void clean_up() {\n        window_main.remove_accel_group (accel_group);\n        info.template = get_selected_template();\n    }\n    protected override Gtk.Widget build_inner_widget() {\n        heading = _(\"Create project\");\n        description = _(\"Select template\");\n\n        var vbox = new Box (Orientation.VERTICAL, 0);\n        vbox.expand = true;\n\n        var infobox = new Box (Orientation.HORIZONTAL, 0);\n        vbox.pack_start (infobox, true, true);\n\n        var scrw = new ScrolledWindow (null, null);\n        infobox.pack_start (scrw, true, true);\n\n        tree_view = new TreeView();\n        scrw.add (tree_view);\n\n        var toolbar = new Toolbar();\n        var toolbar_scon = toolbar.get_style_context();\n        toolbar_scon.add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        vbox.pack_end (toolbar, false, false);\n\n        btn_credits = new ToggleToolButton();\n        btn_credits.visible = false;\n        btn_credits.no_show_all = true;\n        btn_credits.icon_name = \"user-bookmarks-symbolic\";\n        toolbar.add (btn_credits);\n        btn_credits.tooltip_text = _(\"Author information\");\n\n        btn_vlpinfo = new ToggleToolButton();\n        btn_vlpinfo.visible = false;\n        btn_vlpinfo.no_show_all = true;\n        btn_vlpinfo.icon_name = \"emblem-system-symbolic\";\n        toolbar.add (btn_vlpinfo);\n        btn_vlpinfo.tooltip_text = _(\"Detailed information\");\n\n        var separator_expand = new SeparatorToolItem();\n        separator_expand.set_expand (true);\n        separator_expand.draw = false;\n        toolbar.add (separator_expand);\n\n        btn_info = new ToggleToolButton();\n        btn_info.icon_name = \"dialog-information\";\n        btn_info.sensitive = false;\n        btn_info.tooltip_text = _(\"Template information\");\n        toolbar.add (btn_info);\n\n        /*\n         * If this is needed, both accelerators could be removed and added\n         * according to btn_info.active. This is not already done cause of\n         * overhead to remove and add accelerators globally but would be only\n         * a single code line for each (disconnect_key).\n         */\n        accel_group.connect (Gdk.Key.i, 0, 0, () => {\n            btn_info.active = true;\n            return true;\n        });\n        accel_group.connect (Gdk.Key.Escape, 0, 0, () => {\n            btn_info.active = false;\n            return true;\n        });\n        window_main.add_accel_group (accel_group);\n\n        btn_info.toggled.connect (() => {\n            if (btn_info.active) {\n                tinfo = show_template_info();\n                if (tinfo == null)\n                    btn_info.active = false;\n                else {\n                    infobox.remove (scrw);\n                    infobox.pack_start (tinfo, true, true);\n                }\n            } else {\n                infobox.remove (tinfo);\n                btn_vlpinfo.visible = false;\n                btn_credits.visible = false;\n                infobox.pack_start (scrw, true, true);\n                tree_view.grab_focus();\n            }\n\n        });\n\n        tree_view.insert_column_with_attributes (-1,\n                                                 null,\n                                                 new CellRendererPixbuf(),\n                                                 \"pixbuf\",\n                                                 1);\n        tree_view.insert_column_with_attributes (-1,\n                                                 _(\"Templates\"),\n                                                 new CellRendererText(),\n                                                 \"markup\",\n                                                 0);\n        var column_id = new TreeViewColumn.with_attributes (\n                                                 null,\n                                                 new CellRendererText(),\n                                                 \"text\",\n                                                 2,\n                                                 null);\n        column_id.visible = false;\n        tree_view.append_column (column_id);\n\n        tree_view.row_activated.connect (() => {\n            btn_info.active = true;\n        });\n\n\n        vbox.show_all();\n\n\n        store = new Gtk.ListStore (3, typeof (string), typeof (Gdk.Pixbuf), typeof (string));\n        tree_view.set_model (store);\n\n        load_templates();\n        if (get_templates().size > 0) {\n            bool first_entry = true;\n            foreach (var template in get_templates().values) {\n                TreeIter iter;\n                store.append (out iter);\n\n                try {\n                    template.init();\n                } catch (LoadingError e) {\n                    warning_msg (_(\"Could not load project template: %s\\n\"), e.message);\n                    continue;\n                }\n                btn_info.sensitive = true;\n                has_content = true;\n\n                var strb_tlabel = new StringBuilder();\n                if (template.unmet_deps.size > 0)\n                    strb_tlabel.append (\"\"\"<span foreground=\"grey\">\"\"\");\n                strb_tlabel.append (\"<b>\" + Markup.escape_text (template.name) + \"</b>\\n\"\n                                    + Markup.escape_text (template.description));\n\n                if (template.unmet_deps.size > 0) {\n                    strb_tlabel.append (\"\\n\" + Markup.escape_text (_(\"Missing packages: \")));\n                    strb_tlabel.append (Markup.escape_text (template.unmet_deps[0].to_string()));\n                    if (template.unmet_deps[0].choice != null)\n                        foreach (var pkg in template.unmet_deps[0].choice.packages)\n                            if (pkg != template.unmet_deps[0])\n                                strb_tlabel.append (Markup.escape_text (@\", $pkg\"));\n                    for (var i = 1; i < template.unmet_deps.size; ++i) {\n                        strb_tlabel.append (Markup.escape_text (@\", $(template.unmet_deps[i])\"));\n                        if (template.unmet_deps[i].choice != null)\n                            foreach (var pkg in template.unmet_deps[i].choice.packages)\n                                if (pkg != template.unmet_deps[i])\n                                    strb_tlabel.append (Markup.escape_text (@\"/$pkg\"));\n                    }\n                    strb_tlabel.append (\"</span>\");\n                }\n                store.set (iter, 0, strb_tlabel.str, 1, template.icon, 2, template.name, -1);\n\n                // Select first entry\n                if (first_entry) {\n                    tree_view.get_selection().select_iter(iter);\n                    first_entry = false;\n                }\n            }\n        }\n        return vbox;\n    }\n\n    private ProjectTemplate? get_selected_template() {\n        TreeModel model;\n        TreeIter iter;\n        if (tree_view.get_selection().get_selected (out model, out iter)) {\n            Value template_id_val;\n            store.get_value (iter, 2, out template_id_val);\n            var template_id = template_id_val as string;\n            if (template_id != null)\n                return get_templates()[template_id];\n            else\n                bug_msg (_(\"Could not get %s from %s: %s\\n\"),\n                         \"ProjectTemplate\", \"ListStore\", \"get_selected_template\");\n        }\n        return null;\n    }\n\n    private Widget? show_template_info() {\n        var template = get_selected_template();\n        if (template == null)\n            return null;\n\n        btn_vlpinfo.visible = true;\n        btn_vlpinfo.active = false;\n        btn_credits.visible = true;\n        btn_credits.active = false;\n\n        var vbox = new Box (Orientation.VERTICAL, 10);\n\n        var hbox = new Box (Orientation.HORIZONTAL, 0);\n        vbox.pack_start (hbox, false, false);\n\n        // Icon.\n        var img = new Image.from_pixbuf (template.icon);\n        hbox.pack_start (img, false, true);\n\n        // Name.\n        var name_lbl = new Label (\"\"\"<span size=\"xx-large\" font_weight=\"bold\">\"\"\"\n                                  + Markup.escape_text (template.name) + \"</span>\");\n        name_lbl.use_markup = true;\n        hbox.pack_start (name_lbl, true, true);\n\n        // Description.\n        var desc_lbl = new Label (\"\"\"<span size=\"large\">\"\"\"\n                                  + Markup.escape_text (template.description) + \"</span>\");\n        desc_lbl.use_markup = true;\n        vbox.pack_start (desc_lbl, false, false);\n\n        // Content area\n        var hldescbox = new Box (Orientation.HORIZONTAL, 20);\n        vbox.pack_start (hldescbox, true, true);\n\n        // Placeholder left.\n        hldescbox.pack_start (new Box (Orientation.HORIZONTAL, 0), false, true);\n\n        var extrainfo_nbook = new Notebook();\n        hldescbox.pack_start (extrainfo_nbook, true, true);\n        extrainfo_nbook.show_tabs = false;\n        extrainfo_nbook.show_border = false;\n        var extrainfo_nbook_max_pages = 0;\n\n        // Placeholder right.\n        hldescbox.pack_start (new Box (Orientation.HORIZONTAL, 0), false, true);\n\n\n        // Long description.\n        var longdesc_scrw = new ScrolledWindow (null, null);\n        extrainfo_nbook.append_page (longdesc_scrw);\n        longdesc_scrw.border_width = 5;\n        longdesc_scrw.shadow_type = ShadowType.IN;\n\n        var longdesc_viewport = new Viewport (null, null);\n        longdesc_scrw.add (longdesc_viewport);\n        var longdesc_grid = new Grid();\n        longdesc_viewport.add (longdesc_grid);\n        longdesc_grid.border_width = 5;\n\n        Label longdesc_lbl;\n        if (template.long_description != null) {\n            longdesc_lbl = new Label (template.long_description);\n            longdesc_lbl.selectable = true;\n            longdesc_lbl.wrap = true;\n        } else\n            longdesc_lbl = new Label (\"<i>\" + Markup.escape_text (_(\"no long description\")) + \"</i>\");\n        longdesc_lbl.use_markup = true;\n        longdesc_grid.attach (longdesc_lbl, 0, 0, 1, 1);\n\n        // Credits.\n        if (template.authors.size > 0) {\n            var credits_scrw = new ScrolledWindow (null, null);\n            extrainfo_nbook.append_page (credits_scrw);\n            ++extrainfo_nbook_max_pages;\n            credits_scrw.border_width = 5;\n            credits_scrw.shadow_type = ShadowType.IN;\n\n            var credits_viewport = new Viewport (null, null);\n            credits_scrw.add (credits_viewport);\n            var credits_grid = new Grid();\n            credits_viewport.add (credits_grid);\n            credits_grid.border_width = 50;\n            credits_grid.column_spacing = 8;\n            credits_grid.row_spacing = 2;\n\n            string auth_str;\n            if (template.authors.size == 1)\n                auth_str = _(\"Author\");\n            else\n                auth_str = _(\"Authors\");\n            var credits_heading = new Label (\"\"\"<span font_weight=\"bold\" font_size=\"large\">\"\"\"\n                                            + Markup.escape_text (auth_str) + \"</span>\");\n            credits_heading.use_markup = true;\n            credits_grid.attach (credits_heading, 0, 0, 2, 1);\n            credits_heading.halign = Align.START;\n\n            for (int i = 0; i < template.authors.size; ++i) {\n                var author = template.authors[i];\n                if (author.date != null) {\n                    var credits_author_date_lbl = new Label (author.date);\n                    credits_grid.attach (credits_author_date_lbl, 1, i+1, 1, 1);\n                    credits_author_date_lbl.halign = Align.START;\n                }\n\n                var strb_author = new StringBuilder();\n                if (author.name != null && author.mail != null)\n                    strb_author.append (\"<a href=\\\"mailto:\" + Markup.escape_text (author.mail)\n                                        + \"\\\">\" + Markup.escape_text (author.name) + \"</a>\");\n                else if (author.name != null)\n                    strb_author.append (author.name);\n                else if (author.mail != null)\n                    strb_author.append (\"<a href=\\\"mailto:\" + Markup.escape_text (author.mail)\n                                        + \"\\\">\" + Markup.escape_text (author.mail) + \"</a>\");\n                if (author.comment != null)\n                    strb_author.append (Markup.escape_text (@\" ($(author.comment))\"));\n                var credits_author_lbl = new Label (strb_author.str);\n                credits_author_lbl.use_markup = true;\n                credits_grid.attach (credits_author_lbl, 2, i+1, 1, 1);\n                credits_author_lbl.halign = Align.START;\n            }\n        } else\n            btn_credits.visible = false;\n\n\n        // Template detailed information.\n        var detailed_scrw = new ScrolledWindow (null, null);\n        extrainfo_nbook.append_page (detailed_scrw);\n        ++extrainfo_nbook_max_pages;\n        detailed_scrw.border_width = 5;\n        detailed_scrw.shadow_type = ShadowType.IN;\n\n        var detailed_viewport = new Viewport (null, null);\n        detailed_scrw.add (detailed_viewport);\n        var detailed_grid = new Grid();\n        detailed_viewport.add (detailed_grid);\n        detailed_grid.border_width = 50;\n        detailed_grid.column_spacing = 8;\n        detailed_grid.row_spacing = 2;\n\n        int detailed_line = 0;\n\n        // Vala version.\n        if (template.versions.size > 0) {\n            var detailed_vala_info = new Label (\"\"\"<span font_size=\"large\">\"\"\"\n                                                + Markup.escape_text (_(\"Supported Vala versions\"))\n                                                + \"</span>\");\n            detailed_vala_info.use_markup = true;\n            detailed_vala_info.halign = Align.START;\n            detailed_grid.attach (detailed_vala_info, 0, detailed_line++, 2, 1);\n\n            foreach (var ver in template.versions) {\n                string? relation = null;\n                string relation_after = \"\";\n                switch (ver.rel) {\n                    case VersionRelation.AFTER:\n                        // TRANSLATORS: Version relation: X > Y\n                        relation = _(\"after\");\n                        break;\n                    case VersionRelation.SINCE:\n                        // TRANSLATORS: Version relation: X >= Y\n                        relation = _(\"since\");\n                        break;\n                    case VersionRelation.UNTIL:\n                        // TRANSLATORS: Version relation: X <= Y\n                        relation = _(\"until\");\n                        break;\n                    case VersionRelation.BEFORE:\n                        // TRANSLATORS: Version relation: X < Y\n                        relation = _(\"before\");\n                        break;\n                    case VersionRelation.ONLY:\n                        // TRANSLATORS: Version relation: X == Y\n                        break;\n                    case VersionRelation.EXCLUDE:\n                        // TRANSLATORS: Version relation: X != Y\n                        relation_after = \" \" + _(\"not supported\");\n                        break;\n                    default:\n                        bug_msg (_(\"Unexpected enum value: %s: %d\\n\"),\n                                 \"VersionRelation - show_template_info\", ver.rel);\n                        break;\n                }\n                if (relation != null) {\n                    var ver_rel_lbl = new Label (relation + \" \");\n                    ver_rel_lbl.halign = Align.END;\n                    detailed_grid.attach (ver_rel_lbl, 1, detailed_line, 1, 1);\n                }\n                var ver_lbl = new Label (\"<b>\" + Markup.escape_text (ver.version)\n                                        + \"</b>\" + Markup.escape_text (relation_after));\n                ver_lbl.use_markup = true;\n                ver_lbl.halign = Align.START;\n                detailed_grid.attach (ver_lbl, 2, detailed_line++, 1, 1);\n            }\n        }\n\n        // Packages.\n        if (template.versions.size > 0)\n            detailed_grid.attach (new Label (\"\"), 0, detailed_line++, 2, 1);\n\n        var detailed_pkg_info = new Label (\"\"\"<span font_size=\"large\">\"\"\"\n                                            + Markup.escape_text (_(\"Packages\")) + \"</span>\");\n        detailed_pkg_info.use_markup = true;\n        detailed_pkg_info.halign = Align.START;\n        detailed_grid.attach (detailed_pkg_info, 0, detailed_line++, 2, 1);\n\n        if (template.vproject.packages.size > 0)\n            foreach (var pkg in template.vproject.packages.values) {\n                Label pkg_lbl;\n                var strb_pkgstr = new StringBuilder();\n                if (pkg in template.unmet_deps) {\n                    strb_pkgstr.append (\"<i>\");\n                    if (pkg.choice == null)\n                        strb_pkgstr.append (Markup.escape_text (pkg.to_string()));\n                    else {\n                        strb_pkgstr.append (pkg.choice.packages[0].to_string());\n                        for (int i = 1; i < pkg.choice.packages.size; ++i)\n                            strb_pkgstr.append (Markup.escape_text (@\"/$(pkg.choice.packages[i])\"));\n                    }\n                    strb_pkgstr.append (\"</i> (\" + Markup.escape_text (_(\"not available\")) + \")\");\n                    pkg_lbl = new Label (strb_pkgstr.str);\n                } else {\n                    if (pkg.choice == null || pkg.choice.packages.size == 1)\n                        strb_pkgstr.append (Markup.escape_text (pkg.to_string()));\n                    else {\n                        strb_pkgstr.append (Markup.escape_text (pkg.to_string()) + \" <i>(\");\n                        var first = true;\n                        foreach (var pkg_choice in pkg.choice.packages)\n                            if (pkg != pkg_choice) {\n                                if (!first)\n                                    strb_pkgstr.append (Markup.escape_text (@\"/$pkg_choice\"));\n                                else {\n                                    strb_pkgstr.append (Markup.escape_text (pkg_choice.to_string()));\n                                    first = false;\n                                }\n                            }\n                        strb_pkgstr.append (\")</i>\");\n                    }\n                    pkg_lbl = new Label (strb_pkgstr.str);\n                }\n                pkg_lbl.use_markup = true;\n                pkg_lbl.halign = Align.START;\n                detailed_grid.attach (pkg_lbl, 1, detailed_line++, 1, 1);\n            }\n        else {\n            var pkg_lbl = new Label (\"<i>\" + Markup.escape_text (_(\"no package required\")) + \"</i>\");\n            pkg_lbl.use_markup = true;\n            pkg_lbl.halign = Align.START;\n            detailed_grid.attach (pkg_lbl, 1, detailed_line++, 1, 1);\n        }\n\n        // Source files.\n        detailed_grid.attach (new Label (\"\"), 0, detailed_line++, 2, 1);\n\n        var detailed_file_info = new Label (\"\"\"<span font_size=\"large\">\"\"\"\n                                            + Markup.escape_text (_(\"Source files\")) + \"</span>\");\n        detailed_file_info.use_markup = true;\n        detailed_file_info.halign = Align.START;\n        detailed_grid.attach (detailed_file_info, 0, detailed_line++, 2, 1);\n\n        if (template.s_files.size > 0)\n            foreach (var s_file in template.s_files) {\n                var s_file_lbl = new Label (s_file);\n                s_file_lbl.halign = Align.START;\n                detailed_grid.attach (s_file_lbl, 1, detailed_line++, 1, 1);\n            }\n        else {\n            var s_file_lbl = new Label (\"<i>\" + Markup.escape_text (_(\"no source files\")) + \"</i>\");\n            s_file_lbl.use_markup = true;\n            s_file_lbl.halign = Align.START;\n            detailed_grid.attach (s_file_lbl, 1, detailed_line++, 1, 1);\n        }\n\n\n        btn_credits.clicked.connect (() => {\n            if (btn_credits.active) {\n                btn_vlpinfo.active = false;\n                extrainfo_nbook.page = 1;\n            } else if (!btn_vlpinfo.active)\n                extrainfo_nbook.page = 0;\n        });\n        btn_vlpinfo.clicked.connect (() => {\n            if (btn_vlpinfo.active) {\n                btn_credits.active = false;\n                extrainfo_nbook.page = extrainfo_nbook_max_pages;\n            } else if (!btn_credits.active)\n                extrainfo_nbook.page = 0;\n        });\n\n        vbox.show_all();\n        return vbox;\n    }\n}\n\n    public static ValamaProject? create_project_from_template (ProjectCreationInfo info) {\n        try { //TODO: Separate different error catchings to provide differentiate error messages.\n            //TODO: Add progress bar and at least warn on overwrite (don't skip\n            //      without warning).\n            if (info.template.path.length > 0) {\n                new FileTransfer (info.template.path,\n                                  info.directory,\n                                  CopyRecursiveFlags.SKIP_EXISTENT).copy();\n                new FileTransfer (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                   info.directory,\n                                                   \"template.vlp\"),\n                                  Path.build_path (Path.DIR_SEPARATOR_S,\n                                                   info.directory,\n                                                   info.name + \".vlp\"),\n                                  CopyRecursiveFlags.SKIP_EXISTENT).move();\n            } else {\n                var vlppath = Path.build_path (Path.DIR_SEPARATOR_S,\n                                               info.directory,\n                                               info.name + \".vlp\") ;\n                var f = File.new_for_path (vlppath);\n                var parent = f.get_parent();\n                if (!parent.query_exists())\n                    try {\n                        parent.make_directory_with_parents();\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Cannot create project root directory '%s': %s\\n\"),\n                                parent.get_path(), e.message);\n                    }\n\n                if (f.query_exists())\n                    debug_msg (_(\"Skip %s\\n\"), vlppath);\n                else {\n                    try {\n                        var os = f.create (FileCreateFlags.NONE);\n                        os.write (info.template.vproject.project_file_data.data);\n                    } catch (GLib.IOError e) {\n                        errmsg (_(\"Cannot write to project file '%s': %s\\n\"), vlppath, e.message);\n                        // return null;\n                    } catch (GLib.Error e) {\n                        errmsg (_(\"Cannot create project file '%s': %s\\n\"), vlppath, e.message);\n                        // return null;\n                    }\n                }\n            }\n\n            BuildSystemTemplate.load_buildsystems();\n            if (info.template.vproject.builder.get_name_id() in get_buildsystems().keys) {\n                new FileTransfer (get_buildsystems()[info.template.vproject.builder.get_name_id()].path,\n                                  info.directory,\n                                  CopyRecursiveFlags.SKIP_EXISTENT).copy();\n            }\n\n            // Substitutions.\n            var tsh = new TempSubsHelper (info.template.substitutions, info.directory);\n            tsh.substitute();\n        } catch (GLib.Error e) {\n            errmsg (_(\"Could not copy templates for new project: %s\\n\"), e.message);\n        }\n\n\n        ValamaProject? new_proj = null;\n        try {\n            new_proj = new ValamaProject (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                           info.directory,\n                                                           info.name + \".vlp\"),\n                                          null,\n                                          true,\n                                          false);\n            new_proj.project_name = info.name;\n            new_proj.buildsystem = info.buildsystem;\n            new_proj.builder = info.template.vproject.builder;\n            if (info.buildsystem == \"autotools\") {\n                new_proj.buildsystem_dirs.clear();\n                new_proj.buildsystem_dirs.add(\"\");\n            }\n            new_proj.library = info.make_library;\n            new_proj.add_packages_by_names (info.packages);\n            new_proj.save_to_recent();\n            new_proj.save_project_file();\n        } catch (LoadingError e) {\n            errmsg (_(\"Couldn't load new project: %s\\n\"), e.message);\n        }\n        return new_proj;\n    }\n\n\n    public class TempSubsHelper {\n        /**\n         * Files with list of substitutions to seek only one time through a file.\n         */\n        private HashMap<string, ArrayList<TemplateSubstition?>?> acc_subst;\n\n        /**\n         * Initialize list of files. To apply substitutions run\n         * {@link substitutions}.\n         *\n         * @param substitutions List of all substitutions.\n         * @param basedir Base directory for relative paths.\n         */\n        public TempSubsHelper (Iterable<TemplateSubstition?> substitutions, string basedir) {\n            acc_subst = new HashMap<string, ArrayList<TemplateSubstition?>?>();\n\n            foreach (var sub in substitutions) {\n                var target = Path.build_path (Path.DIR_SEPARATOR_S,\n                                              basedir,\n                                              sub.file);\n                var f = File.new_for_path (target);\n                if (!f.query_exists()) {\n                    // TRANSLATORS:\n                    // Context: \"Cannot apply substitution @foobar@ (line) -> 'barfoo'\"... or\n                    //          \"Cannot apply substitution @foobar@ -> 'barfoo'\"...\n                    warning_msg (_(\"Cannot apply substitution '@%s@'%s -> '%s': %s does not exist\\n\"),\n                    // TRANSLATORS:\n                    // Context: \"Cannot apply substitution @foobar@->>> (line)<<<- -> 'barfoo'\"...\n                                 sub.match, (sub.line) ? _(\" (line)\") : \"\", sub.replace, target);\n                    continue;\n                }\n\n                temp_substitute (sub, f);\n            }\n        }\n\n        /**\n         * Apply substitutions to template code.\n         *\n         * @param sub Information what to substitute.\n         * @param f {@link GLib.File} object to apply substitution to.\n         */\n        private void temp_substitute (TemplateSubstition sub, File f) {\n            string fpath = f.get_path();\n            if (fpath == null) {\n                warning_msg (_(\"Could not determine file path: %s\\n\"), f.get_parse_name());\n                return;\n            }\n            if (f.query_file_type (FileQueryInfoFlags.NONE) == FileType.DIRECTORY) {\n                // Recursion.\n                try {\n                    var enumerator = f.enumerate_children (\"standard::*\", FileQueryInfoFlags.NONE);\n                    FileInfo info = null;\n                    while ((info = enumerator.next_file()) != null)\n                        temp_substitute (sub, f.resolve_relative_path (info.get_name()));\n                } catch (GLib.Error e) {\n                    warning_msg (_(\"Could not list or iterate through directory content of '%s': %s\\n\"),\n                                 fpath, e.message);\n                }\n            } else {\n                ArrayList<TemplateSubstition?> suba;\n                if (acc_subst.has_key (fpath))\n                    suba = acc_subst.get (fpath);\n                else\n                    suba = new ArrayList<TemplateSubstition?>();\n                suba.add (sub);\n                acc_subst.set (fpath, suba);\n            }\n        }\n\n        /**\n         * Apply accumulated substitutions to temporary file (.valama-new) then\n         * overwrite old file.\n         */\n        //TODO: Don't do anything where nothing is to substitute.\n        public void substitute() {\n            foreach (var entry in acc_subst.entries) {\n                var filename = entry.key;\n                var sublist = entry.value;\n\n                foreach (var sub in sublist)\n                    debug_msg (_(\"Substitute: '@%s@'%s -> '%s': %s\\n\"),\n                               sub.match, (sub.line) ? _(\" (line)\") : \"\", sub.replace, filename);\n\n\n                var fi = File.new_for_path (filename);\n                FileInputStream fis;\n                try {\n                    fis = fi.read();\n                } catch (GLib.Error e) {\n                    warning_msg (_(\"Cannot read file '%s': %s\\n\"), filename, e.message);\n                    return;\n                }\n\n                var filename_new = @\"$(filename).valama-new\";\n                var fo = File.new_for_path (filename_new);\n                uint i = 0;\n                while (fo.query_exists()) {\n                    if (i++ == 0)\n                        filename_new = filename_new + i.to_string();\n                    else\n                        filename_new = filename_new.slice (0, -1) + i.to_string();\n                    fo = File.new_for_path (filename_new);\n                }\n\n                FileOutputStream fos;\n                try {\n                    fos = fo.create (FileCreateFlags.PRIVATE);\n                } catch (GLib.Error e) {\n                    warning_msg (_(\"Cannot create temporary file '%s' to apply substitutions: %s\\n\"),\n                                 filename_new, e.message);\n                    try {\n                        fis.close();\n                    } catch (GLib.IOError e) {\n                        warning_msg (_(\"Could not close file descriptor for '%s': %s\\n\"),\n                                     filename, e.message);\n                    }\n                    return;\n                }\n\n                var dis = new DataInputStream (fis);\n                var dos = new DataOutputStream (fos);\n\n                string? line = null;\n                try {\n                    while ((line = dis.read_line()) != null) {\n                        try {\n                            // Apply all accumulated substitutions.\n                            foreach (var sub in sublist) {\n                                if (!sub.line)\n                                    line = line.replace (@\"@$(sub.match)@\", sub.replace);\n                                else if (line.index_of (@\"@$(sub.match)@\") > -1)\n                                    line = sub.replace;\n                            }\n                            dos.put_string (line + \"\\n\");\n                        } catch (GLib.IOError e) {\n                            warning_msg (_(\"Could not write to temporary file '%s': %s\\n\"),\n                                         filename_new, e.message);\n                        }\n                     }\n                } catch (GLib.IOError e) {\n                    warning_msg (_(\"Could not read file '%s' properly: %s\\n\"), filename, e.message);\n                }\n                try {\n                    dos.close();\n                    fo.move (fi, FileCopyFlags.OVERWRITE);  //TODO: Are timestamps an issue?\n                } catch (GLib.IOError e) {\n                    warning_msg (_(\"Could not close file descriptor for '%s': %s\\n\"),\n                                 filename_new, e.message);\n                    return;\n                } catch (GLib.Error e) {\n                    warning_msg (_(\"Could not update file '%s' with '%s' (temporary file may still exist): %s\\n\"),\n                                 filename, filename_new, e.message);\n                }\n            }\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "src/ui/welcome_screen/load_project.vala",
    "content": "/*\n * src/ui/welcome_screen/create_project_location.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n\n// Open existing project (using a file chooser widget)\n\nusing GLib;\nusing Gtk;\nnamespace WelcomeScreen {\n    public class OpenProject : TemplatePageWithHeader {\n\n        public string? project_filename = \"\";\n\n        public OpenProject () {\n            heading = _(\"Open project\");\n            description = _(\"Select Valama project file\");\n        }\n\n        protected override void clean_up() {\n        }\n\n        protected override Gtk.Widget build_inner_widget() {\n            var chooser_open = new FileChooserWidget (FileChooserAction.OPEN);\n            chooser_open.expand = true;\n\n            // Only allow .vlp files\n            var filter_vlp = new FileFilter();\n            filter_vlp.set_filter_name (_(\"Valama project files (*.vlp)\"));\n            filter_vlp.add_pattern (\"*.vlp\");\n            chooser_open.add_filter (filter_vlp);\n            chooser_open.set_filter (filter_vlp);  // set default filter\n\n            chooser_open.selection_changed.connect (() => {\n                project_filename = chooser_open.get_filename();\n                btn_next.sensitive = project_filename != null &&\n                                     File.new_for_path (project_filename).query_file_type (\n                                                    FileQueryInfoFlags.NONE) == FileType.REGULAR;\n            });\n            chooser_open.file_activated.connect (() => {\n                if (btn_next.sensitive) //Only procede if valid file is selected\n                    go_to_next_clicked();\n            });\n            return chooser_open;\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4"
  },
  {
    "path": "src/ui/welcome_screen/main_screen.vala",
    "content": "/*\n * src/ui/welcome_screen/main_screen.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing Gdk;\nusing Gee;\nusing Gtk;\n\nnamespace WelcomeScreen {\n\n    protected class MainScreen : TemplatePage {\n\n        public signal void create_button_clicked ();\n        public signal void open_button_clicked ();\n        public signal void recent_project_selected (string path);\n\n        protected override void clean_up() {\n        }\n\n        protected override void build() {\n\n            // Sort recent projects\n            var recent_items = new TreeSet<RecentInfo> (cmp_recent_info);\n            foreach (var info in recentmgr.get_items())\n                recent_items.add (info);\n\n            var box_main = new Box(Orientation.VERTICAL, 20);\n            box_main.set_size_request (600,400);\n\n            var list = new Gtk.ListBox ();\n            list.row_selected.connect((row)=>{row.activate();}); //TODO: Possibly unnecessary in future GTK versions\n\n            int cnt_added_items = 0;\n            foreach (var info in recent_items) {\n                // Limit number of shown recent projects\n                cnt_added_items ++;\n                if (cnt_added_items > 5)\n                    break;\n\n                // Grid containing all information about one project\n                var grid_project = new Gtk.Grid();\n\n                Label lbl_proj_name = new Label(Markup.escape_text (info.get_display_name()));\n                lbl_proj_name.expand = true;\n                lbl_proj_name.ellipsize = Pango.EllipsizeMode.END;\n                lbl_proj_name.halign = Align.START;\n                grid_project.attach (lbl_proj_name, 0,0,1,1);\n\n                // Get project path, ellipsize home directory\n                Label lbl_proj_path = new Label(null);\n                var uri = info.get_uri_display();\n                var home = Environment.get_home_dir();\n                if (uri.has_prefix (home))\n                    lbl_proj_path.label +=  \"<i>\" + Markup.escape_text (\"~\" + uri[home.length:uri.length]) + \"</i>\";\n                else\n                    lbl_proj_path.label += \"<i>\" + Markup.escape_text (uri) + \"</i>\";\n                lbl_proj_path.use_markup = true;\n                lbl_proj_path.expand = true;\n                lbl_proj_path.ellipsize = Pango.EllipsizeMode.END;\n                lbl_proj_path.halign = Align.START;\n                lbl_proj_path.sensitive = false;\n                grid_project.attach (lbl_proj_path, 0,1,1,1);\n\n                // Show last used date\n                var now = new DateTime.now_local();\n                var modif_time = new DateTime.now_local ().add_days(-info.get_age());\n                var lbl_last_modified = new Label(null);\n                if (modif_time.get_year() == now.get_year())\n                    lbl_last_modified.label = modif_time.format(\"%e. %b\");\n                else\n                    lbl_last_modified.label = modif_time.format(\"%e. %b %Y\");\n                lbl_last_modified.sensitive = false;\n\n                grid_project.attach (lbl_last_modified, 1,0,1,1);\n\n                var row = new ListBoxRow();\n                row.activate.connect (()=>{\n                    recent_project_selected (info.get_uri_display());\n                });\n                row.add (grid_project);\n                standardize_listbox_row (row);\n                list.add (row);\n                list.add (new Separator(Orientation.HORIZONTAL));\n            }\n            var frame = new Frame(null);\n            frame.add (list);\n            box_main.pack_start (frame, false, true);\n            // Other projects button\n            var row = new ListBoxRow();\n            row.activate.connect (()=>{\n                open_button_clicked();\n            });\n            var lbl = new Label(_(\"Other project...\"));\n            lbl.halign = Align.START;\n            row.add (lbl);\n            standardize_listbox_row (row);\n            list.add (row);\n\n\n            // Create project button\n            frame = new Frame(null);\n            list = new Gtk.ListBox ();\n            list.row_selected.connect((row)=>{row.activate();}); //TODO: Possibly unnecessary in future GTK versions\n\n            row = new ListBoxRow();\n            row.activate.connect (()=>{\n                create_button_clicked();\n            });\n            lbl = new Label(_(\"Create project\"));\n            lbl.halign = Align.START;\n            row.add (lbl);\n            standardize_listbox_row (row);\n            list.add (row);\n\n            frame.add(list);\n            box_main.pack_start (frame, false, true);\n\n            widget = box_main;\n        }\n\n        // Compares two recent projects entries\n        private int cmp_recent_info (RecentInfo a, RecentInfo b) {\n            if (a.get_modified() == b.get_modified())\n                return 0;\n            return (a.get_modified() < b.get_modified()) ? 1 : -1;\n        }\n\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4"
  },
  {
    "path": "src/ui/welcome_screen.vala",
    "content": "/*\n * src/welcome_screen.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\nusing Gdk;\nusing Gee;\n\nnamespace WelcomeScreen {\n\n    // Templates for building pages. Pages are created and destroyed on the fly\n\n    protected abstract class TemplatePage : Object {\n        public Widget? widget = null;\n\n        public abstract void build();\n        public abstract void clean_up();\n    }\n    // Includes header with prev / next buttons\n    protected abstract class TemplatePageWithHeader : TemplatePage {\n\n        public signal void go_to_prev_clicked();\n        public signal void go_to_next_clicked();\n\n        protected string heading = \"\";\n        protected string description = \"\";\n\n        protected ToolButton btn_next;\n        protected ToolButton btn_prev;\n\n        public override void build () {\n\n            var box = new Gtk.Box (Orientation.VERTICAL, 0);\n            var toolbar = new Toolbar();\n            btn_prev = new ToolButton (new Image.from_icon_name (\"go-previous-symbolic\",\n                                                                 IconSize.BUTTON),\n                                                                 _(\"Back\"));\n            btn_prev.clicked.connect(()=>{go_to_prev_clicked();});\n            btn_next = new ToolButton (new Image.from_icon_name (\"go-next-symbolic\",\n                                                                 IconSize.BUTTON),\n                                                                 _(\"Next\"));\n            btn_next.clicked.connect(()=>{go_to_next_clicked();});\n\n            var lbl_heading_item = new ToolItem();\n            var lbl_heading = new Label (null);\n            lbl_heading.use_markup = true;\n            lbl_heading.justify = Justification.CENTER;\n            lbl_heading_item.set_expand (true);\n            lbl_heading_item.add (lbl_heading);\n\n            toolbar.add (btn_prev);\n            toolbar.add (lbl_heading_item);\n            toolbar.add (btn_next);\n            box.pack_start (toolbar, false, true);\n\n            box.pack_start (build_inner_widget(), true, true);\n\n            // Set text after build_inner_widget call, so it can be specified there\n            lbl_heading.label = \"<b>\" + Markup.escape_text (heading) + \"</b>\\n\" + Markup.escape_text (description);\n\n            box.set_size_request (600, 400);\n            widget = box;\n        }\n\n        // Build the actual content (below the header)\n        protected abstract Gtk.Widget build_inner_widget();\n\n    }\n\n    /*\n     * The actual welcome screen widget, handles showing and linking pages pages.\n     * It also, creates the ValamaProject to be passed to main\n     */\n\n    public class WelcomeScreen : Alignment{\n        public WelcomeScreen() {\n            // Center me\n            this.xalign = 0.5f;\n            this.yalign = 0.5f;\n            this.xscale = 0.0f;\n            this.yscale = 0.0f;\n\n            this.add(box_main);\n            this.show_all();\n            show_main_screen();\n        }\n        // Put pages in a separate container to allow different background color\n        //Gtk.Box box_main = new Gtk.Box(Orientation.VERTICAL, 0);\n        Gtk.EventBox box_main = new Gtk.EventBox();\n\n        // Methods showing the pages and linking them\n        ProjectCreationInfo info;\n        private void show_main_screen() {\n            var msc = new MainScreen();\n            msc.create_button_clicked.connect (()=>{\n                show_create_project_template();\n            });\n            msc.recent_project_selected.connect((project_path)=>{\n                try {\n                project_loaded (new ValamaProject (project_path, Args.syntaxfile));\n                } catch {}\n            });\n            msc.open_button_clicked.connect(()=>{\n                show_open_project();\n            });\n            switch_to_page(msc);\n        }\n        private void show_create_project_location() {\n            var page = new CreateProjectLocation(ref info);\n            page.go_to_prev_clicked.connect(()=>{show_create_project_template();});\n            page.go_to_next_clicked.connect(()=>{show_create_project_packages();});\n            switch_to_page(page);\n        }\n        private void show_create_project_template() {\n            info = new ProjectCreationInfo();\n            var page = new CreateProjectTemplate(ref info);\n            page.go_to_prev_clicked.connect(show_main_screen);\n            page.go_to_next_clicked.connect(()=>{show_create_project_location();});\n            switch_to_page(page);\n        }\n        private void show_create_project_packages() {\n        var page = new CreateProjectPackages(ref info);\n        page.go_to_prev_clicked.connect(()=>{ show_create_project_location(); });\n            page.go_to_next_clicked.connect(()=>{ show_create_project_buildsystem(); });\n            switch_to_page(page);\n    }\n        private void show_create_project_buildsystem() {\n            var page = new CreateProjectBuildsystem(ref info);\n            page.go_to_prev_clicked.connect(()=>{show_create_project_packages();});\n            page.go_to_next_clicked.connect(()=>{project_loaded (create_project_from_template (info));});\n            switch_to_page(page);\n        }\n        private void show_open_project() {\n            var page = new OpenProject();\n            page.go_to_prev_clicked.connect(()=>{show_main_screen();});\n            page.go_to_next_clicked.connect(()=>{\n                try {\n                project_loaded (new ValamaProject (page.project_filename, Args.syntaxfile));\n                } catch {}\n            });\n            switch_to_page(page);\n        }\n\n        //project_loaded (create_project_from_template (info));\n        // Abstracts replacing pages\n        private TemplatePage? current_page = null;\n        private void switch_to_page (TemplatePage new_page) {\n            if (current_page != null) {\n                current_page.clean_up();\n                box_main.remove (current_page.widget);\n            }\n            current_page = new_page;\n            current_page.build();\n            box_main.add (current_page.widget);\n            current_page.widget.show_all();\n        }\n\n        public signal void project_loaded (ValamaProject? project);\n\n    }\n\n}\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "src/ui/widgets/browser_path.vala",
    "content": "using Gtk;\n\npublic class BrowserPath {\n    TreePath path;\n    \n    public BrowserPath (TreePath path) {\n        this.path = path;\n    }\n    \n    public string to_string() {\n        return path.to_string();\n    }\n    \n    public int get (int index) {\n        return path.get_indices()[index];\n    }\n    \n    public BrowserPathType path_type {\n        get {\n            if (this[0] == 0 && this[1] == 0)\n                return BrowserPathType.SOURCE;\n            if (this[0] == 0 && this[1] == 1)\n                return BrowserPathType.PACKAGE;\n            if (this[0] == 1)\n                return BrowserPathType.UI;\n            if (this[0] == 2)\n                return BrowserPathType.BUILDSYSTEM;\n            if (this[0] == 2)\n                return BrowserPathType.DATA;\n            return BrowserPathType.NONE;\n        }\n    }\n    \n    public int size {\n        get {\n            return path.get_depth();\n        }\n    }\n}\n\npublic enum BrowserPathType {\n    NONE, SOURCE, PACKAGE, UI, BUILDSYSTEM, DATA\n}\n"
  },
  {
    "path": "src/ui_main.vala",
    "content": "/*\n * src/ui_main.vala\n * Copyright (C) 2012, 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\nusing Gtk;\nusing Gdl;\nusing Gee;\nusing Xml;\n\nstatic ValamaProject project;\nstatic Guanako.FrankenStein frankenstein;\n\nstatic bool parsing = false;\n\n//TODO: Use plugins.\nstatic ProjectBrowser wdg_pbrw;\nstatic UiReport wdg_report;\nstatic ProjectBuilder project_builder;\nstatic UiSourceViewer source_viewer;\nstatic BuildOutput wdg_build_output;\nstatic AppOutput wdg_app_output;\nstatic UiCurrentFileStructure wdg_current_file_structure;\nstatic UiBreakpoints wdg_breakpoints;\nstatic UiSearch wdg_search;\nstatic SymbolBrowser wdg_smb_browser;\nstatic UiStructureView wdg_structure_view;\nstatic GladeViewer wdg_glade_viewer;\nstatic UiValadocBrowser wdg_valadoc_browser;\n// static UiStyleChecker wdg_stylechecker;\n\nstatic Gee.HashMap<string, Gdk.Pixbuf> map_icons;\n\n\n/**\n * Main window class. Setup {@link Gdl.Dock} and {@link Gdl.DockBar} stuff.\n */\npublic class MainWidget : Box {\n    /**\n     * Master dock for all items except {@link toolbar} and {@link menu}.\n     */\n    private Dock dock;\n    /**\n     * Layout of master dock {@link dock}.\n     */\n    private DockLayout layout;\n    /**\n     * View settings menu.\n     */\n    private Gtk.Menu viewmenu;\n    /**\n     * Settings menu.\n     */\n    private Gtk.Menu menu;\n    /**\n     * View settings menu button.\n     */\n    public MenuButton views { get; private set; }\n    /**\n     * Settings menu button.\n     */\n    public MenuButton settings { get; private set; }\n    /**\n     * Toolbar. Fill with {@link add_button}.\n     */\n    private Toolbar toolbar_left;\n    /**\n     * Toolbar. Fill with {@link add_button}.\n     */\n    private Toolbar toolbar_right;\n    /**\n     * Toolbar container on left side of window title.\n     */\n    public Box tbox_left { get; private set; }\n    /**\n     * Toolbar container on right side of window title.\n     */\n    public Box tbox_right { get; private set; }\n\n    private ToggleButton fullsc_tbut;\n\n    /**\n     * Global shortcut object.\n     */\n    public AccelGroup accel_group;\n\n    /**\n     * Emit when widget can be closed.\n     */\n    public signal void request_close();\n\n    /**\n     * Internal state of items if {@link Gdl.DockItemGrip} is to be shown.\n     */\n    private bool locked = false;\n    /**\n     * Emit to hide dock item grip (if not disabled).\n     */\n    public virtual signal void lock_items() {\n        locked = true;\n    }\n    /**\n     * Emit to show dock item grip.\n     */\n    public virtual signal void unlock_items() {\n        locked = false;\n    }\n\n    /**\n     * Emit when all {@link UiElement}s, menu objects and tool objects are\n     * initialized.\n     */\n    public signal void initialized();\n\n    /**\n     * Create MainWindow. Initialize {@link menu}, toolbars, master dock and\n     * source dock.\n     */\n    public MainWidget() {\n        accel_group = new AccelGroup();\n\n        this.orientation = Orientation.VERTICAL;\n        this.spacing = 0;\n\n        /* Menus. */\n        this.menu = new Gtk.Menu();\n        this.viewmenu = new Gtk.Menu();\n\n        /* Setting buttons. */\n        this.views = new MenuButton();\n        this.views.set_tooltip_text (_(\"Views\"));\n        this.views.popup = this.viewmenu;\n        this.views.show_all();\n        this.settings = new MenuButton();\n        this.settings.image = new Image.from_icon_name (\"emblem-system-symbolic\", IconSize.BUTTON);\n        this.settings.set_tooltip_text (_(\"Settings\"));\n        this.settings.popup = this.menu;\n        this.settings.show_all();\n\n        /* Toolbars. */\n        this.toolbar_left = new Toolbar();\n        var toolbar_left_scon = toolbar_left.get_style_context();\n        toolbar_left_scon.add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n        this.toolbar_right = new Toolbar();\n        var toolbar_right_scon = toolbar_right.get_style_context();\n        toolbar_right_scon.add_class (STYLE_CLASS_PRIMARY_TOOLBAR);\n\n        /* Toolbar containers */\n        this.tbox_left = new Box (Orientation.HORIZONTAL, 0);\n        this.tbox_left.pack_start (this.toolbar_left);\n        this.tbox_left.show_all();\n        this.tbox_right = new Box (Orientation.HORIZONTAL, 0);\n        this.tbox_right.pack_start (this.toolbar_right);\n        this.tbox_right.show_all();\n\n        /* Gdl dock stuff. */\n        this.dock = new Dock();\n        this.layout = new DockLayout (this.dock);\n\n        var dockbar = new DockBar (this.dock);\n        dockbar.set_style (DockBarStyle.TEXT);\n\n        var box = new Box (Orientation.HORIZONTAL, 5);\n        box.pack_start (dockbar, false, false, 0);\n        box.pack_end (dock, true, true, 0);\n        this.pack_start (box, true, true, 0);\n        box.show_all();\n    }\n\n    /**\n     * Initialize ui_elements, menu and toolbars.\n     */\n    public void init() {\n        source_viewer = new UiSourceViewer();\n        source_viewer.add_srcitem (project.open_new_buffer (\"\", \"\", true));\n\n        wdg_pbrw = new ProjectBrowser (project);\n        wdg_pbrw.file_selected.connect ((filename) => {\n            on_file_selected(filename);\n        });\n\n\n        project.guanako_project.set_reporter (typeof (ReportWrapper));\n\n        frankenstein = new Guanako.FrankenStein();\n\n        wdg_report = new UiReport();\n        wdg_smb_browser = new SymbolBrowser();\n        project_builder = new ProjectBuilder();\n        wdg_breakpoints = new UiBreakpoints (frankenstein);\n        wdg_build_output = new BuildOutput();\n        wdg_app_output = new AppOutput();\n        wdg_current_file_structure = new UiCurrentFileStructure();\n        wdg_search = new UiSearch();\n        wdg_structure_view = new UiStructureView();\n        wdg_glade_viewer = new GladeViewer();\n        wdg_valadoc_browser = new UiValadocBrowser();\n        // wdg_stylechecker = new UiStyleChecker();\n\n        /* Gdl elements. */\n        add_item (\"SourceView\", _(\"Source view\"), source_viewer,\n                              null,\n                              DockItemBehavior.NO_GRIP | DockItemBehavior.CANT_DOCK_CENTER,\n                              DockPlacement.TOP);\n        add_item (\"ReportWrapper\", _(\"Report widget\"), wdg_report,\n                              \"gtk-info\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.BOTTOM);\n        add_item (\"ProjectBrowser\", _(\"Project browser\"), wdg_pbrw,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.LEFT);\n        add_item (\"BuildOutput\", _(\"Build output\"), wdg_build_output,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.LEFT);\n        add_item (\"AppOutput\", _(\"Application output\"), wdg_app_output,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.LEFT);\n        add_item (\"Search\", _(\"Search\"), wdg_search,\n                              \"gtk-find\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.LEFT);\n        add_item (\"Breakpoints\", _(\"Breakpoints / Timers\"), wdg_breakpoints,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.LEFT);\n        add_item (\"CurrentFileStructure\", _(\"Current file\"), wdg_current_file_structure,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.LEFT);\n        // add_item (\"StyleChecker\", _(\"Coding style checker\"), wdg_stylechecker,\n        //                       \"gtk-color-picker\",\n        //                       DockItemBehavior.NORMAL,\n        //                       DockPlacement.LEFT);\n        add_item (\"SymbolBrowser\", _(\"Symbol browser\"), wdg_smb_browser,\n                              \"gtk-convert\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.RIGHT);\n        add_item (\"StructureView\", _(\"Structure view\"), wdg_structure_view,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.RIGHT);\n        add_item (\"GladeViewer\", _(\"Glade viewer\"), wdg_glade_viewer,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.RIGHT);\n        add_item (\"ValadocBrowser\", _(\"Valadoc browser\"), wdg_valadoc_browser,\n                              \"gtk-file\",\n                              DockItemBehavior.NORMAL,\n                              DockPlacement.RIGHT);\n\n        /* Keep this before layout loading. */\n        dock.show_all();\n\n        /* Load default layout. Either local one or system wide. */\n        var err = false;\n        string local_layout_filename;\n        var cachedir = Path.build_path (Path.DIR_SEPARATOR_S,\n                                        Environment.get_user_cache_dir(),\n                                        \"valama\");\n        if (Args.layoutfile == null)\n            local_layout_filename = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                     cachedir,\n                                                     \"layout.xml\");\n        else {\n            local_layout_filename = Args.layoutfile;\n            err = true;\n        }\n        var system_layout_filename = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                      Config.PACKAGE_DATA_DIR,\n                                                      \"layout.xml\");\n        if (Args.reset_layout || (!load_layout (this.layout,\n                                                local_layout_filename,\n                                                null,\n                                                err) && Args.layoutfile == null))\n            load_layout (this.layout, system_layout_filename);\n\n        try {\n            load_meta (Path.build_path (Path.DIR_SEPARATOR_S,\n                                        cachedir,\n                                        \"ui_meta.xml\"));\n        } catch (LoadingError e) {\n            warning_msg (_(\"Could not load meta information: %s\\n\"), e.message);\n        }\n\n        /* Keep this after layout loading. */\n        build_menu();\n        build_toolbars();\n\n        if (locked)\n            lock_items();\n\n        show();\n        initialized();\n    }\n\n    /**\n     * Save gdl layout.\n     */\n    public bool close() {\n        project_builder.quit();\n\n        var cachedir = Path.build_path (Path.DIR_SEPARATOR_S,\n                                        Environment.get_user_cache_dir(),\n                                        \"valama\");\n        /* Meta info. */\n        save_meta (Path.build_path (Path.DIR_SEPARATOR_S,\n                                    cachedir,\n                                    \"ui_meta.xml\"));\n\n        /* Gdl main layout. */\n        var local_layout_filename = Path.build_path (Path.DIR_SEPARATOR_S,\n                                                     cachedir,\n                                                     \"layout.xml\");\n        var f = File.new_for_path (local_layout_filename).get_parent();\n        if (!f.query_exists())\n            try {\n                f.make_directory_with_parents();\n            } catch (GLib.Error e) {\n                errmsg (_(\"Could not create cache directory: %s\\n\"), e.message);\n            }\n        save_layout (this.layout, local_layout_filename);\n        return true;\n    }\n\n    /**\n     * Build up menu.\n     */\n    private void build_menu() {\n        /* File */\n        var item_file_new = new ImageMenuItem.with_mnemonic (_(\"_New\"));\n        var image_file_new = new Image();\n        image_file_new.icon_name = \"document-new\";\n        item_file_new.image = image_file_new;\n        this.menu.append (item_file_new);\n        item_file_new.activate.connect (create_new_file);\n        add_accel_activate (item_file_new, Gdk.Key.n);\n\n        var item_file_save = new ImageMenuItem.with_mnemonic (_(\"_Save all\"));\n        var image_file_save = new Image();\n        image_file_save.icon_name = \"document-save\";\n        item_file_save.image = image_file_save;\n        this.menu.append (item_file_save);\n        item_file_save.activate.connect (() => {\n            project.buffer_save();\n        });\n        project.buffer_changed.connect (item_file_save.set_sensitive);\n        add_accel_activate (item_file_save, Gdk.Key.s);\n\n        this.menu.append (new SeparatorMenuItem());\n\n        /* Edit */\n        var item_edit_undo = new ImageMenuItem.with_mnemonic (_(\"_Undo\"));\n        var image_edit_undo = new Image();\n        image_edit_undo.icon_name = \"edit-undo\";\n        item_edit_undo.image = image_edit_undo;\n        item_edit_undo.set_sensitive (false);\n        this.menu.append (item_edit_undo);\n        item_edit_undo.activate.connect (undo_change);\n        project.undo_changed.connect (item_edit_undo.set_sensitive);\n        add_accel_activate (item_edit_undo, Gdk.Key.u);\n\n        var item_edit_redo = new ImageMenuItem.with_mnemonic (_(\"_Redo\"));\n        var image_edit_redo = new Image();\n        image_edit_redo.icon_name = \"edit-redo\";\n        item_edit_redo.image = image_edit_redo;\n        item_edit_redo.set_sensitive (false);\n        this.menu.append (item_edit_redo);\n        item_edit_redo.activate.connect (redo_change);\n        project.redo_changed.connect (item_edit_redo.set_sensitive);\n        add_accel_activate (item_edit_redo, Gdk.Key.r);\n\n        var item_edit_search = new ImageMenuItem.with_mnemonic (_(\"_Search\"));\n        var image_edit_search = new Image();\n        image_edit_search.icon_name = \"edit-search\";\n        item_edit_search.image = image_edit_search;\n        item_edit_search.set_sensitive (true);\n        this.menu.append (item_edit_search);\n        item_edit_search.activate.connect (wdg_search.search_for_current_selection);\n        add_accel_activate (item_edit_search, Gdk.Key.f);\n\n        this.menu.append (new SeparatorMenuItem());\n\n        /* View */\n        add_view_menu_item (wdg_search, _(\"Show search\"));\n        add_view_menu_item (wdg_report, _(\"Show reports\"));\n        add_view_menu_item (wdg_pbrw, _(\"Show project browser\"));\n        add_view_menu_item (wdg_build_output, _(\"Show build output\"));\n        add_view_menu_item (wdg_app_output, _(\"Show application output\"));\n        add_view_menu_item (wdg_breakpoints, _(\"Show breakpoints\"));\n        add_view_menu_item (wdg_current_file_structure, _(\"Show current file structure\"));\n        // add_view_menu_item (wdg_stylechecker, _(\"Show style checker\"));\n        add_view_menu_item (wdg_smb_browser, _(\"Show symbol browser\"));\n        add_view_menu_item (wdg_glade_viewer, _(\"Show glade viewer\"));\n        add_view_menu_item (wdg_structure_view, _(\"Show structure viewer\"));\n        add_view_menu_item (wdg_valadoc_browser, _(\"Show Valadoc browser\"));\n        this.viewmenu.append (new SeparatorMenuItem());\n\n        // TRANSLATORS: Lock user interface elements to prevent moving them around.\n        var item_view_lockhide = new CheckMenuItem.with_mnemonic (_(\"_Lock elements\"));\n        this.viewmenu.append (item_view_lockhide);\n        item_view_lockhide.toggled.connect (() => {\n            if (item_view_lockhide.active)\n                lock_items();\n            else\n                unlock_items();\n        });\n        this.lock_items.connect (() => {\n            item_view_lockhide.active = true;\n        });\n        this.unlock_items.connect (() => {\n            item_view_lockhide.active = false;\n        });\n        add_accel_activate (item_view_lockhide, Gdk.Key.h);\n\n        var item_view_fullscreen = new CheckMenuItem.with_mnemonic (_(\"_Fullscreen\"));\n        this.viewmenu.append (item_view_fullscreen);\n        item_view_fullscreen.toggled.connect (() => {\n            if (item_view_fullscreen.active) {\n                if (!fullsc_tbut.active)\n                    fullsc_tbut.active = true;\n            } else {\n                if (fullsc_tbut.active)\n                    fullsc_tbut.active = false;\n            }\n        });\n        /**\n         * FIXME: Use hidden button to get out of fullscreen mode via\n         *        keybinding. Menu item doesn't work when header bar is\n         *        hidden.\n         */\n        fullsc_tbut = new ToggleButton();\n        fullsc_tbut.toggled.connect (() => {\n            if (fullsc_tbut.active) {\n                if (!item_view_fullscreen.active)\n                    item_view_fullscreen.active = true;\n                window_main.fullscreen();\n            } else {\n                if (item_view_fullscreen.active)\n                    item_view_fullscreen.active = false;\n                window_main.unfullscreen();\n            }\n        });\n        this.add (fullsc_tbut);\n        fullsc_tbut.show_all();\n        add_accel_activate (fullsc_tbut, Gdk.Key.F11, 0);\n\n        /* Project */\n        var item_project_settings = new ImageMenuItem.with_mnemonic (_(\"Project _settings\"));\n        var image_project_settings = new Image();\n        image_project_settings.icon_name = \"preferences-system\";\n        item_project_settings.image = image_project_settings;\n        this.menu.append (item_project_settings);\n        item_project_settings.activate.connect (() => {\n            ui_project_dialog (project);\n        });\n\n        this.menu.append (new SeparatorMenuItem());\n\n        /* Build */\n        var item_build = new Gtk.MenuItem.with_mnemonic (_(\"_Build\"));\n        this.menu.add (item_build);\n        item_build.set_submenu (build_build_menu());\n\n        this.menu.append (new SeparatorMenuItem());\n\n        /* Run */\n        var item_run_run = new ImageMenuItem.with_mnemonic (_(\"_Execute\"));\n        var image_run_run = new Image();\n        image_run_run.icon_name = \"media-playback-start\";\n        item_run_run.image = image_run_run;\n        add_accel_activate (item_run_run, Gdk.Key.F5, 0);\n        this.menu.append (item_run_run);\n        item_run_run.activate.connect (() => {\n            project_builder.launch();\n        });\n\n        var item_run_stop = new ImageMenuItem.with_mnemonic (_(\"_Stop\"));\n        var image_run_stop = new Image();\n        image_run_stop.icon_name = \"media-playback-stop\";\n        item_run_stop.image = image_run_stop;\n        item_run_stop.sensitive = false;\n        add_accel_activate (item_run_run, Gdk.Key.F5, Gdk.ModifierType.SHIFT_MASK);\n        this.menu.append (item_run_stop);\n        item_run_stop.activate.connect (() => {\n            project_builder.quit();\n        });\n        project_builder.notify[\"app-running\"].connect (() => {\n            if (project_builder.app_running) {\n                item_run_run.sensitive = false;\n                item_run_stop.sensitive = true;\n            } else {\n                item_run_run.sensitive = true;\n                item_run_stop.sensitive = false;\n            }\n        });\n\n        this.menu.append (new SeparatorMenuItem());\n\n        /* Help */\n        var item_help_about = new ImageMenuItem.with_mnemonic (_(\"_About\"));\n        var image_help_about = new Image();\n        image_help_about.icon_name = \"help-about\";\n        item_help_about.image = image_help_about;\n        this.menu.append (item_help_about);\n        item_help_about.activate.connect (ui_about_dialog);\n\n        /* Quit */\n        var item_file_quit = new ImageMenuItem.with_mnemonic (_(\"_Quit\"));\n        var image_file_quit = new Image();\n        image_file_quit.icon_name = \"application-exit\";\n        item_file_quit.image = image_file_quit;\n        this.menu.append (item_file_quit);\n        item_file_quit.activate.connect (() => {\n            quit_valama();\n        });\n        add_accel_activate (item_file_quit, Gdk.Key.q);\n\n        this.viewmenu.show_all();\n        this.menu.show_all();\n    }\n\n    private Gtk.Menu build_build_menu () {\n        var menu_build = new Gtk.Menu();\n\n        var item_build_build = new ImageMenuItem.with_mnemonic (_(\"_Build\"));\n        var image_build_build = new Image();\n        image_build_build.icon_name = \"system-run\";\n        item_build_build.image = image_build_build;\n        add_accel_activate (item_build_build, Gdk.Key.F7, 0);\n        menu_build.append (item_build_build);\n        item_build_build.activate.connect (() => {\n            project_builder.build_project();\n        });\n\n        var item_build_rebuild = new ImageMenuItem.with_label (_(\"Rebuild\"));\n        menu_build.append (item_build_rebuild);\n        item_build_rebuild.activate.connect (() => {\n            project_builder.build_project (true);\n        });\n\n        var item_build_cleanbuild = new ImageMenuItem.with_label (_(\"Clean build\"));\n        menu_build.append (item_build_cleanbuild);\n        item_build_cleanbuild.activate.connect (() => {\n            project_builder.build_project (false, false, true);\n        });\n\n        var item_build_clean = new ImageMenuItem.with_mnemonic (_(\"_Clean\"));\n        var image_build_clean = new Image();\n        image_build_clean.icon_name = \"edit-clear\";\n        item_build_clean.image = image_build_clean;\n        menu_build.append (item_build_clean);\n        item_build_clean.activate.connect (() => {\n            project_builder.clean_project();\n        });\n\n        var item_build_distclean = new ImageMenuItem.with_label (_(\"Clean all\"));\n        menu_build.append (item_build_distclean);\n        item_build_distclean.activate.connect (() => {\n            project_builder.distclean_project();\n        });\n        menu_build.show_all();\n        return menu_build;\n    }\n\n    /**\n     * Build up toolbars.\n     */\n    private void build_toolbars() {\n        var btnReturn = new ToolButton (new Image.from_icon_name (\"go-previous-symbolic\", IconSize.BUTTON), _(\"Back\"));\n        toolbar_left.add (btnReturn);\n        btnReturn.set_tooltip_text (_(\"Close project\"));\n        btnReturn.clicked.connect (() => {\n            if (project.close())\n                request_close();\n        });\n\n        toolbar_left.add (new SeparatorToolItem());\n\n        var btnNewFile = new ToolButton (null, _(\"New\"));\n        btnNewFile.icon_name = \"document-new\";\n        toolbar_left.add (btnNewFile);\n        btnNewFile.set_tooltip_text (_(\"Create new file\"));\n        btnNewFile.clicked.connect (create_new_file);\n\n        var btnSave = new ToolButton (null, _(\"Save\"));\n        btnSave.icon_name = \"document-save\";\n        toolbar_left.add (btnSave);\n        btnSave.set_tooltip_text (_(\"Save current file\"));\n        btnSave.clicked.connect (() => {\n            project.buffer_save();\n        });\n        project.buffer_changed.connect (btnSave.set_sensitive);\n\n        toolbar_left.add (new SeparatorToolItem());\n\n        var btnUndo = new ToolButton (null, _(\"Undo\"));\n        btnUndo.icon_name = \"edit-undo\";\n        btnUndo.set_sensitive (false);\n        toolbar_left.add (btnUndo);\n        btnUndo.set_tooltip_text (_(\"Undo last change\"));\n        btnUndo.clicked.connect (undo_change);\n        project.undo_changed.connect (btnUndo.set_sensitive);\n\n        var btnRedo = new ToolButton (null, _(\"Redo\"));\n        btnRedo.icon_name = \"edit-redo\";\n        btnRedo.set_sensitive (false);\n        toolbar_left.add (btnRedo);\n        btnRedo.set_tooltip_text (_(\"Redo last change\"));\n        btnRedo.clicked.connect (redo_change);\n        project.redo_changed.connect (btnRedo.set_sensitive);\n\n        toolbar_left.add (new SeparatorToolItem());\n\n        var target_selector = new ComboBoxText();\n        target_selector.set_tooltip_text (_(\"IDE mode\"));\n        var ti = new ToolItem();\n        ti.add (target_selector);\n        foreach (var mode in IdeModes.values())\n            target_selector.append_text (mode.to_string());\n        target_selector.changed.connect (() => {\n            project.idemode = IdeModes.int_to_mode (target_selector.active);\n        });\n        /* Make sure the idemode signal will be emitted. */\n        target_selector.active = IdeModes.to_int (project.idemode);\n        toolbar_left.add (ti);\n\n        var btnBuild = new Gtk.MenuToolButton (null, _(\"Build\"));\n        btnBuild.icon_name = \"system-run\";\n        btnBuild.set_menu (build_build_menu());\n        toolbar_left.add (btnBuild);\n        btnBuild.set_tooltip_text (_(\"Save current file and build project\"));\n        btnBuild.clicked.connect (() => {\n            project_builder.build_project();\n        });\n\n        var btnRun = new Gtk.ToolButton (null, _(\"Execute\"));\n        btnRun.icon_name = \"media-playback-start\";\n        toolbar_left.add (btnRun);\n        btnRun.set_tooltip_text (_(\"Run application\"));\n        btnRun.clicked.connect (() => {\n            if (project_builder.app_running)\n                project_builder.quit();\n            else\n                project_builder.launch();\n        });\n        project_builder.notify[\"app-running\"].connect (() => {\n            btnRun.icon_name = (project_builder.app_running) ? \"media-playback-stop\"\n                                                             : \"media-playback-start\";\n        });\n\n        add_view_toolbar_item (toolbar_right, wdg_search, \"edit-find-symbolic\");\n\n        var btn_lock = new ToggleToolButton();\n        btn_lock.icon_name = \"changes-prevent-symbolic\";\n        btn_lock.toggled.connect (() => {\n            if (btn_lock.active)\n                lock_items();\n            else\n                unlock_items();\n        });\n        this.lock_items.connect (() => {\n            btn_lock.active = true;\n        });\n        this.unlock_items.connect (() => {\n            btn_lock.active = false;\n        });\n        toolbar_right.add (btn_lock);\n\n        toolbar_left.show_all();\n        toolbar_right.show_all();\n    }\n\n    /**\n     * Add new item to master dock {@link dock}.\n     *\n     * @param item_name Unique name of new {@link Gdl.DockItem}.\n     * @param item_long_name Display name of new {@link Gdl.DockItem}.\n     * @param element {@link UiElement} to add {@link UiElement.widget} to\n     *                new {@link Gdl.DockItem}.\n     * @param stock {@link Gtk.Stock} name to add icon to {@link Gdl.DockItem}.\n     * @param behavior {@link Gdl.DockItemBehavior} of new {@link Gdl.DockItem}.\n     * @param placement {@link Gdl.DockPlacement} of new {@link Gdl.DockItem}.\n     */\n    public void add_item (string item_name, string item_long_name,\n                          UiElement element,\n                          string? stock = null,\n                          DockItemBehavior behavior = DockItemBehavior.NORMAL,\n                          DockPlacement placement = DockPlacement.LEFT) {\n        DockItem item;\n        if (stock ==  null)\n            item = new DockItem (item_name, item_long_name, behavior);\n        else\n            item = new DockItem.with_stock (item_name, item_long_name, stock, behavior);\n        item.add (element.widget);\n        element.dock_item = item;\n        this.dock.add_item (item, placement);\n        item.show();\n    }\n\n    /**\n     * Add {@link UiElement} toggle item to menu.\n     *\n     * @param element {@link UiElement} to connect toggle signals with.\n     * @param label Description to show in menu.\n     * @param with_mnemonic If `true` enable mnemonic.\n     * @param key Accelerator {@link Gdk.Key} or null if none.\n     * @param modtype Modifier type e.g. {@link Gdk.ModifierType.CONTROL_MASK} for ctrl.\n     */\n    public void add_view_menu_item (UiElement element,\n                                    string label,\n                                    bool with_mnemonic = false,\n                                    int? key = null,\n                                    Gdk.ModifierType modtype = Gdk.ModifierType.CONTROL_MASK) {\n        CheckMenuItem item_view_element;\n        if (with_mnemonic)\n            item_view_element = new CheckMenuItem.with_mnemonic (@\"_$label\");\n        else\n            item_view_element = new CheckMenuItem.with_label (label);\n        item_view_element.active = !element.dock_item.is_closed();\n        this.viewmenu.append (item_view_element);\n\n        item_view_element.toggled.connect (() => {\n            element.show_element (item_view_element.active);\n        });\n        element.show_element.connect ((show) => {\n            if (show != item_view_element.active)\n                item_view_element.active = show;\n        });\n\n        if (key != null)\n            add_accel_activate (item_view_element, key, modtype, \"activate\");\n    }\n\n    /**\n     * Add {@link UiElement} toggle item to toolbar.\n     *\n     * @param toolbar Toolbar to add button.\n     * @param element {@link UiElement} to connect toggle signals with.\n     * @param icon_name Icon from theme.\n     */\n    public void add_view_toolbar_item (Toolbar toolbar,\n                                       UiElement element,\n                                       string icon_name) {\n        var btn_element = new ToggleToolButton();\n        btn_element.icon_name = icon_name;\n        toolbar.add (btn_element);\n\n        btn_element.active = !element.dock_item.is_closed();\n        btn_element.toggled.connect (() => {\n            element.show_element (btn_element.active);\n        });\n        element.show_element.connect ((show) => {\n            if (show != btn_element.active)\n                btn_element.active = show;\n        });\n    }\n\n    //TODO; Move this to layout file.\n    /**\n     * Save user interface meta information.\n     *\n     * @param path File path to save to.\n     */\n    private void save_meta (string path) {\n        debug_msg (_(\"Save Ui meta information: %s\\n\"), path);\n        var writer = new TextWriter.filename (path);\n        writer.set_indent (true);\n        writer.set_indent_string (\"    \");\n\n        //TODO: Meta file version.\n        writer.start_element (\"ui-meta\");\n        //writer.write_attribute (\"version\", xXx);\n        writer.write_element (\"locked\", (locked) ? \"true\" : \"false\");\n        writer.end_element();\n    }\n\n    /**\n     * Load meta information.\n     *\n     * @param path File path to load from.\n     */\n    private void load_meta (string path) throws LoadingError {\n        debug_msg (_(\"Load Ui meta information: %s\\n\"), path);\n\n        Xml.Doc* doc = Xml.Parser.parse_file (path);\n\n        if (doc == null) {\n            delete doc;\n            throw new LoadingError.FILE_IS_GARBAGE (_(\"Cannot parse file.\"));\n        }\n\n        Xml.Node* root_node = doc->get_root_element();\n        if (root_node == null || root_node->name != \"ui-meta\") {\n            delete doc;\n            throw new LoadingError.FILE_IS_EMPTY (_(\"File does not contain enough information.\"));\n        }\n\n        // if (root_node->has_prop (\"version\") != null)\n        //     xXx = root_node->get_prop (\"version\");\n        // if (comp_version (xXx, xXx_VERSION_MIN) < 0) {\n        //     var errstr = _(\"Project file too old: %s < %s\").printf (xXx,\n        //                                                             xXx_VERSION_MIN);\n        //     if (!Args.forceold) {\n        //         throw new LoadingError.FILE_IS_OLD (errstr);\n        //         delete doc;\n        //     } else\n        //         warning_msg (_(\"Ignore project file loading error: %s\\n\"), errstr);\n        // }\n\n        for (Xml.Node* i = root_node->children; i != null; i = i->next) {\n            if (i->type != ElementType.ELEMENT_NODE)\n                continue;\n            switch (i->name) {\n                case \"locked\":\n                    switch (i->get_content()) {\n                        case \"true\":\n                            locked = true;\n                            break;\n                        case \"false\":\n                            locked = false;\n                            break;\n                        default:\n                            warning_msg (_(\"Unknown attribute for '%s' line %hu: %s\\n\"),\n                                         \"locked\", i->line, i->get_content());\n                            break;\n                    }\n                    break;\n                default:\n                    warning_msg (_(\"Unknown configuration file value line %hu: %s\\n\"),\n                                 i->line, i->name);\n                    break;\n            }\n        }\n    }\n\n    /**\n     * Focus a {@link Gdl.DockItem}.\n     *\n     * @param item The item to receive focus.\n     */\n    public void focus_dock_item (DockItem item) {\n        // TRANSLATORS:\n        // Focus docking widget (Gdl.DockItem): long name / file name (short name)\n        debug_msg (_(\"Focus dock item: %s (%s)\\n\"), item.long_name, item.name);\n        /* Hack around gdl_dock_notebook with gtk_notebook. */\n        var pa = item.parent;\n        /* If something strange happens (pa == null) break the loop. */\n        while (!(pa is Dock) && (pa != null)) {\n            if (pa is Notebook) {\n                var nbook = (Notebook) pa;\n                nbook.page = nbook.page_num (item);\n            }\n            pa = pa.parent;\n        }\n    }\n\n\n    /**\n     * Add accelerator for \"activate\" signal.\n     *\n     * @param item {@link Gtk.Widget} to connect.\n     * @param key {@link Gdk.Key} number to connect to signal (with modtype).\n     * @param modtype {@link Gdk.ModifierType} to connect to signal together\n     *                with key name. Default modifier key is \"ctrl\".\n     */\n    public void add_accel_activate (Widget item,\n                                    int key,\n                                    Gdk.ModifierType modtype = Gdk.ModifierType.CONTROL_MASK,\n                                    string signal_name = \"activate\") {\n        item.add_accelerator (signal_name,\n                              this.accel_group,\n                              key,\n                              modtype,\n                              AccelFlags.VISIBLE);\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "tests/CMakeLists.txt",
    "content": "#\n# tests/CMakeLists.txt\n# Copyright (C) 2013, Valama development team\n#\n# Valama is free software: you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by the\n# Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# Valama is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License along\n# with this program.  If not, see <http://www.gnu.org/licenses/>.\n#\n\n\ncmake_minimum_required(VERSION \"2.8.4\")\n\nset(extra_srcfiles\n  \"../src/project/package_management.vala\"\n  \"../src/project/project_file.vala\"\n  \"../src/common/args.vala\"\n  \"../src/common/common.vala\"\n)\nset(required_pkgs\n  \"gee-0.8\"\n  \"gio-2.0\"\n  \"libxml-2.0\"\n  \"guanako\"\n  \"posix {nocheck}\"\n)\nset(vapifiles\n  \"../vapi/config.vapi\"\n)\nset(datadirs\n  \"projectfile\"\n)\n\nif(GUANAKO)\n  list(REMOVE_ITEM required_pkgs \"guanako\")\n  list(APPEND vapifiles \"${CMAKE_BINARY_DIR}/guanako/guanako.vapi\")\n  list(APPEND required_pkgs \"libvala-${VALA_SHORTVER}\")\nendif()\n\n# Custom library version checks.\nset(valac_cond)\nfind_package(PkgConfig)\n# Unix or Windows\nif(WIN32)\n  list(APPEND valac_cond \"-D;WIN32\")\nelseif(UNIX)\n  list(APPEND valac_cond \"-D;UNIX\")\nelse()\n  list(APPEND valac_cond \"-D;NOT_UNIX\")\n  list(APPEND valac_cond \"-D;NOT_WIN32\")\nendif()\n# glib-2.0\npkg_check_modules(GLIB2.0 REQUIRED \"glib-2.0\")\n\nset(default_vala_flags\n  \"--thread\"\n  \"--target-glib\" \"${GLIB2.0_VERSION}\"\n  \"--enable-experimental\"\n  \"--fatal-warnings\"\n  ${valac_cond}\n)\n\ninclude(ValaPkgs)\nvala_pkgs(VALA_C\n  PACKAGES\n    ${required_pkgs}\n  SRCFILES\n    \"*.vala\"\n    ${extra_srcfiles}\n  VAPIS\n    ${vapifiles}\n  OPTIONS\n    ${default_vala_flags}\n)\n\n# Set common C-macros.\nadd_definitions(-DPACKAGE_NAME=\"${project_name}\")\nadd_definitions(-DPACKAGE_VERSION=\"${${project_name}_VERSION}\")\nadd_definitions(-DGETTEXT_PACKAGE=\"${project_name_lower}\")\nadd_definitions(-DPACKAGE_DATA_DIR=\"${install_prefix}${datadir}\")\nadd_definitions(-DLOCALE_DIR=\"${install_prefix}${localedir}\")\nadd_definitions(-DPIXMAP_DIR=\"${install_prefix}${pixdir}\")\nadd_definitions(-DVALA_VERSION=\"${VALA_SHORTVER}\")\n\nadd_executable(\"tests\" ${VALA_C})\ntarget_link_libraries(\"tests\" ${PROJECT_LDFLAGS})\nadd_definitions(${PROJECT_C_FLAGS})\nif(GUANAKO)\n  include_directories(\"${PROJECT_BINARY_DIR}/guanako\")\n  target_link_libraries(\"tests\" \"guanako\")\nendif()\nadd_dependencies(\"tests\" \"guanako\" \"valama\")\n\ncopy_dirs(\n  TARGET\n    \"copy_datafiles\"\n  DIRS\n    ${datadirs}\n)\n\nadd_custom_command(\n  OUTPUT\n    \"tests.stamp\"\n  COMMAND\n    \"tests\"\n  COMMAND\n    \"${CMAKE_COMMAND}\" -E touch \"tests.stamp\"\n  DEPENDS\n    \"tests\"\n    \"copy_datafiles\"\n  COMMENT\n    \"Run tests\"\n  VERBATIM\n)\n\nadd_custom_target(\"run_tests\"\n  ALL\n  DEPENDS\n    \"tests.stamp\"\n)\n\n# enable_testing()\n# add_test(\n#   NAME\n#     \"Run\\\\ all\\\\ tests\"\n#   COMMAND\n#     \"tests\"\n# )\n\n# vim: set ai ts=2 sts=2 et sw=2\n"
  },
  {
    "path": "tests/projectfile/invalid_empty.vlp",
    "content": "<foobar></foobar>\n"
  },
  {
    "path": "tests/projectfile/invalid_garbage.vlp",
    "content": "<project version=\"0.1\">\n\t<name>InvalidGarbage</name>\n\t<buildsystem>autotools</buildsystem>\n\t<version>\n\t\t<major>2</major>\n\t\t<minor>4</minor>\n\t\t<<patch>1</patch>\n\t</version>\n</project>\n"
  },
  {
    "path": "tests/projectfile/pathtest.vlp",
    "content": "<project version=\"0.1\">\n</project>\n"
  },
  {
    "path": "tests/projectfile/version_exact.vlp",
    "content": "<project version=\"0.1\">\n</project>\n"
  },
  {
    "path": "tests/projectfile/version_high.vlp",
    "content": "<project version=\"42.1\">\n</project>\n"
  },
  {
    "path": "tests/projectfile/version_low.vlp",
    "content": "<project version=\"0.0.1\">\n</project>\n"
  },
  {
    "path": "tests/projectfile/version_none.vlp",
    "content": "<project>\n</project>\n"
  },
  {
    "path": "tests/testcase.vala",
    "content": "/*\n * tests/testcase.vala\n *\n * Copyright (C) 2009 Julien Peeters\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n *\n * Author:\n *  Julien Peeters <contact@julienpeeters.fr>\n */\n\npublic abstract class TestCase : Object {\n\n    private GLib.TestSuite suite;\n    private Adaptor[] adaptors = new Adaptor[0];\n\n    public delegate void TestMethod();\n\n    public TestCase (string name) {\n        this.suite = new GLib.TestSuite (name);\n    }\n\n    public void add_test (string name, owned TestMethod test) {\n        var adaptor = new Adaptor (name, (owned) test, this);\n        this.adaptors += adaptor;\n\n        this.suite.add (new GLib.TestCase (adaptor.name,\n                                           adaptor.set_up,\n                                           adaptor.run,\n                                           adaptor.tear_down));\n    }\n\n    public virtual void set_up() {\n    }\n\n    public virtual void tear_down() {\n    }\n\n    public GLib.TestSuite get_suite() {\n        return this.suite;\n    }\n\n    private class Adaptor {\n        [CCode (notify = false)]\n        public string name { get; private set; }\n        private TestMethod test;\n        private TestCase test_case;\n\n        public Adaptor (string name,\n                        owned TestMethod test,\n                        TestCase test_case) {\n            this.name = name;\n            this.test = (owned) test;\n            this.test_case = test_case;\n        }\n\n        public void set_up (void* fixture) {\n            this.test_case.set_up();\n        }\n\n        public void run (void* fixture) {\n            this.test();\n        }\n\n        public void tear_down (void* fixture) {\n            this.test_case.tear_down();\n        }\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "tests/testcompversion.vala",
    "content": "/*\n * tests/testcompversion.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\npublic class TestCompVersion : TestCase {\n    public TestCompVersion() {\n        base (\"TestCompVersion\");\n        add_test (\"standard\", test_normal);\n        add_test (\"epoch\", test_epoch);\n    }\n\n    public override void set_up() {}\n    public override void tear_down() {}\n\n    public void test_normal() {\n        assert (comp_version (\"14\", \"3\") == 1);\n        assert (comp_version (\"14\", \"3.5\") == 1);\n        assert (comp_version (\"14\", \"3.9.8\") == 1);\n        assert (comp_version (\"14.1\", \"3.5\") == 1);\n\n        assert (comp_version (\"3\", \"14\") == -1);\n        assert (comp_version (\"3.5\", \"14\") == -1);\n        assert (comp_version (\"3.9.8\", \"14\") == -1);\n        assert (comp_version (\"3.5\", \"14.1\") == -1);\n\n        assert (comp_version (\"4.1.2\", \"4.1.3\") == -1);\n        assert (comp_version (\"4.10.2\", \"4.2.0\") == 1);\n        assert (comp_version (\"4.1.2.3.6.4.12\", \"4.1.2.3.6.4.3\") == 1);\n\n        assert (comp_version (\"4.1.2.3.6.4.2\", \"4.1.2.3.6.4.2\") == 0);\n        assert (comp_version (\"4\", \"4\") == 0);\n    }\n\n    public void test_epoch() {\n        assert (comp_version (\"1:3.0.0\", \"4.0\") == 1);\n        assert (comp_version (\"1:3.0.0\", \"3.0.0\") == 1);\n        assert (comp_version (\"1:3.0.0\", \"3.0.1\") == 1);\n\n        assert (comp_version (\"1:3.0.0\", \"2:2.0\") == -1);\n        assert (comp_version (\"1:3.0.0\", \"1:3.0.1\") == -1);\n        assert (comp_version (\"1:3.0.0\", \"1:3.1\") == -1);\n\n        assert (comp_version (\"15:3.0.0\", \"2:6.1\") == 1);\n\n        assert (comp_version (\"1:3\", \"1:3\") == 0);\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "tests/testmain.vala",
    "content": "/*\n * tests/testmain.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\nvoid main (string[] args) {\n    Test.init (ref args);\n\n    TestSuite.get_root().add_suite (new TestCompVersion().get_suite());\n    TestSuite.get_root().add_suite (new TestPathSplit().get_suite());\n    TestSuite.get_root().add_suite (new TestProjectfile().get_suite());\n\n    Test.run();\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "tests/testpathsplit.vala",
    "content": "/*\n * tests/testpathsplit.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\npublic class TestPathSplit : TestCase {\n    public TestPathSplit() {\n        base (\"TestPathSplit\");\n        add_test (\"standard\", test_normal);\n        add_test (\"relative_paths\", test_relative_paths);\n        add_test (\"relative_paths_special\", test_relative_paths_special);\n        add_test (\"utf8_paths\", test_utf8);\n        add_test (\"bytecharindex\", test_bytetoindex);\n    }\n\n    public override void set_up() {}\n    public override void tear_down() {}\n\n    public void test_normal() {\n        string[] splitpaths;\n\n        var baseparts = new string[] {\"/\", \"usr\", \"share\", \"valama\", \"templates\"};\n        splitpaths = split_path (\"/usr/share/valama/templates\", true, true);\n        assert (baseparts.length == splitpaths.length);\n        for (int i = 0; i < baseparts.length; ++i)\n            assert (splitpaths[i] == baseparts[i]);\n        var baseparts_d = baseparts;\n        splitpaths = split_path (\"/usr/share/valama/templates/\", true, true);\n        assert (baseparts_d.length == splitpaths.length);\n        for (int i = 0; i < baseparts_d.length + 1; ++i)\n            assert (splitpaths[i] == baseparts_d[i]);\n\n        var baseparts_noroot = new string[] {\"usr\", \"share\", \"valama\", \"templates\"};\n        splitpaths = split_path (\"/usr/share/valama/templates\", true, false);\n        assert (baseparts_noroot.length == splitpaths.length);\n        for (int i = 0; i < baseparts_noroot.length; ++i)\n            assert (splitpaths[i] == baseparts_noroot[i]);\n\n        var absoluteparts = new string[] {\"/\", \"/usr\", \"/usr/share\", \"/usr/share/valama\", \"/usr/share/valama/templates\"};\n        splitpaths = split_path (\"/usr/share/valama/templates\", false, true);\n        assert (absoluteparts.length == splitpaths.length);\n        for (int i = 0; i < absoluteparts.length; ++i)\n            assert (splitpaths[i] == absoluteparts[i]);\n\n        var absoluteparts_noroot = new string[] {\"usr\", \"usr/share\", \"usr/share/valama\", \"usr/share/valama/templates\"};\n        splitpaths = split_path (\"/usr/share/valama/templates\", false, false);\n        assert (absoluteparts_noroot.length == splitpaths.length);\n        for (int i = 0; i < absoluteparts_noroot.length; ++i)\n            assert (splitpaths[i] == absoluteparts_noroot[i]);\n    }\n\n    public void test_relative_paths() {\n        string[] splitpaths;\n\n        var baseparts = new string[] {\"usr\", \"share\", \"valama\", \"templates\"};\n        splitpaths = split_path (\"usr/share/valama/templates\", true, true);\n        assert (baseparts.length == splitpaths.length);\n        for (int i = 0; i < baseparts.length; ++i)\n            assert (splitpaths[i] == baseparts[i]);\n\n        var baseparts_noroot = new string[] {\"usr\", \"share\", \"valama\", \"templates\"};\n        splitpaths = split_path (\"usr/share/valama/templates\", true, false);\n        assert (baseparts_noroot.length == splitpaths.length);\n        for (int i = 0; i < baseparts_noroot.length; ++i)\n            assert (splitpaths[i] == baseparts_noroot[i]);\n\n        var absoluteparts = new string[] {\"usr\", \"usr/share\", \"usr/share/valama\", \"usr/share/valama/templates\"};\n        splitpaths = split_path (\"usr/share/valama/templates\", false, true);\n        assert (absoluteparts.length == splitpaths.length);\n        for (int i = 0; i < absoluteparts.length; ++i)\n            assert (splitpaths[i] == absoluteparts[i]);\n\n        var absoluteparts_noroot = new string[] {\"usr\", \"usr/share\", \"usr/share/valama\", \"usr/share/valama/templates\"};\n        splitpaths = split_path (\"usr/share/valama/templates\", false, false);\n        assert (absoluteparts_noroot.length == splitpaths.length);\n        for (int i = 0; i < absoluteparts_noroot.length; ++i)\n            assert (splitpaths[i] == absoluteparts_noroot[i]);\n    }\n\n    public void test_relative_paths_special() {\n        assert (split_path (\".\", true, true).length == 0);\n        assert (split_path (\".\", true, false).length == 0);\n        assert (split_path (\".\", false, true).length == 0);\n        assert (split_path (\".\", false, false).length == 0);\n\n        assert (split_path (\"\", true, true).length == 0);\n        assert (split_path (\"\", true, false).length == 0);\n        assert (split_path (\"\", false, true).length == 0);\n        assert (split_path (\"\", false, false).length == 0);\n    }\n\n    public void test_utf8() {\n        var baseparts = new string[] {\"/\", \"𤭢水は方円の器に従い\", \"asdf\", \"人は善悪の友による。\"};\n        var splitpaths = split_path (\"/𤭢水は方円の器に従い/asdf/人は善悪の友による。\", true, true);\n        assert (baseparts.length == splitpaths.length);\n        for (int i = 0; i < baseparts.length; ++i)\n            assert (splitpaths[i] == baseparts[i]);\n    }\n\n    public void test_bytetoindex() {\n        var mbytestr = \"楽あれば苦あり。\";  // 3 byte characters\n        for (var i = 0; i < mbytestr.length; ++i)\n            assert (byte_index_to_character_index (mbytestr, i, true) == ((i%3 == 0) ? i/3 : -1));\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "tests/testprojectfile.vala",
    "content": "/*\n * tests/testprofile.vala\n * Copyright (C) 2013, Valama development team\n *\n * Valama is free software: you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the\n * Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Valama is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n * See the GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\nusing GLib;\n\npublic class TestProjectfile : TestCase {\n    public TestProjectfile() {\n        base (\"TestProjectfile\");\n        add_test (\"paths\", test_paths);\n        add_test (\"invalid\", test_invalid);\n        add_test (\"version\", test_version);\n    }\n\n    public override void set_up() {}\n    public override void tear_down() {}\n\n    //TODO: Compute project files on runtime?\n    public void test_paths() {\n        ProjectFile p = null;\n        try {\n            //NOTE: Execution in tests/ directory is mandatory.\n            p = new ProjectFile (\"projectfile/pathtest.vlp\");\n        } catch (LoadingError e) {\n            error (_(\"LoadingError: %s\\n\"), e.message);\n        }\n        assert (p as ProjectFile != null);\n\n        assert (p.get_absolute_path (\"/foo/bar/foo\") == \"/foo/bar/foo\");\n        assert (p.get_absolute_path (\"foo/bar/foo\") == Path.build_path (Path.DIR_SEPARATOR_S,\n                                                                        Environment.get_current_dir(),\n                                                                        \"projectfile\", \"foo\", \"bar\", \"foo\"));\n        assert (p.get_relative_path (\"foo/bar/foo\") == \"foo/bar/foo\");\n        assert (p.get_relative_path (\"/foo/bar/foo\") == \"/foo/bar/foo\");\n        assert (p.get_relative_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                      Environment.get_current_dir(),\n                                                      \"projectfile\", \"foo\", \"bar\", \"foo\")) == \"foo/bar/foo\");\n        assert (p.get_relative_path (Path.build_path (Path.DIR_SEPARATOR_S,\n                                                      Environment.get_current_dir(),\n                                                      \"projectfile\")) == \"\");\n    }\n\n    public void test_invalid() {\n        int fd;\n        int err = Posix.stderr.fileno();\n        var bak2 = Posix.dup (err);\n\n        ProjectFile p_invalid_notexistant = null;\n        try {\n            Posix.stderr.flush();\n            fd = Posix.open (\"/dev/null\", Posix.O_WRONLY);\n            Posix.dup2 (fd, err);\n            p_invalid_notexistant = new ProjectFile (\"projectfile/invalid_notexistant.vlp\");\n        } catch (LoadingError e) {\n        }\n        Posix.stderr.flush();\n        Posix.dup2 (bak2, err);\n        assert (p_invalid_notexistant as ProjectFile == null);\n\n        ProjectFile p_invalid_garbage = null;\n        try {\n            Posix.stderr.flush();\n            fd = Posix.open (\"/dev/null\", Posix.O_WRONLY);\n            Posix.dup2 (fd, err);\n            p_invalid_garbage = new ProjectFile (\"projectfile/invalid_garbage.vlp\");\n        } catch (LoadingError e) {\n        }\n        Posix.stderr.flush();\n        Posix.dup2 (bak2, err);\n        assert (p_invalid_garbage as ProjectFile == null);\n\n        ProjectFile p_invalid_empty = null;\n        try {\n            p_invalid_garbage = new ProjectFile (\"projectfile/invalid_empty.vlp\");\n        } catch (LoadingError e) {\n        }\n        assert (p_invalid_empty as ProjectFile == null);\n    }\n\n    public void test_version() {\n        int fd;\n        var @out = Posix.stdout.fileno();\n        var bak1 = Posix.dup (@out);\n        var swpforceold = Args.forceold;\n        Args.forceold = false;\n\n        ProjectFile p_version_none = null;\n        try {\n            //NOTE: Execution in tests/ directory is mandatory.\n            p_version_none = new ProjectFile (\"projectfile/version_none.vlp\");\n        } catch (LoadingError e) {\n        }\n        assert (p_version_none as ProjectFile == null);\n\n        ProjectFile p_version_low = null;\n        try {\n            p_version_low = new ProjectFile (\"projectfile/version_low.vlp\");\n        } catch (LoadingError e) {\n        }\n        assert (p_version_low as ProjectFile == null);\n\n        Args.forceold = true;\n        ProjectFile p_version_lowforce = null;\n        try {\n            Posix.stdout.flush();\n            fd = Posix.open (\"/dev/null\", Posix.O_WRONLY);\n            Posix.dup2 (fd, @out);\n            p_version_lowforce = new ProjectFile (\"projectfile/version_low.vlp\");\n        } catch (LoadingError e) {\n        }\n        Posix.stdout.flush();\n        Posix.dup2 (bak1, @out);\n        assert (p_version_lowforce as ProjectFile != null);\n\n        Args.forceold = false;\n        ProjectFile p_version_exact = null;\n        try {\n            p_version_exact = new ProjectFile (\"projectfile/version_exact.vlp\");\n        } catch (LoadingError e) {\n            error (_(\"LoadingError: %s\\n\"), e.message);\n        }\n        assert (p_version_exact as ProjectFile != null);\n\n        ProjectFile p_version_high = null;\n        try {\n            p_version_high = new ProjectFile (\"projectfile/version_high.vlp\");\n        } catch (LoadingError e) {\n            error (_(\"LoadingError: %s\\n\"), e.message);\n        }\n        assert (p_version_high as ProjectFile != null);\n\n        Args.forceold = swpforceold;\n    }\n}\n\n// vim: set ai ts=4 sts=4 et sw=4\n"
  },
  {
    "path": "valama.vlp",
    "content": "<project version=\"0.1\">\n\t<name>Valama</name>\n\t<buildsystem library=\"false\">cmake</buildsystem>\n\t<version>\n\t\t<major>0</major>\n\t\t<minor>1</minor>\n\t\t<patch>2</patch>\n\t</version>\n\t<packages>\n\t\t<choice all=\"yes\">\n\t\t\t<package name=\"libvala-0.26\"/>\n\t\t\t<package name=\"libvala-0.24\"/>\n\t\t\t<package name=\"libvala-0.22\"/>\n\t\t\t<package name=\"libvala-0.20\"/>\n\t\t</choice>\n\t\t<package name=\"clutter-gtk-1.0\"/>\n\t\t<package name=\"gdk-3.0\"/>\n\t\t<package name=\"gdl-3.0\" version=\"3.8\" rel=\"since\">\n\t\t\t<extracheck vapi=\"extravapi/gdl-3.0/gdl-3.0.vapi\" define=\"GDL_3_9_91\">\n\t\t\t\t<package name=\"gdl-3.0\" version=\"3.9.91\" rel=\"since\"/>\n\t\t\t\t<package name=\"libvala-0.20\"/>\n\t\t\t</extracheck>\n\t\t</package>\n\t\t<package name=\"gee-0.8\" version=\"0.10.5\" rel=\"since\"/>\n\t\t<package name=\"gio-2.0\"/>\n\t\t<package name=\"gladeui-2.0\">\n\t\t\t<extracheck vapi=\"vapi/gladeui-2.0.vapi\"/>\n\t\t</package>\n\t\t<package name=\"glib-2.0\" version=\"2.32\" rel=\"since\"/>\n\t\t<package name=\"gobject-2.0\"/>\n\t\t<package name=\"gtk+-3.0\" version=\"3.9\" rel=\"since\">\n\t\t\t<extracheck vapi=\"extravapi/gtk+-3.0/gtk+-3.0.vapi\">\n\t\t\t\t<package name=\"libvala-0.20\"/>\n\t\t\t</extracheck>\n\t\t</package>\n\t\t<package name=\"gtksourceview-3.0\" version=\"3.9\" rel=\"since\">\n\t\t\t<extracheck define=\"GTK_SOURCE_VIEW_3_12\">\n\t\t\t\t<package name=\"gtksourceview-3.0\" version=\"3.11\" rel=\"since\"/>\n\t\t\t</extracheck>\n\t\t\t<extracheck vapi=\"extravapi/gtksourceview-3.0/gtksourceview-3.0.vapi\">\n\t\t\t\t<choice all=\"no\">\n\t\t\t\t\t<package name=\"libvala-0.26\"/>\n\t\t\t\t\t<package name=\"libvala-0.24\"/>\n\t\t\t\t</choice>\n\t\t\t\t<package name=\"gtksourceview-3.0\" version=\"3.11\" rel=\"before\"/>\n\t\t\t</extracheck>\n\t\t</package>\n\t\t<package name=\"guanako\"/>\n\t\t<package name=\"libxml-2.0\"/>\n\t\t<package name=\"posix\"/>\n\t\t<package name=\"webkit2gtk-3.0\">\n\t\t\t<extracheck vapi=\"extravapi/webkit2gtk-3.0/webkit2gtk-3.0.vapi\"/>\n\t\t</package>\n\t</packages>\n\t<source-directories>\n\t\t<directory>src</directory>\n\t\t<directory>src/buildsystem</directory>\n\t\t<directory>src/common</directory>\n\t\t<directory>src/dialogs</directory>\n\t\t<directory>src/project</directory>\n\t\t<directory>src/ui</directory>\n\t\t<directory>src/ui/welcome_screen</directory>\n\t\t<directory>vapi</directory>\n\t</source-directories>\n\t<ui-directories>\n\t\t<directory>ui</directory>\n\t</ui-directories>\n\t<buildsystem-directories>\n\t\t<directory></directory>\n\t\t<directory>cmake</directory>\n\t\t<directory>cmake/vala</directory>\n\t\t<directory>po</directory>\n\t</buildsystem-directories>\n\t<data-directories>\n\t\t<directory>data</directory>\n\t\t<directory>data/buildsystems/cmake</directory>\n\t\t<directory>data/buildsystems/cmake/buildsystem</directory>\n\t\t<directory>data/buildsystems/cmake/buildsystem/cmake</directory>\n\t\t<directory>data/buildsystems/cmake/buildsystem/cmake/vala</directory>\n\t\t<directory>data/templates/clutter</directory>\n\t\t<directory>data/templates/clutter/template</directory>\n\t\t<directory>data/templates/clutter/template/src</directory>\n\t\t<directory>data/templates/clutter/template/vapi</directory>\n\t\t<directory>data/templates/plain_vala</directory>\n\t\t<directory>data/templates/plain_vala/template</directory>\n\t\t<directory>data/templates/plain_vala/template/src</directory>\n\t\t<directory>data/templates/plain_vala/template/vapi</directory>\n\t\t<directory>data/templates/simple_gtk</directory>\n\t\t<directory>data/templates/simple_gtk/template</directory>\n\t\t<directory>data/templates/simple_gtk/template/src</directory>\n\t\t<directory>data/templates/simple_gtk/template/vapi</directory>\n\t\t<directory>extravapi</directory>\n\t\t<directory>extravapi/gdl-3.0</directory>\n\t\t<directory>extravapi/gtk+-3.0</directory>\n\t\t<directory>extravapi/gtksourceview-3.0</directory>\n\t\t<directory>extravapi/webkit2gtk-3.0</directory>\n\t\t<directory>guanako</directory>\n\t\t<directory>guanako/data</directory>\n\t\t<directory>guanako/scanner</directory>\n\t\t<directory>icons</directory>\n\t</data-directories>\n\t<data-files>\n\t\t<file>AUTHORS</file>\n\t\t<file>COPYING</file>\n\t\t<file>README.md</file>\n\t\t<file>po/de.po</file>\n\t\t<file>po/fr.po</file>\n\t</data-files>\n</project>\n"
  },
  {
    "path": "vapi/config.vapi",
    "content": "[CCode (cprefix = \"\", lower_case_cprefix = \"\")]\nnamespace Config {\n    public const string PACKAGE_NAME;\n    public const string PACKAGE_VERSION;\n    public const string GETTEXT_PACKAGE;\n    public const string PACKAGE_DATA_DIR;\n    public const string PACKAGE_UI_DIR;\n\n    public const string LOCALE_DIR;\n    public const string PIXMAP_DIR;\n\n    public const string VALA_VERSION;\n}\n"
  },
  {
    "path": "vapi/gladeui-2.0.deps",
    "content": "gtk+-3.0\ngmodule-2.0\n"
  },
  {
    "path": "vapi/gladeui-2.0.vapi",
    "content": "/* gladeui-2.0.vapi generated by vapigen, do not modify. */\n\nnamespace Glade {\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class App : GLib.Object {\n        [CCode (has_construct_function = false)]\n        public App ();\n        public static void add_project (Glade.Project project);\n        public static int config_save ();\n        public static bool do_event (Gdk.Event event);\n        public static unowned Glade.App @get ();\n        public static unowned Gtk.AccelGroup get_accel_group ();\n        public static unowned string get_bin_dir ();\n        public static unowned Glade.Catalog get_catalog (string name);\n        public static bool get_catalog_version (string name, int major, int minor);\n        public static unowned GLib.List<Glade.Catalog> get_catalogs ();\n        public static unowned string get_catalogs_dir ();\n        public static unowned Glade.Clipboard get_clipboard ();\n        public static unowned GLib.KeyFile get_config ();\n        public static unowned string get_locale_dir ();\n        public static unowned string get_modules_dir ();\n        public static unowned string get_pixmaps_dir ();\n        public static unowned string get_plugins_dir ();\n        public static unowned Glade.Project get_project_by_path (string project_path);\n        public static unowned GLib.List<Glade.Project> get_projects ();\n        public static unowned Gtk.Widget get_window ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        [NoWrapper]\n        public virtual void glade_reserved5 ();\n        [NoWrapper]\n        public virtual void glade_reserved6 ();\n        public static bool is_project_loaded (string project_path);\n        public static void remove_project (Glade.Project project);\n        public static void search_docs (string book, string page, string search);\n        public static void set_accel_group (Gtk.AccelGroup accel_group);\n        public static void set_window (Gtk.Widget window);\n        public virtual signal void doc_search (string p0, string p1, string p2);\n        public virtual signal void signal_editor_created (GLib.Object p0);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class BaseEditor : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        public BaseEditor (GLib.Object container, Glade.Editable main_editable);\n        public void add_default_properties (Glade.Widget gchild);\n        public void add_editable (Glade.Widget gchild, Glade.EditorPageType page);\n        public void add_label (string str);\n        public void add_properties (Glade.Widget gchild, bool packing);\n        public void append_types (GLib.Type parent_type);\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        [NoWrapper]\n        public virtual void glade_reserved5 ();\n        [NoWrapper]\n        public virtual void glade_reserved6 ();\n        public unowned Gtk.Widget pack_new_window (string title, string help_markup);\n        public void set_show_signal_editor (bool val);\n        [NoAccessorMethod]\n        public GLib.Object container { owned get; set; }\n        public virtual signal unowned GLib.Object build_child (GLib.Object p0, uint p1);\n        public virtual signal bool change_type (GLib.Object p0, uint p1);\n        public virtual signal void child_selected (GLib.Object p0);\n        public virtual signal bool delete_child (GLib.Object p0, GLib.Object p1);\n        public virtual signal unowned string get_display_name (GLib.Object p0);\n        public virtual signal bool move_child (GLib.Object p0, GLib.Object p1);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class Catalog {\n        public static void destroy_all ();\n        public unowned GLib.List<Glade.WidgetAdaptor> get_adaptors ();\n        public unowned string get_book ();\n        public unowned string get_domain ();\n        public unowned string get_icon_prefix ();\n        public uint16 get_major_version ();\n        public uint16 get_minor_version ();\n        public unowned string get_name ();\n        public unowned GLib.List<Glade.TargetableVersion> get_targets ();\n        public unowned GLib.List<Glade.WidgetGroup> get_widget_groups ();\n        public static bool is_loaded (string name);\n        public static unowned GLib.List load_all ();\n        public bool supports_gtkbuilder ();\n        public bool supports_libglade ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class CellRendererIcon : Gtk.CellRendererPixbuf {\n        [CCode (has_construct_function = false, type = \"GtkCellRenderer*\")]\n        public CellRendererIcon ();\n        public bool get_activatable ();\n        public bool get_active ();\n        public void set_activatable (bool setting);\n        public void set_active (bool setting);\n        public bool activatable { get; set; }\n        public bool active { get; set; }\n        public virtual signal void activate (string path);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Clipboard : GLib.Object {\n        [CCode (has_construct_function = false)]\n        public Clipboard ();\n        public void add (GLib.List<Glade.Widget> widgets);\n        public void clear ();\n        public bool get_has_selection ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public unowned GLib.List<Glade.Widget> widgets ();\n        public bool has_selection { get; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Command : GLib.Object {\n        [CCode (has_construct_function = false)]\n        protected Command ();\n        public static void add (GLib.List<Glade.Widget> widgets, Glade.Widget parent, Glade.Placeholder placeholder, Glade.Project project, bool pasting);\n        public static void add_signal (Glade.Widget glade_widget, Glade.Signal @signal);\n        public static void change_signal (Glade.Widget glade_widget, Glade.Signal old_signal, Glade.Signal new_signal);\n        public virtual void collapse (Glade.Command other);\n        public static unowned Glade.Widget create (Glade.WidgetAdaptor adaptor, Glade.Widget parent, Glade.Placeholder placeholder, Glade.Project project);\n        public static void cut (GLib.List<Glade.Widget> widgets);\n        public static void @delete (GLib.List<Glade.Widget> widgets);\n        public unowned string description ();\n        public static void dnd (GLib.List<Glade.Widget> widgets, Glade.Widget parent, Glade.Placeholder placeholder);\n        public virtual bool execute ();\n        public static int get_group_depth ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public int group_id ();\n        public static void lock_widget (Glade.Widget widget, Glade.Widget @lock);\n        public static void paste (GLib.List<Glade.Widget> widgets, Glade.Widget parent, Glade.Placeholder placeholder, Glade.Project project);\n        public static void pop_group ();\n        public static void push_group (string fmt);\n        public static void remove_signal (Glade.Widget glade_widget, Glade.Signal @signal);\n        public static void set_i18n (Glade.Property property, bool translatable, string context, string comment);\n        public static void set_name (Glade.Widget glade_widget, string name);\n        public static void set_properties (Glade.Property property, GLib.Value old_value, GLib.Value new_value);\n        public static void set_properties_list (Glade.Project project, GLib.List<Glade.Property> props);\n        public static void set_property (Glade.Property property);\n        public static void set_property_value (Glade.Property property, GLib.Value value);\n        public virtual bool undo ();\n        public virtual bool unifies (Glade.Command other);\n        public static void unlock_widget (Glade.Widget widget);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class Cursor {\n        public weak Gdk.Cursor add_widget;\n        public weak Gdk.Pixbuf add_widget_pixbuf;\n        public weak Gdk.Cursor drag;\n        public weak Gdk.Cursor resize_bottom;\n        public weak Gdk.Cursor resize_bottom_left;\n        public weak Gdk.Cursor resize_bottom_right;\n        public weak Gdk.Cursor resize_left;\n        public weak Gdk.Cursor resize_right;\n        public weak Gdk.Cursor resize_top;\n        public weak Gdk.Cursor resize_top_left;\n        public weak Gdk.Cursor resize_top_right;\n        public weak Gdk.Cursor selector;\n        public static unowned Gdk.Pixbuf get_add_widget_pixbuf ();\n        public static void init ();\n        public static void @set (Glade.Project project, Gdk.Window window, Glade.CursorType type);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class DesignView : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false, type = \"GtkWidget*\")]\n        public DesignView (Glade.Project project);\n        public static unowned Glade.DesignView get_from_project (Glade.Project project);\n        public unowned Glade.Project get_project ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public Glade.Project project { get; construct; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropBool : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropBool ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropColor : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropColor ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropEnum : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropEnum ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropFlags : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropFlags ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropNamedIcon : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropNamedIcon ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropNumeric : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropNumeric ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropObject : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropObject ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropObjects : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropObjects ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropText : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropText ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EPropUnichar : Glade.EditorProperty, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EPropUnichar ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Editor : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        public Editor ();\n        public static unowned Gtk.Widget dialog_for_widget (Glade.Widget widget);\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public void hide_info ();\n        public void load_widget (Glade.Widget widget);\n        public static bool query_dialog (Glade.Widget widget);\n        public void show_info ();\n        [NoAccessorMethod]\n        public Glade.Widget widget { owned get; set; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EditorProperty : Gtk.HBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        protected EditorProperty ();\n        [NoWrapper]\n        public virtual void* changed (Glade.Property p2);\n        public void commit_no_callback (GLib.Value value);\n        [NoWrapper]\n        public virtual unowned Gtk.Widget create_input ();\n        public unowned Gtk.Widget get_item_label ();\n        public unowned Glade.PropertyClass get_pclass ();\n        public unowned Glade.Property get_property ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public virtual void load (Glade.Property property);\n        public void load_by_widget (Glade.Widget widget);\n        public bool loading ();\n        public static bool show_i18n_dialog (Gtk.Widget parent, string text, string context, string comment, bool translatable);\n        public static bool show_object_dialog (Glade.Project project, string title, Gtk.Widget parent, GLib.Type object_type, Glade.Widget exception, out unowned Glade.Widget object);\n        public static bool show_resource_dialog (Glade.Project project, Gtk.Widget parent, string filename);\n        [NoAccessorMethod]\n        public void* property_class { get; construct; }\n        [NoAccessorMethod]\n        public bool use_command { get; set; }\n        public virtual signal void commit (void* p0);\n        public virtual signal void value_changed (Glade.Property p0);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class EditorTable : Gtk.Grid, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, Glade.Editable {\n        [CCode (has_construct_function = false, type = \"GtkWidget*\")]\n        public EditorTable (Glade.WidgetAdaptor adaptor, Glade.EditorPageType type);\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class GCSetPropData {\n        public GLib.Value new_value;\n        public GLib.Value old_value;\n        public weak Glade.Property property;\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", type_id = \"glade_glist_get_type ()\")]\n    [Compact]\n    public class GList {\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class GObjectAdaptor : GLib.Object {\n        [CCode (has_construct_function = false)]\n        protected GObjectAdaptor ();\n        [NoAccessorMethod]\n        public string book { owned get; construct; }\n        [NoAccessorMethod]\n        public string catalog { owned get; construct; }\n        [NoAccessorMethod]\n        public void* cursor { get; }\n        [NoAccessorMethod]\n        public string generic_name { owned get; construct; }\n        [NoAccessorMethod]\n        public string icon_name { owned get; construct; }\n        [NoAccessorMethod]\n        public string name { owned get; construct; }\n        [NoAccessorMethod]\n        public string special_child_type { owned get; construct; }\n        [NoAccessorMethod]\n        public string title { owned get; set; }\n        [NoAccessorMethod]\n        public GLib.Type type { get; construct; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Inspector : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false, type = \"GtkWidget*\")]\n        public Inspector ();\n        public unowned Glade.Project get_project ();\n        public unowned GLib.List<Glade.Widget> get_selected_items ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public void set_project (Glade.Project project);\n        [CCode (has_construct_function = false, type = \"GtkWidget*\")]\n        public Inspector.with_project (Glade.Project project);\n        public Glade.Project project { get; set; }\n        public virtual signal void item_activated ();\n        public virtual signal void selection_changed ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", free_function = \"glade_name_context_destroy\")]\n    [Compact]\n    public class NameContext {\n        [CCode (has_construct_function = false)]\n        public NameContext ();\n        public bool add_name (string name);\n        public unowned string dual_new_name (Glade.NameContext another_context, string base_name);\n        public bool has_name (string name);\n        public uint n_names ();\n        [CCode (has_construct_function = false, type = \"gchar*\")]\n        public NameContext.name (Glade.NameContext context, string base_name);\n        public void release_name (string name);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Palette : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false, type = \"GtkWidget*\")]\n        public Palette ();\n        public Glade.ItemAppearance get_item_appearance ();\n        public unowned Glade.Project get_project ();\n        public bool get_show_selector_button ();\n        public bool get_use_small_item_icons ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public void set_item_appearance (Glade.ItemAppearance item_appearance);\n        public void set_project (Glade.Project project);\n        public void set_show_selector_button (bool show_selector_button);\n        public void set_use_small_item_icons (bool use_small_item_icons);\n        public Glade.ItemAppearance item_appearance { get; set; }\n        public Glade.Project project { get; set; }\n        public bool show_selector_button { get; set; }\n        public bool use_small_item_icons { get; set; }\n        public virtual signal void refresh ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class ParamSpecObjects {\n        public void set_type (GLib.Type type);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Placeholder : Gtk.Widget, Atk.Implementor, Gtk.Buildable, Gtk.Scrollable {\n        [CCode (has_construct_function = false, type = \"GtkWidget*\")]\n        public Placeholder ();\n        public unowned Glade.Widget get_parent ();\n        public unowned Glade.Project get_project ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        public unowned GLib.List<Glade.WidgetAction> packing_actions ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Project : GLib.Object, Gtk.TreeModel {\n        [CCode (has_construct_function = false)]\n        public Project ();\n        public virtual void add_object (GLib.Object object);\n        public bool available_widget_name (Glade.Widget widget, string name);\n        public void cancel_load ();\n        public void check_reordered (Glade.Widget parent, GLib.List<Glade.Widget> old_order);\n        public void command_cut ();\n        public void command_delete ();\n        public void command_paste (Glade.Placeholder placeholder);\n        public void copy_selection ();\n        public unowned string display_dependencies ();\n        public unowned Glade.WidgetAdaptor get_add_item ();\n        public ulong get_file_mtime ();\n        public bool get_has_selection ();\n        public bool get_modified ();\n        public unowned string get_name ();\n        public unowned GLib.List<GLib.Object> get_objects ();\n        public Glade.PointerMode get_pointer_mode ();\n        public bool get_readonly ();\n        public void get_target_version (string catalog, int major, int minor);\n        public unowned Glade.Widget get_widget_by_name (string name);\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        [NoWrapper]\n        public virtual void glade_reserved5 ();\n        [NoWrapper]\n        public virtual void glade_reserved6 ();\n        [NoWrapper]\n        public virtual void glade_reserved7 ();\n        [NoWrapper]\n        public virtual void glade_reserved8 ();\n        public bool has_object (GLib.Object object);\n        public bool is_loading ();\n        public bool is_selected (GLib.Object object);\n        public static unowned Glade.Project load (string path);\n        public bool load_cancelled ();\n        public bool load_from_file (string path);\n        public virtual unowned Glade.Command next_redo_item ();\n        public virtual unowned Glade.Command next_undo_item ();\n        public static unowned Gdk.Pixbuf pointer_mode_render_icon (Glade.PointerMode mode, Gtk.IconSize size);\n        public void preview (Glade.Widget gwidget);\n        public void properties ();\n        public void push_progress ();\n        public virtual void push_undo (Glade.Command cmd);\n        public void queue_selection_changed ();\n        public virtual void redo ();\n        public unowned Gtk.Widget redo_items ();\n        public virtual void remove_object (GLib.Object object);\n        public unowned GLib.List<string> required_libs ();\n        public void reset_path ();\n        public unowned string resource_fullpath (string resource);\n        public bool save (string path) throws GLib.Error;\n        public void selection_add (GLib.Object object, bool emit_signal);\n        public void selection_clear (bool emit_signal);\n        public unowned GLib.List selection_get ();\n        public void selection_remove (GLib.Object object, bool emit_signal);\n        public void selection_set (GLib.Object object, bool emit_signal);\n        public void set_add_item (Glade.WidgetAdaptor adaptor);\n        public void set_pointer_mode (Glade.PointerMode mode);\n        public void set_widget_name (Glade.Widget widget, string name);\n        public unowned GLib.List toplevels ();\n        public virtual void undo ();\n        public unowned Gtk.Widget undo_items ();\n        public static void verify_property (Glade.Property property);\n        public static void verify_signal (Glade.Widget widget, Glade.Signal @signal);\n        public unowned string verify_widget_adaptor (Glade.WidgetAdaptor adaptor, Glade.SupportMask mask);\n        public void widget_changed (Glade.Widget gwidget);\n        [CCode (has_construct_function = false, type = \"gchar*\")]\n        public Project.widget_name (Glade.Project project, Glade.Widget widget, string base_name);\n        public Glade.GObjectAdaptor add_item { get; }\n        public bool has_selection { get; }\n        public bool modified { get; }\n        [NoAccessorMethod]\n        public string path { owned get; }\n        public Glade.PointerMode pointer_mode { get; }\n        [NoAccessorMethod]\n        public bool read_only { get; }\n        public virtual signal void add_widget (Glade.Widget p0);\n        public virtual signal void changed (Glade.Command command, bool forward);\n        public virtual signal void close ();\n        public virtual signal void load_progress (int p0, int p1);\n        public virtual signal void parse_began ();\n        public virtual signal void parse_finished ();\n        public virtual signal void remove_widget (Glade.Widget p0);\n        public virtual signal void selection_changed ();\n        public virtual signal void targets_changed ();\n        public virtual signal void widget_name_changed (Glade.Widget widget);\n        public virtual signal void widget_visibility_changed (Glade.Widget p0, bool p1);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Property : GLib.Object {\n        [CCode (has_construct_function = false)]\n        public Property (Glade.PropertyClass klass, Glade.Widget widget, GLib.Value value);\n        public void add_object (GLib.Object object);\n        public bool @default ();\n        public unowned Glade.Property dup (Glade.Widget widget);\n        public bool equals ();\n        public bool equals_value (GLib.Value value);\n        public void @get ();\n        public unowned Glade.PropertyClass get_class ();\n        public void get_default (GLib.Value value);\n        public bool get_enabled ();\n        public bool get_save_always ();\n        public bool get_sensitive ();\n        public Glade.PropertyState get_state ();\n        public unowned string get_support_warning ();\n        public void get_va_list (void* vl);\n        public void get_value (GLib.Value value);\n        public unowned Glade.Widget get_widget ();\n        public unowned string i18n_get_comment ();\n        public unowned string i18n_get_context ();\n        public bool i18n_get_translatable ();\n        public void i18n_set_comment (string str);\n        public void i18n_set_context (string str);\n        public void i18n_set_translatable (bool translatable);\n        public GLib.Value inline_value ();\n        public void load ();\n        public unowned string make_string ();\n        public bool original_default ();\n        public void original_reset ();\n        public static void pop_superuser ();\n        public static void push_superuser ();\n        public void read (Glade.Project project, Glade.XmlNode node);\n        public void remove_object (GLib.Object object);\n        public void reset ();\n        public bool @set ();\n        public void set_enabled (bool enabled);\n        public void set_save_always (bool setting);\n        public void set_sensitive (bool sensitive, string reason);\n        public void set_support_warning (bool disable, string reason);\n        public bool set_va_list (void* vl);\n        public bool set_value (GLib.Value value);\n        public void set_widget (Glade.Widget widget);\n        public static bool superuser ();\n        public void sync ();\n        public void write (Glade.XmlContext context, Glade.XmlNode node);\n        public void* @class { get; construct; }\n        public bool enabled { get; set; }\n        [NoAccessorMethod]\n        public string i18n_comment { owned get; set; }\n        [NoAccessorMethod]\n        public string i18n_context { owned get; set; }\n        [NoAccessorMethod]\n        public bool i18n_translatable { get; set; }\n        public bool sensitive { get; set; }\n        public int state { get; }\n        public virtual signal void tooltip_changed (string p0, string p1, string p2);\n        public virtual signal void value_changed (void* p0, void* p1);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", free_function = \"glade_property_class_free\")]\n    [Compact]\n    public class PropertyClass {\n        [CCode (cname = \"glade_property_class_new\", has_construct_function = false)]\n        public PropertyClass (Glade.WidgetAdaptor adaptor, string id);\n        [CCode (cname = \"glade_property_class_atk\")]\n        public bool atk ();\n        [CCode (cname = \"glade_property_class_clone\")]\n        public unowned Glade.PropertyClass clone (bool reset_version);\n        [CCode (cname = \"glade_property_class_common\")]\n        public bool common ();\n        [CCode (cname = \"glade_property_class_compare\")]\n        public int compare (GLib.Value value1, GLib.Value value2);\n        [CCode (cname = \"glade_property_class_create_type\")]\n        public unowned string create_type ();\n        [CCode (cname = \"glade_property_class_custom_layout\")]\n        public bool custom_layout ();\n        [CCode (cname = \"glade_property_class_new_from_spec\", has_construct_function = false)]\n        public PropertyClass.from_spec (Glade.WidgetAdaptor adaptor, GLib.ParamSpec spec);\n        [CCode (cname = \"glade_property_class_new_from_spec_full\", has_construct_function = false)]\n        public PropertyClass.from_spec_full (Glade.WidgetAdaptor adaptor, GLib.ParamSpec spec, bool need_handle);\n        [CCode (cname = \"glade_property_class_get_adaptor\")]\n        public unowned Glade.WidgetAdaptor get_adaptor ();\n        [CCode (cname = \"glade_property_class_get_construct_only\")]\n        public bool get_construct_only ();\n        [CCode (cname = \"glade_property_class_get_default\")]\n        public GLib.Value get_default ();\n        [CCode (cname = \"glade_property_class_get_default_from_spec\")]\n        public static GLib.Value get_default_from_spec (GLib.ParamSpec spec);\n        [CCode (cname = \"glade_property_class_get_from_gvalue\")]\n        public void get_from_gvalue (GLib.Value value);\n        [CCode (cname = \"glade_property_class_get_ignore\")]\n        public bool get_ignore ();\n        [CCode (cname = \"glade_property_class_get_is_packing\")]\n        public bool get_is_packing ();\n        [CCode (cname = \"glade_property_class_get_name\")]\n        public unowned string get_name ();\n        [CCode (cname = \"glade_property_class_get_original_default\")]\n        public GLib.Value get_original_default ();\n        [CCode (cname = \"glade_property_class_get_pspec\")]\n        public unowned GLib.ParamSpec get_pspec ();\n        [CCode (cname = \"glade_property_class_get_tooltip\")]\n        public unowned string get_tooltip ();\n        [CCode (cname = \"glade_property_class_get_virtual\")]\n        public bool get_virtual ();\n        [CCode (cname = \"glade_property_class_id\")]\n        public unowned string id ();\n        [CCode (cname = \"glade_property_class_is_object\")]\n        public bool is_object ();\n        [CCode (cname = \"glade_property_class_is_visible\")]\n        public bool is_visible ();\n        [CCode (cname = \"glade_property_class_load_defaults_from_spec\")]\n        public void load_defaults_from_spec ();\n        [CCode (cname = \"glade_property_class_make_adjustment\")]\n        public unowned Gtk.Adjustment make_adjustment ();\n        [CCode (cname = \"glade_property_class_make_gvalue\")]\n        public GLib.Value make_gvalue ();\n        [CCode (cname = \"glade_property_class_make_gvalue_from_string\")]\n        public GLib.Value make_gvalue_from_string (string str, Glade.Project project);\n        [CCode (cname = \"glade_property_class_make_gvalue_from_vl\")]\n        public GLib.Value make_gvalue_from_vl (void* vl);\n        [CCode (cname = \"glade_property_class_make_string_from_gvalue\")]\n        public unowned string make_string_from_gvalue (GLib.Value value);\n        [CCode (cname = \"glade_property_class_match\")]\n        public bool match (Glade.PropertyClass comp);\n        [CCode (cname = \"glade_property_class_multiline\")]\n        public bool multiline ();\n        [CCode (cname = \"glade_property_class_needs_sync\")]\n        public bool needs_sync ();\n        [CCode (cname = \"glade_property_class_optional\")]\n        public bool optional ();\n        [CCode (cname = \"glade_property_class_optional_default\")]\n        public bool optional_default ();\n        [CCode (cname = \"glade_property_class_parentless_widget\")]\n        public bool parentless_widget ();\n        [CCode (cname = \"glade_property_class_query\")]\n        public bool query ();\n        [CCode (cname = \"glade_property_class_save\")]\n        public bool save ();\n        [CCode (cname = \"glade_property_class_save_always\")]\n        public bool save_always ();\n        [CCode (cname = \"glade_property_class_set_adaptor\")]\n        public void set_adaptor (Glade.WidgetAdaptor adaptor);\n        [CCode (cname = \"glade_property_class_set_construct_only\")]\n        public void set_construct_only (bool construct_only);\n        [CCode (cname = \"glade_property_class_set_ignore\")]\n        public void set_ignore (bool ignore);\n        [CCode (cname = \"glade_property_class_set_is_packing\")]\n        public void set_is_packing (bool is_packing);\n        [CCode (cname = \"glade_property_class_set_name\")]\n        public void set_name (string name);\n        [CCode (cname = \"glade_property_class_set_pspec\")]\n        public void set_pspec (GLib.ParamSpec pspec);\n        [CCode (cname = \"glade_property_class_set_tooltip\")]\n        public void set_tooltip (string tooltip);\n        [CCode (cname = \"glade_property_class_set_virtual\")]\n        public void set_virtual (bool value);\n        [CCode (cname = \"glade_property_class_set_vl_from_gvalue\")]\n        public void set_vl_from_gvalue (GLib.Value value, void* vl);\n        [CCode (cname = \"glade_property_class_set_weights\")]\n        public static void set_weights (GLib.List<Glade.Property> properties, GLib.Type parent);\n        [CCode (cname = \"glade_property_class_since_major\")]\n        public uint16 since_major ();\n        [CCode (cname = \"glade_property_class_since_minor\")]\n        public uint16 since_minor ();\n        [CCode (cname = \"glade_property_class_stock\")]\n        public bool stock ();\n        [CCode (cname = \"glade_property_class_stock_icon\")]\n        public bool stock_icon ();\n        [CCode (cname = \"glade_property_class_themed_icon\")]\n        public bool themed_icon ();\n        [CCode (cname = \"glade_property_class_transfer_on_paste\")]\n        public bool transfer_on_paste ();\n        [CCode (cname = \"glade_property_class_translatable\")]\n        public bool translatable ();\n        [CCode (cname = \"glade_property_class_update_from_node\")]\n        public static bool update_from_node (Glade.XmlNode node, GLib.Type object_type, out unowned Glade.PropertyClass property_class, string domain);\n        [CCode (cname = \"glade_property_class_void_value\")]\n        public bool void_value (GLib.Value value);\n        [CCode (cname = \"glade_property_class_weight\")]\n        public double weight ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class PropertyKlass {\n        public weak GLib.Callback dup;\n        public weak GLib.Callback equals_value;\n        public weak GLib.Callback get_value;\n        public weak GLib.Callback glade_reserved1;\n        public weak GLib.Callback glade_reserved2;\n        public weak GLib.Callback glade_reserved3;\n        public weak GLib.Callback glade_reserved4;\n        public weak GLib.Callback glade_reserved5;\n        public weak GLib.Callback glade_reserved6;\n        public weak GLib.Callback load;\n        public weak GLib.ObjectClass parent_class;\n        public weak GLib.Callback set_value;\n        public weak GLib.Callback sync;\n        public weak GLib.Callback tooltip_changed;\n        public weak GLib.Callback value_changed;\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Signal : GLib.Object {\n        [CCode (has_construct_function = false)]\n        public Signal (Glade.SignalClass sig_class, string handler, string userdata, bool after, bool swapped);\n        public unowned Glade.Signal clone ();\n        public bool equal (Glade.Signal sig2);\n        public bool get_after ();\n        public unowned Glade.SignalClass get_class ();\n        public unowned string get_handler ();\n        public unowned string get_name ();\n        public unowned string get_support_warning ();\n        public bool get_swapped ();\n        public unowned string get_userdata ();\n        public static unowned Glade.Signal read (Glade.XmlNode node, Glade.WidgetAdaptor adaptor);\n        public void set_after (bool after);\n        public void set_handler (string handler);\n        public void set_support_warning (string support_warning);\n        public void set_swapped (bool swapped);\n        public void set_userdata (string userdata);\n        public void write (Glade.XmlContext context, Glade.XmlNode node);\n        public bool after { get; set; }\n        public void* @class { get; construct; }\n        public string handler { get; set; }\n        public string support_warning { get; set; }\n        public bool swapped { get; set; }\n        public string userdata { get; set; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", free_function = \"glade_signal_class_free\")]\n    [Compact]\n    public class SignalClass {\n        [CCode (cname = \"glade_signal_class_new\", has_construct_function = false)]\n        public SignalClass (Glade.WidgetAdaptor adaptor, GLib.Type for_type, uint signal_id);\n        [CCode (cname = \"glade_signal_class_get_adaptor\")]\n        public unowned Glade.WidgetAdaptor get_adaptor ();\n        [CCode (cname = \"glade_signal_class_get_flags\")]\n        public GLib.SignalFlags get_flags ();\n        [CCode (cname = \"glade_signal_class_get_name\")]\n        public unowned string get_name ();\n        [CCode (cname = \"glade_signal_class_set_since\")]\n        public void set_since (uint16 since_major, uint16 since_minor);\n        [CCode (cname = \"glade_signal_class_since_major\")]\n        public uint16 since_major ();\n        [CCode (cname = \"glade_signal_class_since_minor\")]\n        public uint16 since_minor ();\n        [CCode (cname = \"glade_signal_class_update_from_node\")]\n        public void update_from_node (Glade.XmlNode node, string domain);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class SignalEditor : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {\n        [CCode (has_construct_function = false)]\n        public SignalEditor ();\n        public void construct_signals_list ();\n        public void enable_dnd (bool enabled);\n        public unowned Glade.Widget get_widget ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        [NoWrapper]\n        public virtual void glade_reserved5 ();\n        public void load_widget (Glade.Widget widget);\n        [NoAccessorMethod]\n        public Gtk.TreeModel glade_widget { owned get; set; }\n        public virtual signal unowned string[] callback_suggestions (Glade.Signal @signal);\n        public virtual signal void signal_activated (Glade.Signal p0);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class SignalKlass {\n        public weak GLib.Callback glade_reserved1;\n        public weak GLib.Callback glade_reserved2;\n        public weak GLib.Callback glade_reserved3;\n        public weak GLib.Callback glade_reserved4;\n        public weak GLib.ObjectClass object_class;\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class SignalModel : GLib.Object, Gtk.TreeModel, Gtk.TreeDragSource {\n        [CCode (has_construct_function = false, type = \"GtkTreeModel*\")]\n        public SignalModel (Glade.Widget widget, GLib.HashTable signals);\n        public void* signals { construct; }\n        public Glade.Widget widget { construct; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class TargetableVersion {\n        public int major;\n        public int minor;\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class Widget : GLib.InitiallyUnowned {\n        [CCode (has_construct_function = false)]\n        protected Widget ();\n        public virtual void add_child (Glade.Widget child, bool at_mouse);\n        public void add_prop_ref (Glade.Property property);\n        public bool add_verify (Glade.Widget child, bool user_feedback);\n        public void child_get_property (Glade.Widget child, string property_name, GLib.Value value);\n        public void child_set_property (Glade.Widget child, string property_name, GLib.Value value);\n        public void copy_properties (Glade.Widget template_widget, bool copy_parentless, bool exact);\n        public void copy_signals (Glade.Widget template_widget);\n        public unowned Glade.EditorProperty create_editor_property (string property, bool packing, bool use_command);\n        public unowned Glade.Widget dup (bool exact);\n        public unowned GLib.List<Glade.Property> dup_properties (GLib.List<Glade.Property> template_props, bool as_load, bool copy_parentless, bool exact);\n        public virtual bool event (Gdk.Event event);\n        public unowned Glade.Widget find_child (string name);\n        public unowned string generate_path_name ();\n        public unowned Glade.WidgetAction get_action (string action_path);\n        public unowned GLib.List<Glade.WidgetAction> get_actions ();\n        public unowned Glade.WidgetAdaptor get_adaptor ();\n        public unowned GLib.List<Glade.Widget> get_children ();\n        public static unowned Glade.Widget get_from_gobject (void* object);\n        public unowned string get_internal ();\n        public unowned Glade.Widget get_locker ();\n        public unowned string get_name ();\n        public unowned GLib.Object get_object ();\n        public unowned Glade.WidgetAction get_pack_action (string action_path);\n        public unowned GLib.List<Glade.WidgetAction> get_pack_actions ();\n        public unowned Glade.Property get_pack_property (string id_property);\n        public unowned GLib.List<Glade.Property> get_packing_properties ();\n        public unowned Glade.Widget get_parent ();\n        public unowned GLib.List<Glade.Widget> get_parentless_reffed_widgets ();\n        public unowned Glade.Property get_parentless_widget_ref ();\n        public unowned Glade.Project get_project ();\n        public unowned GLib.List<Glade.Property> get_properties ();\n        public unowned Glade.Property get_property (string id_property);\n        public unowned GLib.List<Glade.Signal> get_signal_list ();\n        public unowned Gtk.TreeModel get_signal_model ();\n        public unowned Glade.Widget get_toplevel ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        [NoWrapper]\n        public virtual void glade_reserved5 ();\n        [NoWrapper]\n        public virtual void glade_reserved6 ();\n        [NoWrapper]\n        public virtual void glade_reserved7 ();\n        [NoWrapper]\n        public virtual void glade_reserved8 ();\n        public bool has_decendant (GLib.Type type);\n        public void hide ();\n        public bool in_project ();\n        public bool is_ancestor (Glade.Widget ancestor);\n        public unowned GLib.List<Glade.Widget> list_locked_widgets ();\n        public unowned GLib.List list_prop_refs ();\n        public unowned GLib.PtrArray list_signal_handlers (string signal_name);\n        public void @lock (Glade.Widget locked);\n        public void object_get_property (string property_name, GLib.Value value);\n        public void object_set_property (string property_name, GLib.Value value);\n        public bool pack_property_default (string id_property);\n        public bool pack_property_get (string id_property);\n        public bool pack_property_reset (string id_property);\n        public bool pack_property_set (string id_property);\n        public bool pack_property_set_enabled (string id_property, bool enabled);\n        public bool pack_property_set_save_always (string id_property, bool setting);\n        public bool pack_property_set_sensitive (string id_property, bool sensitive, string reason);\n        public unowned string pack_property_string (string id_property, GLib.Value value);\n        public bool placeholder_relation (Glade.Widget widget);\n        public static void pop_superuser ();\n        public bool property_default (string id_property);\n        public bool property_get (string id_property);\n        public bool property_original_default (string id_property);\n        public bool property_reset (string id_property);\n        public bool property_set (string id_property);\n        public bool property_set_enabled (string id_property, bool enabled);\n        public bool property_set_save_always (string id_property, bool setting);\n        public bool property_set_sensitive (string id_property, bool sensitive, string reason);\n        public unowned string property_string (string id_property, GLib.Value value);\n        public static void push_superuser ();\n        public static unowned Glade.Widget read (Glade.Project project, Glade.Widget parent, Glade.XmlNode node, string @internal);\n        public void read_child (Glade.XmlNode node);\n        public void rebuild ();\n        public virtual void remove_child (Glade.Widget child);\n        public void remove_prop_ref (Glade.Property property);\n        public void remove_property (string id_property);\n        public void replace (GLib.Object old_object, GLib.Object new_object);\n        [NoWrapper]\n        public virtual void replace_child (GLib.Object p2, GLib.Object p3);\n        public bool set_action_sensitive (string action_path, bool sensitive);\n        public bool set_action_visible (string action_path, bool sensitive);\n        public void set_child_type_from_node (GLib.Object child, Glade.XmlNode node);\n        public void set_in_project (bool in_project);\n        public void set_internal (string @internal);\n        public void set_name (string name);\n        public bool set_pack_action_sensitive (string action_path, bool sensitive);\n        public bool set_pack_action_visible (string action_path, bool sensitive);\n        public void set_packing_properties (Glade.Widget container);\n        public void set_parent (Glade.Widget parent);\n        public void set_project (Glade.Project project);\n        public void set_support_warning (string warning);\n        public void show ();\n        public static bool superuser ();\n        public void unlock ();\n        public void write (Glade.XmlContext context, Glade.XmlNode node);\n        public void write_child (Glade.Widget child, Glade.XmlContext context, Glade.XmlNode node);\n        public void write_placeholder (GLib.Object object, Glade.XmlContext context, Glade.XmlNode node);\n        public void write_signals (Glade.XmlContext context, Glade.XmlNode node);\n        public void write_special_child_prop (GLib.Object object, Glade.XmlContext context, Glade.XmlNode node);\n        public Glade.GObjectAdaptor adaptor { get; construct; }\n        [NoAccessorMethod]\n        public bool anarchist { get; construct; }\n        public string @internal { get; set construct; }\n        public string internal_name { construct; }\n        public string name { get; set construct; }\n        [NoAccessorMethod]\n        public GLib.Object object { owned get; set construct; }\n        public Glade.Widget parent { get; set construct; }\n        public Glade.Project project { get; set construct; }\n        public void* properties { get; construct; }\n        [NoAccessorMethod]\n        public int reason { get; construct; }\n        [NoAccessorMethod]\n        public string support_warning { owned get; }\n        public Glade.Widget template { construct; }\n        public bool template_exact { construct; }\n        [NoAccessorMethod]\n        public int toplevel_height { get; set; }\n        [NoAccessorMethod]\n        public int toplevel_width { get; set; }\n        [NoAccessorMethod]\n        public bool visible { get; }\n        public virtual signal void add_signal_handler (Glade.Signal p0);\n        public virtual signal bool button_press_event (Gdk.Event p0);\n        public virtual signal bool button_release_event (Gdk.Event p0);\n        public virtual signal void change_signal_handler (Glade.Signal p0);\n        public virtual signal bool motion_notify_event (Gdk.Event p0);\n        public virtual signal void remove_signal_handler (Glade.Signal p0);\n        public virtual signal void support_changed ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public class WidgetAction : GLib.Object {\n        [CCode (has_construct_function = false)]\n        protected WidgetAction ();\n        public static unowned Glade.WidgetActionClass class_new (string path);\n        [CCode (cname = \"glade_widget_action_class_clone\")]\n        public class unowned Glade.WidgetActionClass clone ();\n        [CCode (cname = \"glade_widget_action_class_free\")]\n        public class void free ();\n        public unowned GLib.List<Glade.WidgetAction> get_children ();\n        public unowned Glade.WidgetActionClass get_class ();\n        public bool get_sensitive ();\n        public bool get_visible ();\n        [NoWrapper]\n        public virtual void glade_reserved1 ();\n        [NoWrapper]\n        public virtual void glade_reserved2 ();\n        [NoWrapper]\n        public virtual void glade_reserved3 ();\n        [NoWrapper]\n        public virtual void glade_reserved4 ();\n        [CCode (cname = \"glade_widget_action_class_set_important\")]\n        public class void set_important (bool important);\n        [CCode (cname = \"glade_widget_action_class_set_label\")]\n        public class void set_label (string label);\n        public void set_sensitive (bool sensitive);\n        [CCode (cname = \"glade_widget_action_class_set_stock\")]\n        public class void set_stock (string stock);\n        public void set_visible (bool visible);\n        public void* @class { construct; }\n        public bool sensitive { get; set; }\n        public bool visible { get; set; }\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class WidgetActionClass {\n        public weak GLib.List<Glade.WidgetAction> actions;\n        public weak string id;\n        public bool important;\n        public weak string label;\n        public weak string path;\n        public weak string stock;\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class WidgetAdaptor {\n        public weak GLib.Object parent_instance;\n        public weak Glade.WidgetAdaptorClass priv;\n        public void action_activate (GLib.Object object, string action_path);\n        public bool action_add (string action_path, string label, string stock, bool important);\n        public bool action_remove (string action_path);\n        public unowned Gtk.Widget action_submenu (GLib.Object object, string action_path);\n        public unowned GLib.List<Glade.WidgetAction> actions_new ();\n        public void add (GLib.Object container, GLib.Object child);\n        public bool add_verify (GLib.Object container, GLib.Object child, bool user_feedback);\n        public void child_action_activate (GLib.Object container, GLib.Object object, string action_path);\n        public void child_get_property (GLib.Object container, GLib.Object child, string property_name, GLib.Value value);\n        public void child_set_property (GLib.Object container, GLib.Object child, string property_name, GLib.Value value);\n        public bool child_verify_property (GLib.Object container, GLib.Object child, string property_name, GLib.Value value);\n        public unowned GLib.Object construct_object (uint n_parameters, GLib.Parameter parameters);\n        public unowned Glade.Editable create_editable (Glade.EditorPageType type);\n        public unowned Glade.EditorProperty create_eprop (Glade.PropertyClass klass, bool use_command);\n        public unowned Glade.EditorProperty create_eprop_by_name (string property_id, bool packing, bool use_command);\n        public static unowned Glade.Widget create_internal (Glade.Widget parent, GLib.Object internal_object, string internal_name, string parent_name, bool anarchist, Glade.CreateReason reason);\n        public static unowned Glade.Widget create_widget_real (bool query, ...);\n        public GLib.Parameter default_params (bool @construct, uint n_params);\n        public bool depends (Glade.Widget widget, Glade.Widget another);\n        public static unowned Glade.WidgetAdaptor from_catalog (Glade.Catalog catalog, Glade.XmlNode class_node, GLib.Module module);\n        public unowned Glade.WidgetAdaptor from_pspec (GLib.ParamSpec spec);\n        public static unowned Glade.WidgetAdaptor get_by_name (string name);\n        public static unowned Glade.WidgetAdaptor get_by_type (GLib.Type type);\n        public unowned GLib.List<Glade.WidgetAdaptor> get_children (GLib.Object container);\n        public unowned string get_generic_name ();\n        public unowned string get_icon_name ();\n        public unowned GLib.Object get_internal_child (GLib.Object object, string internal_name);\n        public unowned string get_missing_icon ();\n        public unowned string get_name ();\n        public GLib.Type get_object_type ();\n        public unowned Glade.PropertyClass get_pack_property_class (string name);\n        public unowned string get_packing_default (Glade.WidgetAdaptor container_adaptor, string id);\n        public unowned GLib.List<Glade.Property> get_packing_props ();\n        public unowned Glade.WidgetAdaptor get_parent_adaptor ();\n        public unowned GLib.List<Glade.Property> get_properties ();\n        public void get_property (GLib.Object object, string property_name, GLib.Value value);\n        public unowned Glade.PropertyClass get_property_class (string name);\n        public unowned Glade.SignalClass get_signal_class (string name);\n        public unowned GLib.List<Glade.Signal> get_signals ();\n        public unowned string get_title ();\n        public bool has_child (GLib.Object container, GLib.Object child);\n        public bool has_internal_children ();\n        public bool is_container ();\n        public static unowned GLib.List<Glade.WidgetAdaptor> list_adaptors ();\n        public bool pack_action_add (string action_path, string label, string stock, bool important);\n        public bool pack_action_remove (string action_path);\n        public unowned GLib.List<Glade.WidgetAction> pack_actions_new ();\n        public void post_create (GLib.Object object, Glade.CreateReason reason);\n        public bool query ();\n        public void read_child (Glade.Widget widget, Glade.XmlNode node);\n        public void read_widget (Glade.Widget widget, Glade.XmlNode node);\n        public void register ();\n        public void remove (GLib.Object container, GLib.Object child);\n        public void replace_child (GLib.Object container, GLib.Object old_obj, GLib.Object new_obj);\n        public void set_property (GLib.Object object, string property_name, GLib.Value value);\n        public unowned string string_from_value (Glade.PropertyClass klass, GLib.Value value);\n        public bool verify_property (GLib.Object object, string property_name, GLib.Value value);\n        public void write_child (Glade.Widget widget, Glade.XmlContext context, Glade.XmlNode node);\n        public void write_widget (Glade.Widget widget, Glade.XmlContext context, Glade.XmlNode node);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class WidgetAdaptorClass {\n        public weak Glade.ActionActivateFunc action_activate;\n        public weak Glade.ActionSubmenuFunc action_submenu;\n        public weak Glade.AddChildFunc add;\n        public weak Glade.AddChildVerifyFunc add_verify;\n        public weak Glade.ChildActionActivateFunc child_action_activate;\n        public weak Glade.ChildGetPropertyFunc child_get_property;\n        public weak Glade.ChildSetPropertyFunc child_set_property;\n        public weak Glade.ChildVerifyPropertyFunc child_verify_property;\n        public weak Glade.ConstructObjectFunc construct_object;\n        public weak Glade.CreateEditableFunc create_editable;\n        public weak Glade.CreateEPropFunc create_eprop;\n        public weak Glade.CreateWidgetFunc create_widget;\n        public weak Glade.PostCreateFunc deep_post_create;\n        public int16 default_height;\n        public int16 default_width;\n        public weak Glade.DependsFunc depends;\n        public uint deprecated;\n        public weak Glade.GetChildrenFunc get_children;\n        public weak Glade.GetInternalFunc get_internal_child;\n        public weak Glade.GetPropertyFunc get_property;\n        public weak GLib.Callback glade_reserved1;\n        public weak GLib.Callback glade_reserved2;\n        public weak GLib.Callback glade_reserved3;\n        public weak GLib.Callback glade_reserved4;\n        public weak GLib.Callback glade_reserved5;\n        public weak GLib.Callback glade_reserved6;\n        public weak GLib.Callback glade_reserved7;\n        public weak GLib.Callback glade_reserved8;\n        public weak GLib.ObjectClass parent_class;\n        public weak Glade.PostCreateFunc post_create;\n        public weak Glade.ReadWidgetFunc read_child;\n        public weak Glade.ReadWidgetFunc read_widget;\n        public weak Glade.RemoveChildFunc remove;\n        public weak Glade.ReplaceChildFunc replace_child;\n        public weak Glade.SetPropertyFunc set_property;\n        public weak Glade.StringFromValueFunc string_from_value;\n        public uint toplevel;\n        public uint use_placeholders;\n        public weak Glade.VerifyPropertyFunc verify_property;\n        public uint16 version_since_major;\n        public uint16 version_since_minor;\n        public weak Glade.WriteWidgetFunc write_child;\n        public weak Glade.WriteWidgetFunc write_widget;\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class WidgetGroup {\n        public unowned GLib.List<Glade.WidgetAdaptor> get_adaptors ();\n        public bool get_expanded ();\n        public unowned string get_name ();\n        public unowned string get_title ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", free_function = \"glade_xml_context_destroy\")]\n    [Compact]\n    public class XmlContext {\n        [CCode (has_construct_function = false)]\n        public XmlContext (Glade.XmlDoc doc, string name_space);\n        public void free ();\n        [CCode (has_construct_function = false)]\n        public XmlContext.from_path (string full_path, string nspace, string root_name);\n        public unowned Glade.XmlDoc get_doc ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    [Compact]\n    public class XmlDoc {\n        [CCode (has_construct_function = false)]\n        public XmlDoc ();\n        public unowned Glade.XmlNode get_root ();\n        public int save (string full_path);\n        public void set_root (Glade.XmlNode node);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", copy_function = \"glade_xml_node_copy\")]\n    [Compact]\n    public class XmlNode {\n        [CCode (has_construct_function = false)]\n        public XmlNode (Glade.XmlContext context, string name);\n        public void append_child (Glade.XmlNode child);\n        [CCode (has_construct_function = false)]\n        public XmlNode.comment (Glade.XmlContext context, string comment);\n        public unowned Glade.XmlNode copy ();\n        public void @delete ();\n        public unowned Glade.XmlNode get_children ();\n        public unowned Glade.XmlNode get_children_with_comments ();\n        public unowned string get_name ();\n        public unowned Glade.XmlNode get_parent ();\n        public bool is_comment ();\n        public unowned Glade.XmlNode next ();\n        public unowned Glade.XmlNode next_with_comments ();\n        public void remove ();\n        public void set_property_boolean (string name, bool value);\n        public void set_property_string (string name, string str);\n        public bool verify (string name);\n        public bool verify_silent (string name);\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public interface Editable : Gtk.Widget {\n        public void block ();\n        public abstract void load (Glade.Widget widget);\n        public unowned Glade.Widget loaded_widget ();\n        public bool loading ();\n        public abstract void set_show_name (bool show_name);\n        public void unblock ();\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_CREATE_\")]\n    public enum CreateReason {\n        USER,\n        COPY,\n        LOAD,\n        REBUILD\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_CURSOR_\", has_type_id = false)]\n    public enum CursorType {\n        SELECTOR,\n        ADD_WIDGET,\n        RESIZE_TOP_LEFT,\n        RESIZE_TOP_RIGHT,\n        RESIZE_BOTTOM_LEFT,\n        RESIZE_BOTTOM_RIGHT,\n        RESIZE_LEFT,\n        RESIZE_RIGHT,\n        RESIZE_TOP,\n        RESIZE_BOTTOM,\n        DRAG\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_PAGE_\", has_type_id = false)]\n    public enum EditorPageType {\n        GENERAL,\n        COMMON,\n        PACKING,\n        ATK,\n        QUERY\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_ITEM_\")]\n    public enum ItemAppearance {\n        ICON_AND_LABEL,\n        ICON_ONLY,\n        LABEL_ONLY\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"\")]\n    public enum PointerMode {\n        select,\n        add,\n        drag_resize,\n        margin_edit,\n        align_edit\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_PROJECT_MODEL_\", has_type_id = false)]\n    public enum ProjectModelColumns {\n        COLUMN_ICON_NAME,\n        COLUMN_NAME,\n        COLUMN_TYPE_NAME,\n        COLUMN_OBJECT,\n        COLUMN_MISC,\n        N_COLUMNS\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_STATE_\", has_type_id = false)]\n    public enum PropertyState {\n        NORMAL,\n        CHANGED,\n        UNSUPPORTED,\n        SUPPORT_DISABLED\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_SIGNAL_\", has_type_id = false)]\n    public enum SignalModelColumns {\n        COLUMN_NAME,\n        COLUMN_SHOW_NAME,\n        COLUMN_HANDLER,\n        COLUMN_OBJECT,\n        COLUMN_SWAP,\n        COLUMN_AFTER,\n        COLUMN_TOOLTIP,\n        COLUMN_SIGNAL,\n        N_COLUMNS\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"\")]\n    public enum Stock {\n        About,\n        Add,\n        Apply,\n        Ascending,\n        Back,\n        BestFit,\n        Bold,\n        _Bottom,\n        CDROM,\n        Cancel,\n        Center,\n        Clear,\n        Close,\n        Color,\n        Connect,\n        Convert,\n        Copy,\n        Cut,\n        DecreaseIndent,\n        Delete,\n        Descending,\n        Discard,\n        Disconnect,\n        Down,\n        Edit,\n        Error,\n        Execute,\n        File,\n        Fill,\n        Find,\n        FindandReplace,\n        First,\n        Floppy,\n        Font,\n        Forward,\n        Fullscreen,\n        HardDisk,\n        Help,\n        Home,\n        IncreaseIndent,\n        Index,\n        Information,\n        Italic,\n        Jumpto,\n        Landscape,\n        Last,\n        LeaveFullscreen,\n        Left,\n        Network,\n        New,\n        Next,\n        No,\n        NormalSize,\n        OK,\n        Open,\n        PageSetup,\n        Paste,\n        Pause,\n        Play,\n        Portrait,\n        Preferences,\n        Previous,\n        Print,\n        PrintPreview,\n        Properties,\n        Question,\n        Quit,\n        Record,\n        Redo,\n        Refresh,\n        Remove,\n        Reverselandscape,\n        Reverseportrait,\n        Revert,\n        Rewind,\n        Right,\n        Save,\n        SaveAs,\n        SelectAll,\n        SpellCheck,\n        Stop,\n        Strikethrough,\n        Top,\n        Undelete,\n        Underline,\n        Undo,\n        Up,\n        Warning,\n        Yes,\n        ZoomIn,\n        ZoomOut\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"\")]\n    public enum StockImage {\n        About,\n        Add,\n        Apply,\n        Ascending,\n        Back,\n        BestFit,\n        Bold,\n        Bottom,\n        CDROM,\n        Cancel,\n        Center,\n        Clear,\n        Close,\n        Color,\n        Connect,\n        Convert,\n        Copy,\n        Cut,\n        DecreaseIndent,\n        Delete,\n        Descending,\n        Discard,\n        Disconnect,\n        Down,\n        Edit,\n        Error,\n        Execute,\n        File,\n        Fill,\n        Find,\n        FindandReplace,\n        First,\n        Floppy,\n        Font,\n        Forward,\n        Fullscreen,\n        HardDisk,\n        Help,\n        Home,\n        IncreaseIndent,\n        Index,\n        Information,\n        Italic,\n        Jumpto,\n        Landscape,\n        Last,\n        LeaveFullscreen,\n        Left,\n        Network,\n        New,\n        Next,\n        No,\n        NormalSize,\n        OK,\n        Open,\n        PageSetup,\n        Paste,\n        Pause,\n        Play,\n        Portrait,\n        Preferences,\n        Previous,\n        Print,\n        PrintPreview,\n        Properties,\n        Question,\n        Quit,\n        Record,\n        Redo,\n        Refresh,\n        Remove,\n        Reverselandscape,\n        Reverseportrait,\n        Revert,\n        Rewind,\n        Right,\n        Save,\n        SaveAs,\n        SelectAll,\n        SpellCheck,\n        Stop,\n        Strikethrough,\n        Top,\n        Undelete,\n        Underline,\n        Undo,\n        Up,\n        Warning,\n        Yes,\n        ZoomIn,\n        ZoomOut,\n        gtk_color_picker,\n        gtk_dialog_authentication,\n        gtk_directory,\n        gtk_dnd,\n        gtk_dnd_multiple,\n        gtk_file,\n        gtk_missing_image\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_SUPPORT_\", has_type_id = false)]\n    public enum SupportMask {\n        OK,\n        DEPRECATED,\n        MISMATCH\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_UI_\", has_type_id = false)]\n    public enum UIMessageType {\n        INFO,\n        WARN,\n        ERROR,\n        ARE_YOU_SURE,\n        YES_OR_NO\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", cprefix = \"GLADE_FILE_DIALOG_ACTION_\", has_type_id = false)]\n    public enum UtilFileDialogType {\n        OPEN,\n        SAVE\n    }\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void ActionActivateFunc (Glade.WidgetAdaptor adaptor, GLib.Object object, string action_path);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned Gtk.Widget ActionSubmenuFunc (Glade.WidgetAdaptor adaptor, GLib.Object object, string action_path);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void AddChildFunc (Glade.WidgetAdaptor adaptor, GLib.Object parent, GLib.Object child);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate bool AddChildVerifyFunc (Glade.WidgetAdaptor adaptor, GLib.Object parent, GLib.Object child, bool user_feedback);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void CatalogInitFunc (string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void ChildActionActivateFunc (Glade.WidgetAdaptor adaptor, GLib.Object container, GLib.Object object, string action_path);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void ChildGetPropertyFunc (Glade.WidgetAdaptor adaptor, GLib.Object container, GLib.Object child, string property_name, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void ChildSetPropertyFunc (Glade.WidgetAdaptor adaptor, GLib.Object container, GLib.Object child, string property_name, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate bool ChildVerifyPropertyFunc (Glade.WidgetAdaptor adaptor, GLib.Object container, GLib.Object child, string property_name, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned GLib.Object ConstructObjectFunc (Glade.WidgetAdaptor adaptor, uint n_parameters, GLib.Parameter parameters);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned Glade.EditorProperty CreateEPropFunc (Glade.WidgetAdaptor adaptor, Glade.PropertyClass klass, bool use_command);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned Glade.Editable CreateEditableFunc (Glade.WidgetAdaptor adaptor, Glade.EditorPageType type);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned Glade.Widget CreateWidgetFunc (Glade.WidgetAdaptor adaptor, string first_property_name, void* var_args);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate bool DependsFunc (Glade.WidgetAdaptor adaptor, Glade.Widget widget, Glade.Widget another);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned GLib.List<Glade.WidgetAdaptor> GetChildrenFunc (Glade.WidgetAdaptor adaptor, GLib.Object container);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned GLib.Object GetInternalFunc (Glade.WidgetAdaptor adaptor, GLib.Object parent, string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void GetPropertyFunc (Glade.WidgetAdaptor adaptor, GLib.Object object, string property_name, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void PostCreateFunc (Glade.WidgetAdaptor adaptor, GLib.Object object, Glade.CreateReason reason);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void ReadWidgetFunc (Glade.WidgetAdaptor adaptor, Glade.Widget widget, Glade.XmlNode node);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void RemoveChildFunc (Glade.WidgetAdaptor adaptor, GLib.Object parent, GLib.Object child);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void ReplaceChildFunc (Glade.WidgetAdaptor adaptor, GLib.Object container, GLib.Object old_obj, GLib.Object new_obj);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void SetPropertyFunc (Glade.WidgetAdaptor adaptor, GLib.Object object, string property_name, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate unowned string StringFromValueFunc (Glade.WidgetAdaptor adaptor, Glade.PropertyClass klass, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate bool VerifyPropertyFunc (Glade.WidgetAdaptor adaptor, GLib.Object object, string property_name, GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\", has_target = false)]\n    public delegate void WriteWidgetFunc (Glade.WidgetAdaptor adaptor, Glade.Widget widget, Glade.XmlContext context, Glade.XmlNode node);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string DEVHELP_FALLBACK_ICON_FILE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string DEVHELP_ICON_NAME;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string ENV_CATALOG_PATH;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string ENV_MODULE_PATH;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string GPC_OBJECT_DELIMITER;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const int GPC_PROPERTY_NAMELEN;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const int GTKBUILDER_VERSIONING_BASE_MAJOR;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const int GTKBUILDER_VERSIONING_BASE_MINOR;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ACTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ACTIONS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ACTION_ACTIVATE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ACTION_SUBMENU_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ADAPTOR;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ADD_CHILD_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ADD_CHILD_VERIFY_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ANARCHIST;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ATK_PROPERTY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_BOOK;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_BUILDER_SINCE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CHILD_ACTION_ACTIVATE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CHILD_GET_PROP_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CHILD_PROPERTY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CHILD_SET_PROP_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CHILD_VERIFY_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_COMMENT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_COMMON;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CONSTRUCTOR_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CONSTRUCT_OBJECT_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CONSTRUCT_ONLY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CONTEXT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CREATE_EDITABLE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CREATE_EPROP_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CREATE_TYPE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CREATE_WIDGET_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_CUSTOM_LAYOUT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEEP_POST_CREATE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEFAULT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEFAULT_HEIGHT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEFAULT_PALETTE_STATE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEFAULT_WIDTH;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEPENDS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEPENDS_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DEPRECATED;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DISABLED;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DISPLAYABLE_VALUES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_DOMAIN;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_EDITABLE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_EVENT_HANDLER_CONNECTED;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_EXPANDED;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_FALSE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GENERIC_NAME;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GET_CHILDREN_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GET_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GET_INTERNAL_CHILD_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GET_TYPE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GLADE_CATALOG;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GLADE_WIDGET_CLASS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GLADE_WIDGET_CLASSES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GLADE_WIDGET_CLASS_REF;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_GLADE_WIDGET_GROUP;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_HAS_CONTEXT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ICON_NAME;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ICON_PREFIX;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_ID;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_IGNORE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_IMPORTANT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_INIT_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_INTERNAL_CHILDREN;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_KEY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_LIBRARY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_MAX_VALUE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_MIN_VALUE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_MULTILINE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_NAME;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_NEEDS_SYNC;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_NICK;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_NO;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_OPTIONAL;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_OPTIONAL_DEFAULT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PACKING_ACTIONS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PACKING_DEFAULTS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PACKING_PROPERTIES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PARENT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PARENTLESS_WIDGET;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PARENT_CLASS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_POST_CREATE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PROPERTIES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_PROPERTY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_QUERY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_READ_CHILD_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_READ_WIDGET_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_REMOVE_CHILD_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_REPLACE_CHILD_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_RESOURCE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SAVE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SAVE_ALWAYS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SET_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SIGNAL;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SIGNALS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SPEC;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SPECIAL_CHILD_TYPE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_SPECIFICATIONS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_STOCK;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_STOCK_ICON;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_STRING_FROM_VALUE_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TARGETABLE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_THEMED_ICON;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TITLE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TOOLTIP;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TOPLEVEL;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TRANSFER_ON_PASTE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TRANSLATABLE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TRUE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_TYPE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_USE_PLACEHOLDERS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_VALUE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_VALUE_TYPE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_VERIFY_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_VERSION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_VERSION_SINCE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_VISIBLE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_WEIGHT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_WRITE_CHILD_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_WRITE_WIDGET_FUNCTION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string TAG_YES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_AFTER;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_CHILD;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_CLASS;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_FILENAME;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_HANDLER;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_I18N_TRUE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_ID;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_INTERNAL_CHILD;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_LIB;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_NAME;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_OBJECT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_PACKING;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_PLACEHOLDER;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_PROJECT;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_PROPERTY;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_REQUIRES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_SIGNAL;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_SIGNAL_FALSE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_SIGNAL_TRUE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_SOURCE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_SOURCES;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_STOCK_ID;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_SWAPPED;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_TYPE;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_VERSION;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public const string XML_TAG_WIDGET;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string get_displayable_value (GLib.Type type, string value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string get_value_from_displayable (GLib.Type type, string displayabe);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static GLib.Type param_objects_get_type ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec param_spec_objects (string name, string nick, string blurb, GLib.Type accepted_type, GLib.ParamFlags flags);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string propert_get_insensitive_tooltip (Glade.Property property);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void register_displayable_value (GLib.Type type, string value, string domain, string str);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void register_translated_value (GLib.Type type, string value, string str);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void setup_log_handlers ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_boolean_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_float_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_gdkcolor_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_int_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_objects_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_pixbuf_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void standard_stock_append_prefix (string prefix);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_stock_image_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_stock_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_string_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_strv_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec standard_uint_spec ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool type_has_displayable_values (GLib.Type type);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.List util_added_in_list (GLib.List old_list, GLib.List new_list);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string util_canonical_path (string path);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool util_check_and_warn_scrollable (Glade.Widget parent, Glade.WidgetAdaptor child_adaptor, Gtk.Widget parent_widget);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static int util_compare_stock_labels (void* a, void* b);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.List util_container_get_all_children (Gtk.Container container);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static int util_count_placeholders (Glade.Widget parent);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string util_duplicate_underscores (string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned Gtk.Widget util_file_dialog_new (string title, Glade.Project project, Gtk.Window parent, Glade.UtilFileDialogType action);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool util_file_is_writeable (string path);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string util_filename_to_icon_name (string value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static Gtk.TreeIter util_find_iter_by_widget (Gtk.TreeModel model, Glade.Widget findme, int column);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void util_flash_message (Gtk.Widget statusbar, uint context_id, string format);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned Gtk.Widget util_get_devhelp_icon (Gtk.IconSize size);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static ulong util_get_file_mtime (string filename) throws GLib.Error;\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned Gtk.Widget util_get_placeholder_from_pointer (Gtk.Container container);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static GLib.Type util_get_type_from_name (string name, bool have_func);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool util_have_devhelp ();\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string util_icon_name_to_filename (string value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.Module util_load_library (string library_name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool util_object_is_loading (GLib.Object object);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.List util_purify_list (GLib.List list);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string util_read_prop_name (string str);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.List util_removed_from_list (GLib.List old_list, GLib.List new_list);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void util_replace (string str, char a, char b);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void util_search_devhelp (string book, string page, string search);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool util_ui_message (Gtk.Widget parent, Glade.UIMessageType type, Gtk.Widget widget, string format);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool util_url_show (string url);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void utils_cairo_draw_line (Cairo.Context cr, Gdk.Color color, int x1, int y1, int x2, int y2);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void utils_cairo_draw_rectangle (Cairo.Context cr, Gdk.Color color, bool filled, int x, int y, int width, int height);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string utils_enum_string_from_value (GLib.Type enum_type, int value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string utils_enum_string_from_value_displayable (GLib.Type flags_type, int value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static int utils_enum_value_from_string (GLib.Type enum_type, string strval);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string utils_flags_string_from_value (GLib.Type enum_type, int value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string utils_flags_string_from_value_displayable (GLib.Type flags_type, int value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static int utils_flags_value_from_string (GLib.Type enum_type, string strval);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.ParamSpec utils_get_pspec_from_funcname (string funcname);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static int utils_hijack_key_press (Gtk.Window win, Gdk.EventKey event);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned Gtk.ListStore utils_liststore_from_enum_type (GLib.Type enum_type, bool include_empty);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string utils_replace_home_dir_with_tilde (string path);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string utils_string_from_value (GLib.Value value);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static GLib.Value utils_value_from_string (GLib.Type type, string str, Glade.Project project);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string xml_dump_from_context (Glade.XmlContext context);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool xml_get_boolean (Glade.XmlNode node, string name, bool _default);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string xml_get_content (Glade.XmlNode node_in);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool xml_get_property_boolean (Glade.XmlNode node_in, string name, bool _default);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static double xml_get_property_double (Glade.XmlNode node_in, string name, double _default);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static int xml_get_property_int (Glade.XmlNode node_in, string name, int _default);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string xml_get_property_string (Glade.XmlNode node_in, string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string xml_get_property_string_required (Glade.XmlNode node_in, string name, string xtra);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned GLib.List xml_get_property_targetable_versions (Glade.XmlNode node_in, string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool xml_get_property_version (Glade.XmlNode node_in, string name, uint16 major, uint16 minor);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool xml_get_value_int (Glade.XmlNode node_in, string name, int val);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool xml_get_value_int_required (Glade.XmlNode node, string name, int val);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string xml_get_value_string (Glade.XmlNode node, string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned string xml_get_value_string_required (Glade.XmlNode node, string name, string xtra_info);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static bool xml_load_sym_from_node (Glade.XmlNode node_in, GLib.Module module, string tagname, void* sym_location);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned Glade.XmlNode xml_search_child (Glade.XmlNode node, string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static unowned Glade.XmlNode xml_search_child_required (Glade.XmlNode tree, string name);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void xml_set_content (Glade.XmlNode node_in, string content);\n    [CCode (cheader_filename = \"gladeui/glade.h\")]\n    public static void xml_set_value (Glade.XmlNode node_in, string name, string val);\n}\n"
  },
  {
    "path": "vapi/glib-2.0.vapi",
    "content": "/* glib-2.0.vala\n *\n * Copyright (C) 2006-2014  Jürg Billeter\n * Copyright (C) 2006-2008  Raffaele Sandrini\n * Copyright (C) 2007  Mathias Hasselmann\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n *\n * As a special exception, if you use inline functions from this file, this\n * file does not by itself cause the resulting executable to be covered by\n * the GNU Lesser General Public License.\n *\n * Author:\n * \tJürg Billeter <j@bitron.ch>\n *\tRaffaele Sandrini <rasa@gmx.ch>\n *\tMathias Hasselmann <mathias.hasselmann@gmx.de>\n */\n\n[SimpleType]\n[GIR (name = \"gboolean\")]\n[CCode (cname = \"gboolean\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_BOOLEAN\", marshaller_type_name = \"BOOLEAN\", get_value_function = \"g_value_get_boolean\", set_value_function = \"g_value_set_boolean\", default_value = \"FALSE\", type_signature = \"b\")]\n[BooleanType]\npublic struct bool {\n\tpublic string to_string () {\n\t\tif (this) {\n\t\t\treturn \"true\";\n\t\t} else {\n\t\t\treturn \"false\";\n\t\t}\n\t}\n\n\tpublic static bool parse (string str) {\n\t\tif (str == \"true\") {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\tpublic static bool try_parse (string str, out bool result = null) {\n\t\tif (str == \"true\") {\n\t\t\tresult = true;\n\t\t\treturn true;\n\t\t} else if (str == \"false\") {\n\t\t\tresult = false;\n\t\t\treturn true;\n\t\t} else {\n\t\t\tresult = false;\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n[SimpleType]\n[GIR (name = \"gint8\")]\n[CCode (cname = \"gchar\", cprefix = \"g_ascii_\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_CHAR\", marshaller_type_name = \"CHAR\", get_value_function = \"g_value_get_char\", set_value_function = \"g_value_set_char\", default_value = \"\\'\\\\0\\'\", type_signature = \"y\")]\n[IntegerType (rank = 2, min = 0, max = 127)]\npublic struct char {\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%c\");\n\tpublic bool isalnum ();\n\tpublic bool isalpha ();\n\tpublic bool iscntrl ();\n\tpublic bool isdigit ();\n\tpublic bool isgraph ();\n\tpublic bool islower ();\n\tpublic bool isprint ();\n\tpublic bool ispunct ();\n\tpublic bool isspace ();\n\tpublic bool isupper ();\n\tpublic bool isxdigit ();\n\tpublic int digit_value ();\n\tpublic int xdigit_value ();\n\tpublic char tolower ();\n\tpublic char toupper ();\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static char min (char a, char b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static char max (char a, char b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic char clamp (char low, char high);\n}\n\n[SimpleType]\n[GIR (name = \"guint8\")]\n[CCode (cname = \"guchar\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_UCHAR\", marshaller_type_name = \"UCHAR\", get_value_function = \"g_value_get_uchar\", set_value_function = \"g_value_set_uchar\", default_value = \"\\'\\\\0\\'\", type_signature = \"y\")]\n[IntegerType (rank = 3, min = 0, max = 255)]\npublic struct uchar {\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%hhu\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static uchar min (uchar a, uchar b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static uchar max (uchar a, uchar b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic uchar clamp (uchar low, uchar high);\n}\n\n[SimpleType]\n[GIR (name = \"gint\")]\n[CCode (cname = \"gint\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_INT\", marshaller_type_name = \"INT\", get_value_function = \"g_value_get_int\", set_value_function = \"g_value_set_int\", default_value = \"0\", type_signature = \"i\")]\n[IntegerType (rank = 6)]\npublic struct int {\n\t[CCode (cname = \"G_MININT\")]\n\tpublic const int MIN;\n\t[CCode (cname = \"G_MAXINT\")]\n\tpublic const int MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%i\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static int min (int a, int b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static int max (int a, int b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic int clamp (int low, int high);\n\n\t[CCode (cname = \"GINT_TO_POINTER\")]\n\tpublic void* to_pointer ();\n\n\t[CCode (cname = \"abs\", cheader_filename = \"stdlib.h\")]\n\tpublic int abs ();\n\n\t[CCode (cname = \"GINT_TO_BE\")]\n\tpublic int to_big_endian ();\n\t[CCode (cname = \"GINT_TO_LE\")]\n\tpublic int to_little_endian ();\n\n\t[CCode (cname = \"GINT_FROM_BE\")]\n\tpublic static int from_big_endian (int val);\n\t[CCode (cname = \"GINT_FROM_LE\")]\n\tpublic static int from_little_endian (int val);\n\n\t[CCode (cname = \"atoi\", cheader_filename = \"stdlib.h\")]\n\tpublic static int parse (string str);\n}\n\n[SimpleType]\n[GIR (name = \"guint\")]\n[CCode (cname = \"guint\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_UINT\", marshaller_type_name = \"UINT\", get_value_function = \"g_value_get_uint\", set_value_function = \"g_value_set_uint\", default_value = \"0U\", type_signature = \"u\")]\n[IntegerType (rank = 7)]\npublic struct uint {\n\t[CCode (cname = \"0\")]\n\tpublic const uint MIN;\n\t[CCode (cname = \"G_MAXUINT\")]\n\tpublic const uint MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%u\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static uint min (uint a, uint b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static uint max (uint a, uint b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic uint clamp (uint low, uint high);\n\n\t[CCode (cname = \"GUINT_TO_POINTER\")]\n\tpublic void* to_pointer ();\n\n\t[CCode (cname = \"GUINT_TO_BE\")]\n\tpublic uint to_big_endian ();\n\t[CCode (cname = \"GUINT_TO_LE\")]\n\tpublic uint to_little_endian ();\n\n\t[CCode (cname = \"GUINT_FROM_BE\")]\n\tpublic static uint from_big_endian (uint val);\n\t[CCode (cname = \"GUINT_FROM_LE\")]\n\tpublic static uint from_little_endian (uint val);\n}\n\n[SimpleType]\n[GIR (name = \"gshort\")]\n[CCode (cname = \"gshort\", cheader_filename = \"glib.h\", has_type_id = false, default_value = \"0\", type_signature = \"n\")]\n[IntegerType (rank = 4, min = -32768, max = 32767)]\npublic struct short {\n\t[CCode (cname = \"G_MINSHORT\")]\n\tpublic const short MIN;\n\t[CCode (cname = \"G_MAXSHORT\")]\n\tpublic const short MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%hi\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static short min (short a, short b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static short max (short a, short b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic short clamp (short low, short high);\n\t[CCode (cname = \"abs\", cheader_filename = \"stdlib.h\")]\n\tpublic short abs ();\n}\n\n[SimpleType]\n[GIR (name = \"gushort\")]\n[CCode (cname = \"gushort\", cheader_filename = \"glib.h\", has_type_id = false, default_value = \"0U\", type_signature = \"q\")]\n[IntegerType (rank = 5, min = 0, max = 65535)]\npublic struct ushort {\n\t[CCode (cname = \"0U\")]\n\tpublic const ushort MIN;\n\t[CCode (cname = \"G_MAXUSHORT\")]\n\tpublic const ushort MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%hu\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static ushort min (ushort a, ushort b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static ushort max (ushort a, ushort b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic ushort clamp (ushort low, ushort high);\n}\n\n[SimpleType]\n[GIR (name = \"glong\")]\n[CCode (cname = \"glong\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_LONG\", marshaller_type_name = \"LONG\", get_value_function = \"g_value_get_long\", set_value_function = \"g_value_set_long\", default_value = \"0L\")]\n[IntegerType (rank = 8)]\npublic struct long {\n\t[CCode (cname = \"G_MINLONG\")]\n\tpublic const long MIN;\n\t[CCode (cname = \"G_MAXLONG\")]\n\tpublic const long MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%li\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static long min (long a, long b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static long max (long a, long b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic long clamp (long low, long high);\n\t[CCode (cname = \"labs\", cheader_filename = \"stdlib.h\")]\n\tpublic long abs ();\n\n\t[CCode (cname = \"GLONG_TO_BE\")]\n\tpublic long to_big_endian ();\n\t[CCode (cname = \"GLONG_TO_LE\")]\n\tpublic long to_little_endian ();\n\n\t[CCode (cname = \"GLONG_FROM_BE\")]\n\tpublic static long from_big_endian (long val);\n\t[CCode (cname = \"GLONG_FROM_LE\")]\n\tpublic static long from_little_endian (long val);\n\n\t[CCode (cname = \"atol\", cheader_filename = \"stdlib.h\")]\n\tpublic static long parse (string str);\n}\n\n[SimpleType]\n[GIR (name = \"gulong\")]\n[CCode (cname = \"gulong\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_ULONG\", marshaller_type_name = \"ULONG\", get_value_function = \"g_value_get_ulong\", set_value_function = \"g_value_set_ulong\", default_value = \"0UL\")]\n[IntegerType (rank = 9)]\npublic struct ulong {\n\t[CCode (cname = \"0UL\")]\n\tpublic const ulong MIN;\n\t[CCode (cname = \"G_MAXULONG\")]\n\tpublic const ulong MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%lu\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static ulong min (ulong a, ulong b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static ulong max (ulong a, ulong b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic ulong clamp (ulong low, ulong high);\n\n\t[CCode (cname = \"GULONG_TO_BE\")]\n\tpublic ulong to_big_endian ();\n\t[CCode (cname = \"GULONG_TO_LE\")]\n\tpublic ulong to_little_endian ();\n\n\t[CCode (cname = \"GULONG_FROM_BE\")]\n\tpublic static ulong from_big_endian (ulong val);\n\t[CCode (cname = \"GULONG_FROM_LE\")]\n\tpublic static ulong from_little_endian (ulong val);\n}\n\n[SimpleType]\n[GIR (name = \"gulong\")]\n[CCode (cname = \"gsize\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_ULONG\", marshaller_type_name = \"ULONG\", get_value_function = \"g_value_get_ulong\", set_value_function = \"g_value_set_ulong\", default_value = \"0UL\")]\n[IntegerType (rank = 9)]\npublic struct size_t {\n\t[CCode (cname = \"0UL\")]\n\tpublic const ulong MIN;\n\t[CCode (cname = \"G_MAXSIZE\")]\n\tpublic const ulong MAX;\n\n\t[CCode (cname = \"G_GSIZE_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GSIZE_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%\" + FORMAT);\n\n\t[CCode (cname = \"GSIZE_TO_POINTER\")]\n\tpublic void* to_pointer ();\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static size_t min (size_t a, size_t b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static size_t max (size_t a, size_t b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic size_t clamp (size_t low, size_t high);\n}\n\n[SimpleType]\n[GIR (name = \"glong\")]\n[CCode (cname = \"gssize\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_LONG\", marshaller_type_name = \"LONG\", get_value_function = \"g_value_get_long\", set_value_function = \"g_value_set_long\", default_value = \"0L\")]\n[IntegerType (rank = 8)]\npublic struct ssize_t {\n\t[CCode (cname = \"G_MINSSIZE\")]\n\tpublic const long MIN;\n\t[CCode (cname = \"G_MAXSSIZE\")]\n\tpublic const long MAX;\n\n\t[CCode (cname = \"G_GSSIZE_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GSIZE_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%\" + FORMAT);\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static ssize_t min (ssize_t a, ssize_t b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static ssize_t max (ssize_t a, ssize_t b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic ssize_t clamp (ssize_t low, ssize_t high);\n}\n\n[SimpleType]\n[GIR (name = \"gint8\")]\n[CCode (cname = \"gint8\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_CHAR\", marshaller_type_name = \"CHAR\", get_value_function = \"g_value_get_char\", set_value_function = \"g_value_set_char\", default_value = \"0\", type_signature = \"y\")]\n[IntegerType (rank = 1, min = -128, max = 127)]\npublic struct int8 {\n\t[CCode (cname = \"G_MININT8\")]\n\tpublic const int8 MIN;\n\t[CCode (cname = \"G_MAXINT8\")]\n\tpublic const int8 MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%hhi\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static int8 min (int8 a, int8 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static int8 max (int8 a, int8 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic int8 clamp (int8 low, int8 high);\n}\n\n[SimpleType]\n[GIR (name = \"guint8\")]\n[CCode (cname = \"guint8\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_UCHAR\", marshaller_type_name = \"UCHAR\", get_value_function = \"g_value_get_uchar\", set_value_function = \"g_value_set_uchar\", default_value = \"0U\", type_signature = \"y\")]\n[IntegerType (rank = 3, min = 0, max = 255)]\npublic struct uint8 {\n\t[CCode (cname = \"0U\")]\n\tpublic const uint8 MIN;\n\t[CCode (cname = \"G_MAXUINT8\")]\n\tpublic const uint8 MAX;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%hhu\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static uint8 min (uint8 a, uint8 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static uint8 max (uint8 a, uint8 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic uint8 clamp (uint8 low, uint8 high);\n}\n\n[SimpleType]\n[GIR (name = \"gint16\")]\n[CCode (cname = \"gint16\", cheader_filename = \"glib.h\", default_value = \"0\", type_signature = \"n\", has_type_id = false)]\n[IntegerType (rank = 4, min = -32768, max = 32767)]\npublic struct int16 {\n\t[CCode (cname = \"G_MININT16\")]\n\tpublic const int16 MIN;\n\t[CCode (cname = \"G_MAXINT16\")]\n\tpublic const int16 MAX;\n\n\t[CCode (cname = \"G_GINT16_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GINT16_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%\" + FORMAT);\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static int16 min (int16 a, int16 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static int16 max (int16 a, int16 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic int16 clamp (int16 low, int16 high);\n\n\t[CCode (cname = \"GINT16_TO_BE\")]\n\tpublic int16 to_big_endian ();\n\t[CCode (cname = \"GINT16_TO_LE\")]\n\tpublic int16 to_little_endian ();\n\n\t[CCode (cname = \"GINT16_FROM_BE\")]\n\tpublic static int16 from_big_endian (int16 val);\n\t[CCode (cname = \"GINT16_FROM_LE\")]\n\tpublic static int16 from_little_endian (int16 val);\n}\n\n[SimpleType]\n[GIR (name = \"guint16\")]\n[CCode (cname = \"guint16\", cheader_filename = \"glib.h\", default_value = \"0U\", type_signature = \"q\", has_type_id = false)]\n[IntegerType (rank = 5, min = 0, max = 65535)]\npublic struct uint16 {\n\t[CCode (cname = \"0U\")]\n\tpublic const uint16 MIN;\n\t[CCode (cname = \"G_MAXUINT16\")]\n\tpublic const uint16 MAX;\n\n\t[CCode (cname = \"G_GUINT16_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GINT16_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%hu\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static uint16 min (uint16 a, uint16 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static uint16 max (uint16 a, uint16 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic uint16 clamp (uint16 low, uint16 high);\n\n\t[CCode (cname = \"GUINT16_TO_BE\")]\n\tpublic uint16 to_big_endian ();\n\t[CCode (cname = \"GUINT16_TO_LE\")]\n\tpublic uint16 to_little_endian ();\n\n\t[CCode (cname = \"GUINT16_FROM_BE\")]\n\tpublic static uint16 from_big_endian (uint16 val);\n\t[CCode (cname = \"GUINT16_FROM_LE\")]\n\tpublic static uint16 from_little_endian (uint16 val);\n\n\t[CCode (cname = \"g_htons\")]\n\tpublic static uint16 to_network (uint16 val);\n\t[CCode (cname = \"g_ntohs\")]\n\tpublic static uint16 from_network (uint16 val);\n\n\t[CCode (cname = \"GUINT16_SWAP_BE_PDP\")]\n\tpublic uint16 swap_big_endian_pdp ();\n\t[CCode (cname = \"GUINT16_SWAP_LE_BE\")]\n\tpublic uint16 swap_little_endian_big_endian ();\n\t[CCode (cname = \"GUINT16_SWAP_LE_PDP\")]\n\tpublic uint16 swap_little_endian_pdp ();\n}\n\n[SimpleType]\n[GIR (name = \"gint32\")]\n[CCode (cname = \"gint32\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_INT\", marshaller_type_name = \"INT\", get_value_function = \"g_value_get_int\", set_value_function = \"g_value_set_int\", default_value = \"0\", type_signature = \"i\")]\n[IntegerType (rank = 6)]\npublic struct int32 {\n\t[CCode (cname = \"G_MININT32\")]\n\tpublic const int32 MIN;\n\t[CCode (cname = \"G_MAXINT32\")]\n\tpublic const int32 MAX;\n\n\t[CCode (cname = \"G_GINT32_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GINT32_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%i\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static int32 min (int32 a, int32 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static int32 max (int32 a, int32 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic int32 clamp (int32 low, int32 high);\n\n\t[CCode (cname = \"GINT32_TO_BE\")]\n\tpublic int32 to_big_endian ();\n\t[CCode (cname = \"GINT32_TO_LE\")]\n\tpublic int32 to_little_endian ();\n\n\t[CCode (cname = \"GINT32_FROM_BE\")]\n\tpublic static int32 from_big_endian (int32 val);\n\t[CCode (cname = \"GINT32_FROM_LE\")]\n\tpublic static int32 from_little_endian (int32 val);\n}\n\n[SimpleType]\n[GIR (name = \"guint32\")]\n[CCode (cname = \"guint32\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_UINT\", marshaller_type_name = \"UINT\", get_value_function = \"g_value_get_uint\", set_value_function = \"g_value_set_uint\", default_value = \"0U\", type_signature = \"u\")]\n[IntegerType (rank = 7)]\npublic struct uint32 {\n\t[CCode (cname = \"0U\")]\n\tpublic const uint32 MIN;\n\t[CCode (cname = \"G_MAXUINT32\")]\n\tpublic const uint32 MAX;\n\n\t[CCode (cname = \"G_GUINT32_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GINT32_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%u\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static uint32 min (uint32 a, uint32 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static uint32 max (uint32 a, uint32 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic uint32 clamp (uint32 low, uint32 high);\n\n\t[CCode (cname = \"GUINT32_TO_BE\")]\n\tpublic uint32 to_big_endian ();\n\t[CCode (cname = \"GUINT32_TO_LE\")]\n\tpublic uint32 to_little_endian ();\n\n\t[CCode (cname = \"GUINT32_FROM_BE\")]\n\tpublic static uint32 from_big_endian (uint32 val);\n\t[CCode (cname = \"GUINT32_FROM_LE\")]\n\tpublic static uint32 from_little_endian (uint32 val);\n\n\t[CCode (cname = \"g_htonl\")]\n\tpublic static uint32 to_network (uint32 val);\n\t[CCode (cname = \"g_ntohl\")]\n\tpublic static uint32 from_network (uint32 val);\n\n\t[CCode (cname = \"GUINT32_SWAP_BE_PDP\")]\n\tpublic uint32 swap_big_endian_pdp ();\n\t[CCode (cname = \"GUINT32_SWAP_LE_BE\")]\n\tpublic uint32 swap_little_endian_big_endian ();\n\t[CCode (cname = \"GUINT32_SWAP_LE_PDP\")]\n\tpublic uint32 swap_little_endian_pdp ();\n}\n\n[SimpleType]\n[GIR (name = \"gint64\")]\n[CCode (cname = \"gint64\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_INT64\", marshaller_type_name = \"INT64\", get_value_function = \"g_value_get_int64\", set_value_function = \"g_value_set_int64\", default_value = \"0LL\", type_signature = \"x\")]\n[IntegerType (rank = 10)]\npublic struct int64 {\n\t[CCode (cname = \"G_MININT64\")]\n\tpublic const int64 MIN;\n\t[CCode (cname = \"G_MAXINT64\")]\n\tpublic const int64 MAX;\n\n\t[CCode (cname = \"G_GINT64_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GINT64_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%\" + FORMAT);\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static int64 min (int64 a, int64 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static int64 max (int64 a, int64 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic int64 clamp (int64 low, int64 high);\n\t[CCode (cname = \"llabs\", cheader_filename = \"stdlib.h\")]\n\tpublic int64 abs ();\n\n\t[CCode (cname = \"GINT64_TO_BE\")]\n\tpublic int64 to_big_endian ();\n\t[CCode (cname = \"GINT64_TO_LE\")]\n\tpublic int64 to_little_endian ();\n\n\t[CCode (cname = \"GINT64_FROM_BE\")]\n\tpublic static int64 from_big_endian (int64 val);\n\t[CCode (cname = \"GINT64_FROM_LE\")]\n\tpublic static int64 from_little_endian (int64 val);\n\n\t[CCode (cname = \"GUINT64_SWAP_LE_BE\")]\n\tpublic uint64 swap_little_endian_big_endian ();\n\n\t[CCode (cname = \"g_ascii_strtoll\")]\n\tstatic int64 ascii_strtoll (string nptr, out char* endptr, uint _base);\n\n\tpublic static int64 parse (string str) {\n\t\treturn ascii_strtoll (str, null, 0);\n\t}\n\tpublic static bool try_parse (string str, out int64 result = null) {\n\t\tchar* endptr;\n\t\tresult = ascii_strtoll (str, out endptr, 0);\n\t\tif (endptr == (char*) str + str.length) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n[SimpleType]\n[GIR (name = \"guint64\")]\n[CCode (cname = \"guint64\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_UINT64\", marshaller_type_name = \"UINT64\", get_value_function = \"g_value_get_uint64\", set_value_function = \"g_value_set_uint64\", default_value = \"0ULL\", type_signature = \"t\")]\n[IntegerType (rank = 11)]\npublic struct uint64 {\n\t[CCode (cname = \"0ULL\")]\n\tpublic const uint64 MIN;\n\t[CCode (cname = \"G_MAXUINT64\")]\n\tpublic const uint64 MAX;\n\n\t[CCode (cname = \"G_GUINT64_FORMAT\")]\n\tpublic const string FORMAT;\n\t[CCode (cname = \"G_GINT64_MODIFIER\")]\n\tpublic const string FORMAT_MODIFIER;\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%\" + FORMAT);\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static uint64 min (uint64 a, uint64 b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static uint64 max (uint64 a, uint64 b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic uint64 clamp (uint64 low, uint64 high);\n\n\t[CCode (cname = \"GUINT64_TO_BE\")]\n\tpublic uint64 to_big_endian ();\n\t[CCode (cname = \"GUINT64_TO_LE\")]\n\tpublic uint64 to_little_endian ();\n\n\t[CCode (cname = \"GUINT64_FROM_BE\")]\n\tpublic static uint64 from_big_endian (uint64 val);\n\t[CCode (cname = \"GUINT64_FROM_LE\")]\n\tpublic static uint64 from_little_endian (uint64 val);\n\n\t[CCode (cname = \"g_ascii_strtoull\")]\n\tstatic uint64 ascii_strtoull (string nptr, out char* endptr, uint _base);\n\n\tpublic static uint64 parse (string str) {\n\t\treturn ascii_strtoull (str, null, 0);\n\t}\n\tpublic static bool try_parse (string str, out uint64 result = null) {\n\t\tchar* endptr;\n\t\tresult = ascii_strtoull (str, out endptr, 0);\n\t\tif (endptr == (char*) str + str.length) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n[SimpleType]\n[GIR (name = \"gfloat\")]\n[CCode (cname = \"gfloat\", cheader_filename = \"glib.h,float.h,math.h\", type_id = \"G_TYPE_FLOAT\", marshaller_type_name = \"FLOAT\", get_value_function = \"g_value_get_float\", set_value_function = \"g_value_set_float\", default_value = \"0.0F\")]\n[FloatingType (rank = 1)]\npublic struct float {\n\t[CCode (cname = \"FLT_ROUNDS\")]\n\tpublic const int ROUNDS;\n\t[CCode (cname = \"FLT_RADIX\")]\n\tpublic const int RADIX;\n\t[CCode (cname = \"FLT_MANT_DIG\")]\n\tpublic const int MANT_DIG;\n\t[CCode (cname = \"FLT_DIG\")]\n\tpublic const int DIG;\n\n\t[CCode (cname = \"FLT_MIN_EXP\")]\n\tpublic const int MIN_EXP;\n\t[CCode (cname = \"FLT_MAX_EXP\")]\n\tpublic const int MAX_EXP;\n\n\t[CCode (cname = \"FLT_MIN_10_EXP\")]\n\tpublic const int MIN_10_EXP;\n\t[CCode (cname = \"FLT_MAX_10_EXP\")]\n\tpublic const int MAX_10_EXP;\n\n\t[CCode (cname = \"FLT_EPSILON\")]\n\tpublic const float EPSILON;\n\t[CCode (cname = \"FLT_MIN\")]\n\tpublic const float MIN;\n\t[CCode (cname = \"FLT_MAX\")]\n\tpublic const float MAX;\n\n\t[CCode (cname = \"NAN\")]\n\tpublic const float NAN;\n\t[CCode (cname = \"INFINITY\")]\n\tpublic const float INFINITY;\n\n\t[CCode (cname = \"isnan\")]\n\tpublic bool is_nan ();\n\t[CCode (cname = \"isfinite\")]\n\tpublic bool is_finite ();\n\t[CCode (cname = \"isnormal\")]\n\tpublic bool is_normal ();\n\t[CCode (cname = \"isinf\")]\n\tpublic int is_infinity ();\n\n\t[CCode (cname = \"g_strdup_printf\", instance_pos = -1)]\n\tpublic string to_string (string format = \"%g\");\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static float min (float a, float b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static float max (float a, float b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic float clamp (float low, float high);\n}\n\n[SimpleType]\n[GIR (name = \"gdouble\")]\n[CCode (cname = \"gdouble\", cheader_filename = \"glib.h,float.h,math.h\", type_id = \"G_TYPE_DOUBLE\", marshaller_type_name = \"DOUBLE\", get_value_function = \"g_value_get_double\", set_value_function = \"g_value_set_double\", default_value = \"0.0\", type_signature = \"d\")]\n[FloatingType (rank = 2)]\npublic struct double {\n\t[CCode (cname = \"DBL_MANT_DIG\")]\n\tpublic const int MANT_DIG;\n\t[CCode (cname = \"DBL_DIG\")]\n\tpublic const int DIG;\n\n\t[CCode (cname = \"DBL_MIN_EXP\")]\n\tpublic const int MIN_EXP;\n\t[CCode (cname = \"DBL_MAX_EXP\")]\n\tpublic const int MAX_EXP;\n\n\t[CCode (cname = \"DBL_MIN_10_EXP\")]\n\tpublic const int MIN_10_EXP;\n\t[CCode (cname = \"DBL_MAX_10_EXP\")]\n\tpublic const int MAX_10_EXP;\n\n\t[CCode (cname = \"DBL_EPSILON\")]\n\tpublic const double EPSILON;\n\t[CCode (cname = \"DBL_MIN\")]\n\tpublic const double MIN;\n\t[CCode (cname = \"DBL_MAX\")]\n\tpublic const double MAX;\n\n\t[CCode (cname = \"((double) NAN)\")]\n\tpublic const double NAN;\n\t[CCode (cname = \"((double) INFINITY)\")]\n\tpublic const double INFINITY;\n\n\t[CCode (cname = \"isnan\")]\n\tpublic bool is_nan ();\n\t[CCode (cname = \"isfinite\")]\n\tpublic bool is_finite ();\n\t[CCode (cname = \"isnormal\")]\n\tpublic bool is_normal ();\n\t[CCode (cname = \"isinf\")]\n\tpublic int is_infinity ();\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static double min (double a, double b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static double max (double a, double b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic double clamp (double low, double high);\n\n\t[CCode (cname = \"G_ASCII_DTOSTR_BUF_SIZE\")]\n\tpublic const int DTOSTR_BUF_SIZE;\n\t[CCode (cname = \"g_ascii_dtostr\", instance_pos = -1)]\n\tpublic unowned string to_str (char[] buffer);\n\t[CCode (cname = \"g_ascii_formatd\", instance_pos = -1)]\n\tpublic unowned string format (char[] buffer, string format = \"%g\");\n\n\tpublic string to_string () {\n\t\treturn this.to_str(new char[DTOSTR_BUF_SIZE]);\n\t}\n\n\t[CCode (cname = \"g_ascii_strtod\")]\n\tstatic double ascii_strtod (string nptr, out char* endptr);\n\n\tpublic static double parse (string str) {\n\t\treturn ascii_strtod (str, null);\n\t}\n\tpublic static bool try_parse (string str, out double result = null) {\n\t\tchar* endptr;\n\t\tresult = ascii_strtod (str, out endptr);\n\t\tif (endptr == (char*) str + str.length) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\n[GIR (name = \"glong\")]\n[CCode (cheader_filename = \"time.h\", has_type_id = false, default_value = \"0\")]\n[IntegerType (rank = 8)]\npublic struct time_t {\n\t[CCode (cname = \"time\")]\n\tpublic time_t (out time_t result = null);\n}\n\n[SimpleType]\n[CCode (cheader_filename=\"stdarg.h\", cprefix=\"va_\", has_type_id = false, destroy_function = \"va_end\", lvalue_access = false)]\npublic struct va_list {\n\t[CCode (cname = \"va_start\")]\n\tpublic va_list ();\n\t[CCode (cname = \"va_copy\")]\n\tpublic va_list.copy (va_list src);\n\t[CCode (generic_type_pos = 1.1)]\n\tpublic unowned G arg<G> ();\n}\n\n[SimpleType]\n[GIR (name = \"gunichar\")]\n[CCode (cname = \"gunichar\", cprefix = \"g_unichar_\", cheader_filename = \"glib.h\", type_id = \"G_TYPE_UINT\", marshaller_type_name = \"UINT\", get_value_function = \"g_value_get_uint\", set_value_function = \"g_value_set_uint\", default_value = \"0U\", type_signature = \"u\")]\n[IntegerType (rank = 7)]\npublic struct unichar {\n\tpublic bool validate ();\n\tpublic bool isalnum ();\n\tpublic bool isalpha ();\n\tpublic bool iscntrl ();\n\tpublic bool isdigit ();\n\tpublic bool isgraph ();\n\tpublic bool islower ();\n\tpublic bool ismark ();\n\tpublic bool isprint ();\n\tpublic bool ispunct ();\n\tpublic bool isspace ();\n\tpublic bool isupper ();\n\tpublic bool isxdigit ();\n\tpublic bool istitle ();\n\tpublic bool isdefined ();\n\tpublic bool iswide ();\n\tpublic bool iswide_cjk ();\n\tpublic bool iszerowidth ();\n\tpublic unichar toupper ();\n\tpublic unichar tolower ();\n\tpublic unichar totitle ();\n\tpublic int digit_value ();\n\tpublic int xdigit_value ();\n\tpublic GLib.UnicodeType type ();\n\tpublic GLib.UnicodeBreakType break_type ();\n\tpublic GLib.UnicodeScript get_script();\n\n\tpublic int to_utf8 (string? outbuf);\n\n\tpublic string? to_string () {\n\t\tstring str = (string) new char[7];\n\t\tthis.to_utf8 (str);\n\t\treturn str;\n\t}\n\n\tpublic bool compose (unichar b, out unichar ch);\n\tpublic bool decompose (out unichar a, out unichar b);\n\tpublic size_t fully_decompose (bool compat, unichar[] result);\n\n\t[CCode (cname = \"MIN\")]\n\tpublic static unichar min (unichar a, unichar b);\n\t[CCode (cname = \"MAX\")]\n\tpublic static unichar max (unichar a, unichar b);\n\t[CCode (cname = \"CLAMP\")]\n\tpublic unichar clamp (unichar low, unichar high);\n\n\t[CCode (cname = \"G_UNICHAR_MAX_DECOMPOSITION_LENGTH\")]\n\tpublic const int MAX_DECOMPOSITION_LENGTH;\n}\n\n[Compact]\n[Immutable]\n[GIR (name = \"utf8\")]\n[CCode (cname = \"gchar\", const_cname = \"const gchar\", copy_function = \"g_strdup\", free_function = \"g_free\", cheader_filename = \"stdlib.h,string.h,glib.h\", type_id = \"G_TYPE_STRING\", marshaller_type_name = \"STRING\", param_spec_function = \"g_param_spec_string\", get_value_function = \"g_value_get_string\", set_value_function = \"g_value_set_string\", take_value_function = \"g_value_take_string\", type_signature = \"s\")]\npublic class string {\n\t[Deprecated (replacement = \"string.index_of\")]\n\t[CCode (cname = \"strstr\")]\n\tpublic unowned string? str (string needle);\n\t[Deprecated (replacement = \"string.last_index_of\")]\n\t[CCode (cname = \"g_strrstr\")]\n\tpublic unowned string? rstr (string needle);\n\t[CCode (cname = \"g_strrstr_len\")]\n\tpublic unowned string? rstr_len (ssize_t haystack_len, string needle);\n\n\t[CCode (cname = \"strstr\")]\n\tstatic char* strstr (char* haystack, char* needle);\n\t[CCode (cname = \"g_strrstr\")]\n\tstatic char* strrstr (char* haystack, char* needle);\n\t[CCode (cname = \"g_utf8_strchr\")]\n\tstatic char* utf8_strchr (char* str, ssize_t len, unichar c);\n\t[CCode (cname = \"g_utf8_strrchr\")]\n\tstatic char* utf8_strrchr (char* str, ssize_t len, unichar c);\n\n\tpublic int index_of (string needle, int start_index = 0) {\n\t\tchar* result = strstr ((char*) this + start_index, (char*) needle);\n\n\t\tif (result != null) {\n\t\t\treturn (int) (result - (char*) this);\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tpublic int last_index_of (string needle, int start_index = 0) {\n\t\tchar* result = strrstr ((char*) this + start_index, (char*) needle);\n\n\t\tif (result != null) {\n\t\t\treturn (int) (result - (char*) this);\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tpublic int index_of_char (unichar c, int start_index = 0) {\n\t\tchar* result = utf8_strchr ((char*) this + start_index, -1, c);\n\n\t\tif (result != null) {\n\t\t\treturn (int) (result - (char*) this);\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\tpublic int last_index_of_char (unichar c, int start_index = 0) {\n\t\tchar* result = utf8_strrchr ((char*) this + start_index, -1, c);\n\n\t\tif (result != null) {\n\t\t\treturn (int) (result - (char*) this);\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\t[CCode (cname = \"g_str_has_prefix\")]\n\tpublic bool has_prefix (string prefix);\n\t[CCode (cname = \"g_str_has_suffix\")]\n\tpublic bool has_suffix (string suffix);\n\t[CCode (cname = \"g_strdup_printf\"), PrintfFormat]\n\tpublic string printf (...);\n\t[CCode (cname = \"g_strdup_vprintf\")]\n\tpublic string vprintf (va_list args);\n\t[CCode (cname = \"sscanf\", cheader_filename = \"stdio.h\"), ScanfFormat]\n\tpublic int scanf (...);\n\t[CCode (cname = \"g_strconcat\")]\n\tpublic string concat (string string2, ...);\n\t[CCode (cname = \"g_strescape\")]\n\tpublic string escape (string exceptions);\n\t[CCode (cname = \"g_strcompress\")]\n\tpublic string compress ();\n\t[CCode (cname = \"g_strsplit\", array_length = false, array_null_terminated = true)]\n\tpublic string[] split (string delimiter, int max_tokens = 0);\n\t[CCode (cname = \"g_strsplit_set\", array_length = false, array_null_terminated = true)]\n\tpublic string[] split_set (string delimiters, int max_tokens = 0);\n\t[CCode (cname = \"g_stpcpy\")]\n\tprivate static void* copy_to_buffer (void* dest, string src);\n\t[CCode (cname = \"_vala_g_strjoinv\")]\n\tpublic static string joinv (string? separator, string?[]? str_array) {\n\t\tif (separator == null) {\n\t\t\tseparator = \"\";\n\t\t}\n\t\tif (str_array != null || str_array.length > 0 || (str_array.length == -1 && str_array[0] != null)) {\n\t\t\tint i;\n\t\t\tsize_t len = 1;\n\t\t\tfor (i = 0 ; (str_array.length != -1 && i < str_array.length) || (str_array.length == -1 && str_array[i] != null) ; i++) {\n\t\t\t\tlen += (str_array[i] != null) ? ((!) str_array[i]).length : 0;\n\t\t\t}\n\t\t\tif (i == 0) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tstr_array.length = i;\n\t\t\tlen += ((!) separator).length * (i - 1);\n\n\t\t\tstring* res = GLib.malloc (len);\n\t\t\tvoid* ptr = string.copy_to_buffer ((void*) res, (!) str_array[0]);\n\t\t\tfor (i = 1 ; i < str_array.length ; i++) {\n\t\t\t\tptr = string.copy_to_buffer (ptr, (!) separator);\n\t\t\t\tptr = string.copy_to_buffer (ptr, (str_array[i] != null) ? ((!) str_array[i]) : \"\");\n\t\t\t}\n\n\t\t\treturn (owned) res;\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\t[CCode (cname = \"g_strjoin\")]\n\tpublic static string join (string separator, ...);\n\t[CCode (cname = \"g_strnfill\")]\n\tpublic static string nfill (size_t length, char fill_char);\n\n\tpublic char get (long index) {\n\t\treturn ((char*) this)[index];\n\t}\n\n\t// checks whether valid string character starts at specified index\n\t// embedded NULs are not supported by the string class\n\tpublic bool valid_char (int index) {\n\t\tuint8 c = ((uint8*) this)[index];\n\t\tif (c == 0x00 || (c >= 0x80 && c < 0xc2) || c >= 0xf5) {\n\t\t\treturn false;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t[CCode (cname = \"g_utf8_next_char\")]\n\tpublic unowned string next_char ();\n\t[CCode (cname = \"g_utf8_next_char\")]\n\tstatic char* utf8_next_char (char* str);\n\tpublic bool get_next_char (ref int index, out unichar c) {\n\t\tc = utf8_get_char ((char*) this + index);\n\t\tif (c != 0) {\n\t\t\tindex = (int) (utf8_next_char ((char*) this + index) - (char*) this);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\t[CCode (cname = \"g_utf8_get_char\")]\n\tstatic unichar utf8_get_char (char* str);\n\tpublic unichar get_char (long index = 0) {\n\t\treturn utf8_get_char ((char*) this + index);\n\t}\n\t[CCode (cname = \"g_utf8_get_char_validated\")]\n\tpublic unichar get_char_validated (ssize_t max_len = -1);\n\n\t[Deprecated (replacement = \"string.index_of_nth_char\")]\n\t[CCode (cname = \"g_utf8_offset_to_pointer\")]\n\tpublic unowned string utf8_offset (long offset);\n\tpublic unowned string offset (long offset) {\n\t\treturn (string) ((char*) this + offset);\n\t}\n\t[Deprecated (replacement = \"string.char_count\")]\n\tpublic long pointer_to_offset (string pos) {\n\t\treturn (long) ((char*) pos - (char*) this);\n\t}\n\n\t[CCode (cname = \"g_utf8_offset_to_pointer\")]\n\tchar* utf8_offset_to_pointer (long offset);\n\n\tpublic int index_of_nth_char (long c) {\n\t\treturn (int) (this.utf8_offset_to_pointer (c) - (char*) this);\n\t}\n\n\t[CCode (cname = \"g_utf8_prev_char\")]\n\tpublic unowned string prev_char ();\n\t[CCode (cname = \"g_utf8_prev_char\")]\n\tstatic char* utf8_prev_char (char* str);\n\tpublic bool get_prev_char (ref int index, out unichar c) {\n\t\tif (0 < index) {\n\t\t\tindex = (int) (utf8_prev_char ((char*) this + index) - (char*) this);\n\t\t\tc = utf8_get_char ((char*) this + index);\n\t\t\treturn true;\n\t\t} else {\n\t\t\tc = 0;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t[Deprecated (replacement = \"string.length\")]\n\t[CCode (cname = \"strlen\")]\n\tpublic long len ();\n\t[Deprecated (replacement = \"string.index_of_char\")]\n\t[CCode (cname = \"g_utf8_strchr\")]\n\tpublic unowned string chr (ssize_t len, unichar c);\n\t[Deprecated (replacement = \"string.last_index_of_char\")]\n\t[CCode (cname = \"g_utf8_strrchr\")]\n\tpublic unowned string rchr (ssize_t len, unichar c);\n\t[CCode (cname = \"g_utf8_strreverse\")]\n\tpublic string reverse (ssize_t len = -1);\n\t[CCode (cname = \"g_utf8_validate\")]\n\tpublic bool validate (ssize_t max_len = -1, out char* end = null);\n\t[CCode (cname = \"g_utf8_normalize\")]\n\tpublic string normalize (ssize_t len = -1, GLib.NormalizeMode mode = GLib.NormalizeMode.DEFAULT);\n\n\t[CCode (cname = \"g_utf8_strup\")]\n\tpublic string up (ssize_t len = -1);\n\t[CCode (cname = \"g_utf8_strdown\")]\n\tpublic string down (ssize_t len = -1);\n\t[CCode (cname = \"g_utf8_casefold\")]\n\tpublic string casefold (ssize_t len = -1);\n\t[CCode (cname = \"g_utf8_collate\")]\n\tpublic int collate (string str2);\n\t[CCode (cname = \"g_utf8_collate_key\")]\n\tpublic string collate_key (ssize_t len = -1);\n\t[CCode (cname = \"g_utf8_collate_key_for_filename\")]\n\tpublic string collate_key_for_filename (ssize_t len = -1);\n\n\t[CCode (cname = \"g_locale_to_utf8\")]\n\tpublic string locale_to_utf8 (ssize_t len, out size_t bytes_read, out size_t bytes_written, out GLib.Error error = null);\n\n\t[CCode (cname = \"g_strchomp\")]\n\tpublic unowned string _chomp();\n\tpublic string chomp () {\n\t\tstring result = this.dup ();\n\t\tresult._chomp ();\n\t\treturn result;\n\t}\n\n\t[CCode (cname = \"g_strchug\")]\n\tpublic unowned string _chug();\n\tpublic string chug () {\n\t\tstring result = this.dup ();\n\t\tresult._chug ();\n\t\treturn result;\n\t}\n\n\t[CCode (cname = \"g_strstrip\")]\n\tpublic unowned string _strip ();\n\tpublic string strip () {\n\t\tstring result = this.dup ();\n\t\tresult._strip ();\n\t\treturn result;\n\t}\n\n\t[CCode (cname = \"g_strdelimit\")]\n\tpublic unowned string _delimit (string delimiters, char new_delimiter);\n\tpublic string delimit (string delimiters, char new_delimiter) {\n\t\tstring result = this.dup ();\n\t\tresult._delimit (delimiters, new_delimiter);\n\t\treturn result;\n\t}\n\n\t[CCode (cname = \"g_str_hash\")]\n\tpublic uint hash ();\n\n\t[CCode (cname = \"g_str_is_ascii\")]\n\tpublic bool is_ascii ();\n\t[CCode (instance_pos = \"1.5\", cname = \"g_str_match_string\")]\n\tpublic bool match_string (string search_term, bool accept_alternates);\n\t[Deprecated (replacement = \"int.parse\")]\n\t[CCode (cname = \"atoi\")]\n\tpublic int to_int ();\n\t[Deprecated (replacement = \"long.parse\")]\n\t[CCode (cname = \"strtol\")]\n\tpublic long to_long (out unowned string endptr = null, int _base = 0);\n\t[Deprecated (replacement = \"double.parse\")]\n\t[CCode (cname = \"g_ascii_strtod\")]\n\tpublic double to_double (out unowned string endptr = null);\n\t[Deprecated (replacement = \"uint64.parse\")]\n\t[CCode (cname = \"strtoul\")]\n\tpublic ulong to_ulong (out unowned string endptr = null, int _base = 0);\n\t[Deprecated (replacement = \"int64.parse\")]\n\t[CCode (cname = \"g_ascii_strtoll\")]\n\tpublic int64 to_int64 (out unowned string endptr = null, int _base = 0);\n\t[Deprecated (replacement = \"uint64.parse\")]\n\t[CCode (cname = \"g_ascii_strtoull\")]\n\tpublic uint64 to_uint64 (out unowned string endptr = null, int _base = 0);\n\t[CCode (cname = \"g_str_tokenize_and_fold\", array_length = false, array_null_terminated = true)]\n\tpublic string[] tokenize_and_fold (string transit_locale, [CCode (array_length = false, array_null_terminated = true)] out string[] ascii_alternates);\n\n\t[Deprecated (replacement = \"bool.parse\")]\n\tpublic bool to_bool () {\n\t\tif (this == \"true\") {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t[Deprecated (replacement = \"string.length\")]\n\t[CCode (cname = \"strlen\")]\n\tpublic size_t size ();\n\n\t[CCode (cname = \"g_ascii_strcasecmp\")]\n\tpublic int ascii_casecmp (string s2);\n\t[CCode (cname = \"g_ascii_strncasecmp\")]\n\tpublic int ascii_ncasecmp (string s2, size_t n);\n\t[CCode (cname = \"g_ascii_strup\")]\n\tpublic string ascii_up (ssize_t len = -1);\n\t[CCode (cname = \"g_ascii_strdown\")]\n\tpublic string ascii_down (ssize_t len = -1);\n\n\t[CCode (cname = \"g_utf8_skip\")]\n\tpublic static char[] skip;\n\n\t/* modifies string in place */\n\t[CCode (cname = \"g_strcanon\")]\n\tpublic void canon (string valid_chars, char substitutor);\n\n\t[CCode (cname = \"g_strdup\")]\n\tpublic string dup ();\n\t[Deprecated (replacement = \"string.substring\")]\n\t[CCode (cname = \"g_strndup\")]\n\tpublic string ndup (size_t n);\n\n\t[CCode (cname = \"memchr\")]\n\tstatic char* memchr (char* s, int c, size_t n);\n\n\t// strnlen is not available on all systems\n\tstatic long strnlen (char* str, long maxlen) {\n\t\tchar* end = memchr (str, 0, maxlen);\n\t\tif (end == null) {\n\t\t\treturn maxlen;\n\t\t} else {\n\t\t\treturn (long) (end - str);\n\t\t}\n\t}\n\n\t[CCode (cname = \"g_strndup\")]\n\tstatic string strndup (char* str, size_t n);\n\n\tpublic string substring (long offset, long len = -1) {\n\t\tlong string_length;\n\t\tif (offset >= 0 && len >= 0) {\n\t\t\t// avoid scanning whole string\n\t\t\tstring_length = strnlen ((char*) this, offset + len);\n\t\t} else {\n\t\t\tstring_length = this.length;\n\t\t}\n\n\t\tif (offset < 0) {\n\t\t\toffset = string_length + offset;\n\t\t\tGLib.return_val_if_fail (offset >= 0, null);\n\t\t} else {\n\t\t\tGLib.return_val_if_fail (offset <= string_length, null);\n\t\t}\n\t\tif (len < 0) {\n\t\t\tlen = string_length - offset;\n\t\t}\n\t\tGLib.return_val_if_fail (offset + len <= string_length, null);\n\t\treturn strndup ((char*) this + offset, len);\n\t}\n\n\tpublic string slice (long start, long end) {\n\t\tlong string_length = this.length;\n\t\tif (start < 0) {\n\t\t\tstart = string_length + start;\n\t\t}\n\t\tif (end < 0) {\n\t\t\tend = string_length + end;\n\t\t}\n\t\tGLib.return_val_if_fail (start >= 0 && start <= string_length, null);\n\t\tGLib.return_val_if_fail (end >= 0 && end <= string_length, null);\n\t\tGLib.return_val_if_fail (start <= end, null);\n\t\treturn strndup ((char*) this + start, end - start);\n\t}\n\n\tpublic string splice (long start, long end, string? str = null) {\n\t\tlong string_length = this.length;\n\t\tif (start < 0) {\n\t\t\tstart = string_length + start;\n\t\t}\n\t\tif (end < 0) {\n\t\t\tend = string_length + end;\n\t\t}\n\t\tGLib.return_val_if_fail (start >= 0 && start <= string_length, null);\n\t\tGLib.return_val_if_fail (end >= 0 && end <= string_length, null);\n\t\tGLib.return_val_if_fail (start <= end, null);\n\n\t\tsize_t str_size;\n\t\tif (str == null) {\n\t\t\tstr_size = 0;\n\t\t} else {\n\t\t\tstr_size = ((!)(str)).length;\n\t\t}\n\n\t\tstring* result = GLib.malloc0 (this.length - (end - start) + str_size + 1);\n\n\t\tchar* dest = (char*) result;\n\n\t\tGLib.Memory.copy (dest, this, start);\n\t\tdest += start;\n\n\t\tGLib.Memory.copy (dest, str, str_size);\n\t\tdest += str_size;\n\n\t\tGLib.Memory.copy (dest, (char*) this + end, string_length - end);\n\n\t\treturn (owned) result;\n\t}\n\n\tpublic bool contains (string needle) {\n\t\treturn strstr ((char*) this, (char*) needle) != null;\n\t}\n\n\tpublic string replace (string old, string replacement) {\n\t\ttry {\n\t\t\tvar regex = new GLib.Regex (GLib.Regex.escape_string (old));\n\t\t\treturn regex.replace_literal (this, -1, 0, replacement);\n\t\t} catch (GLib.RegexError e) {\n\t\t\tGLib.assert_not_reached ();\n\t\t}\n\t}\n\n\t[CCode (cname = \"g_utf8_strlen\")]\n\tpublic int char_count (ssize_t max = -1);\n\n\tpublic int length {\n\t\t[CCode (cname = \"strlen\")]\n\t\tget;\n\t}\n\n\tpublic uint8[] data {\n\t\tget {\n\t\t\tunowned uint8[] res = (uint8[]) this;\n\t\t\tres.length = (int) this.length;\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tpublic char[] to_utf8 () {\n\t\tchar[] result = new char[this.length + 1];\n\t\tresult.length--;\n\t\tGLib.Memory.copy (result, this, this.length);\n\t\treturn result;\n\t}\n\n\tpublic unowned string to_string () {\n\t\treturn this;\n\t}\n}\n\n[CCode (cprefix = \"G\", lower_case_cprefix = \"g_\", cheader_filename = \"glib.h\", gir_namespace = \"GLib\", gir_version = \"2.0\")]\nnamespace GLib {\n\t[CCode (lower_case_cprefix = \"\", cheader_filename = \"math.h\")]\n\tnamespace Math {\n\t\t[CCode (cname = \"G_E\")]\n\t\tpublic const double E;\n\n\t\t[CCode (cname = \"G_PI\")]\n\t\tpublic const double PI;\n\n\t\t[CCode (cname = \"G_LN2\")]\n\t\tpublic const double LN2;\n\n\t\t[CCode (cname = \"G_LN10\")]\n\t\tpublic const double LN10;\n\n\t\t[CCode (cname = \"G_PI_2\")]\n\t\tpublic const double PI_2;\n\n\t\t[CCode (cname = \"G_PI_4\")]\n\t\tpublic const double PI_4;\n\n\t\t[CCode (cname = \"G_SQRT2\")]\n\t\tpublic const double SQRT2;\n\n\t\t[CCode (cname = \"G_LOG_2_BASE_10\")]\n\t\tpublic const double LOG_2_BASE_10;\n\n\t\t/* generated from <bits/mathcalls.h> of glibc */\n\t\tpublic static double acos (double x);\n\t\tpublic static float acosf (float x);\n\t\tpublic static double asin (double x);\n\t\tpublic static float asinf (float x);\n\t\tpublic static double atan (double x);\n\t\tpublic static float atanf (float x);\n\t\tpublic static double atan2 (double y, double x);\n\t\tpublic static float atan2f (float y, float x);\n\t\tpublic static double cos (double x);\n\t\tpublic static float cosf (float x);\n\t\tpublic static double sin (double x);\n\t\tpublic static float sinf (float x);\n\t\tpublic static double tan (double x);\n\t\tpublic static float tanf (float x);\n\t\tpublic static double cosh (double x);\n\t\tpublic static float coshf (float x);\n\t\tpublic static double sinh (double x);\n\t\tpublic static float sinhf (float x);\n\t\tpublic static double tanh (double x);\n\t\tpublic static float tanhf (float x);\n\t\tpublic static void sincos (double x, out double sinx, out double cosx);\n\t\tpublic static void sincosf (float x, out float sinx, out float cosx);\n\t\tpublic static double acosh (double x);\n\t\tpublic static float acoshf (float x);\n\t\tpublic static double asinh (double x);\n\t\tpublic static float asinhf (float x);\n\t\tpublic static double atanh (double x);\n\t\tpublic static float atanhf (float x);\n\t\tpublic static double exp (double x);\n\t\tpublic static float expf (float x);\n\t\tpublic static double frexp (double x, out int exponent);\n\t\tpublic static float frexpf (float x, out int exponent);\n\t\tpublic static double ldexp (double x, int exponent);\n\t\tpublic static float ldexpf (float x, int exponent);\n\t\tpublic static double log (double x);\n\t\tpublic static float logf (float x);\n\t\tpublic static double log10 (double x);\n\t\tpublic static float log10f (float x);\n\t\tpublic static double modf (double x, out double iptr);\n\t\tpublic static float modff (float x, out float iptr);\n\t\tpublic static double exp10 (double x);\n\t\tpublic static float exp10f (float x);\n\t\tpublic static double pow10 (double x);\n\t\tpublic static float pow10f (float x);\n\t\tpublic static double expm1 (double x);\n\t\tpublic static float expm1f (float x);\n\t\tpublic static double log1p (double x);\n\t\tpublic static float log1pf (float x);\n\t\tpublic static double logb (double x);\n\t\tpublic static float logbf (float x);\n\t\tpublic static double exp2 (double x);\n\t\tpublic static float exp2f (float x);\n\t\tpublic static double log2 (double x);\n\t\tpublic static float log2f (float x);\n\t\tpublic static double pow (double x, double y);\n\t\tpublic static float powf (float x, float y);\n\t\tpublic static double sqrt (double x);\n\t\tpublic static float sqrtf (float x);\n\t\tpublic static double hypot (double x, double y);\n\t\tpublic static float hypotf (float x, float y);\n\t\tpublic static double cbrt (double x);\n\t\tpublic static float cbrtf (float x);\n\t\tpublic static double ceil (double x);\n\t\tpublic static float ceilf (float x);\n\t\tpublic static double fabs (double x);\n\t\tpublic static float fabsf (float x);\n\t\tpublic static double floor (double x);\n\t\tpublic static float floorf (float x);\n\t\tpublic static double fmod (double x, double y);\n\t\tpublic static float fmodf (float x, float y);\n\t\tpublic static int isinf (double value);\n\t\tpublic static int isinff (float value);\n\t\tpublic static int finite (double value);\n\t\tpublic static int finitef (float value);\n\t\tpublic static double drem (double x, double y);\n\t\tpublic static float dremf (float x, float y);\n\t\tpublic static double significand (double x);\n\t\tpublic static float significandf (float x);\n\t\tpublic static double copysign (double x, double y);\n\t\tpublic static float copysignf (float x, float y);\n\t\tpublic static double nan (string tagb);\n\t\tpublic static float nanf (string tagb);\n\t\tpublic static int isnan (double value);\n\t\tpublic static int isnanf (float value);\n\t\tpublic static double j0 (double x0);\n\t\tpublic static float j0f (float x0);\n\t\tpublic static double j1 (double x0);\n\t\tpublic static float j1f (float x0);\n\t\tpublic static double jn (int x0, double x1);\n\t\tpublic static float jnf (int x0, float x1);\n\t\tpublic static double y0 (double x0);\n\t\tpublic static float y0f (float x0);\n\t\tpublic static double y1 (double x0);\n\t\tpublic static float y1f (float x0);\n\t\tpublic static double yn (int x0, double x1);\n\t\tpublic static float ynf (int x0, float x1);\n\t\tpublic static double erf (double x0);\n\t\tpublic static float erff (float x0);\n\t\tpublic static double erfc (double x0);\n\t\tpublic static float erfcf (float x0);\n\t\tpublic static double lgamma (double x0);\n\t\tpublic static float lgammaf (float x0);\n\t\tpublic static double tgamma (double x0);\n\t\tpublic static float tgammaf (float x0);\n\t\tpublic static double gamma (double x0);\n\t\tpublic static float gammaf (float x0);\n\t\tpublic static double lgamma_r (double x0, out int signgamp);\n\t\tpublic static float lgamma_rf (float x0, out int signgamp);\n\t\tpublic static double rint (double x);\n\t\tpublic static float rintf (float x);\n\t\tpublic static double nextafter (double x, double y);\n\t\tpublic static float nextafterf (float x, float y);\n\t\tpublic static double nexttoward (double x, double y);\n\t\tpublic static float nexttowardf (float x, double y);\n\t\tpublic static double remainder (double x, double y);\n\t\tpublic static float remainderf (float x, float y);\n\t\tpublic static double scalbn (double x, int n);\n\t\tpublic static float scalbnf (float x, int n);\n\t\tpublic static int ilogb (double x);\n\t\tpublic static int ilogbf (float x);\n\t\tpublic static double scalbln (double x, long n);\n\t\tpublic static float scalblnf (float x, long n);\n\t\tpublic static double nearbyint (double x);\n\t\tpublic static float nearbyintf (float x);\n\t\tpublic static double round (double x);\n\t\tpublic static float roundf (float x);\n\t\tpublic static double trunc (double x);\n\t\tpublic static float truncf (float x);\n\t\tpublic static double remquo (double x, double y, out int quo);\n\t\tpublic static float remquof (float x, float y, out int quo);\n\t\tpublic static long lrint (double x);\n\t\tpublic static long lrintf (float x);\n\t\tpublic static int64 llrint (double x);\n\t\tpublic static int64 llrintf (float x);\n\t\tpublic static long lround (double x);\n\t\tpublic static long lroundf (float x);\n\t\tpublic static int64 llround (double x);\n\t\tpublic static int64 llroundf (float x);\n\t\tpublic static double fdim (double x, double y);\n\t\tpublic static float fdimf (float x, float y);\n\t\tpublic static double fmax (double x, double y);\n\t\tpublic static float fmaxf (float x, float y);\n\t\tpublic static double fmin (double x, double y);\n\t\tpublic static float fminf (float x, float y);\n\t\tpublic static double fma (double x, double y, double z);\n\t\tpublic static float fmaf (float x, float y, float z);\n\t\tpublic static double scalb (double x, double n);\n\t\tpublic static float scalbf (float x, float n);\n\t}\n\n\t/* Byte order */\n\t[CCode (cprefix = \"G_\", cname = \"int\", has_type_id = false)]\n\tpublic enum ByteOrder {\n\t\t[CCode (cname = \"G_BYTE_ORDER\")]\n\t\tHOST,\n\t\tLITTLE_ENDIAN,\n\t\tBIG_ENDIAN,\n\t\tPDP_ENDIAN\n\t}\n\n\tpublic const ByteOrder BYTE_ORDER;\n\n\t/* Atomic Operations */\n\n\tnamespace AtomicInt {\n\t\tpublic static int get ([CCode (type = \"volatile gint *\")] ref int atomic);\n\t\tpublic static void set ([CCode (type = \"volatile gint *\")] ref int atomic, int newval);\n#if GLIB_2_30\n\t\tpublic static int add ([CCode (type = \"volatile gint *\")] ref int atomic, int val);\n#else\n\t\tpublic static void add ([CCode (type = \"volatile gint *\")] ref int atomic, int val);\n#endif\n\t\t[Deprecated (since = \"2.30\", replacement = \"add\")]\n\t\tpublic static int exchange_and_add ([CCode (type = \"volatile gint *\")] ref int atomic, int val);\n\t\tpublic static bool compare_and_exchange ([CCode (type = \"volatile gint *\")] ref int atomic, int oldval, int newval);\n\t\tpublic static void inc ([CCode (type = \"volatile gint *\")] ref int atomic);\n\t\tpublic static bool dec_and_test ([CCode (type = \"volatile gint *\")] ref int atomic);\n\t}\n\n\tnamespace AtomicPointer {\n\t\tpublic static void* get ([CCode (type = \"volatile gpointer *\")] void** atomic);\n\t\tpublic static void set ([CCode (type = \"volatile gpointer *\")] void** atomic, void* newval);\n\t\tpublic static bool compare_and_exchange ([CCode (type = \"volatile gpointer *\")] void** atomic, void* oldval, void* newval);\n\t}\n\n\t/* The Main Event Loop */\n\n\t[Compact]\n\t[CCode (ref_function = \"g_main_loop_ref\", unref_function = \"g_main_loop_unref\")]\n\tpublic class MainLoop {\n\t\tpublic MainLoop (MainContext? context = null, bool is_running = false);\n\t\tpublic void run ();\n\t\tpublic void quit ();\n\t\tpublic bool is_running ();\n\t\tpublic unowned MainContext get_context ();\n\t}\n\n\tnamespace Priority {\n\t\tpublic const int HIGH;\n\t\tpublic const int DEFAULT;\n\t\tpublic const int HIGH_IDLE;\n\t\tpublic const int DEFAULT_IDLE;\n\t\tpublic const int LOW;\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_main_context_ref\", unref_function = \"g_main_context_unref\")]\n\tpublic class MainContext {\n\t\tpublic MainContext ();\n\t\tpublic static unowned MainContext @default ();\n\t\tpublic bool iteration (bool may_block);\n\t\tpublic bool pending ();\n\t\tpublic unowned Source find_source_by_id (uint source_id);\n\t\tpublic unowned Source find_source_by_user_data (void* user_data);\n\t\tpublic unowned Source find_source_by_funcs_user_data (SourceFuncs funcs, void* user_data);\n\t\tpublic void wakeup ();\n\t\tpublic bool acquire ();\n\t\tpublic void release ();\n\t\tpublic bool is_owner ();\n\t\tpublic bool wait (Cond cond, Mutex mutex);\n\t\tpublic bool prepare (out int priority);\n\t\tpublic int query (int max_priority, out int timeout_, PollFD[] fds);\n\t\t[CCode (array_length = false)]\n\t\tpublic int check (int max_priority, PollFD[] fds, int n_fds);\n\t\tpublic void dispatch ();\n\t\tpublic void set_poll_func (PollFunc func);\n\t\tpublic PollFunc get_poll_func ();\n\t\tpublic void add_poll (ref PollFD fd, int priority);\n\t\tpublic void remove_poll (ref PollFD fd);\n\t\tpublic int depth ();\n\t\t[CCode (cname = \"g_main_current_source\")]\n\t\tpublic static unowned Source current_source ();\n\t\tpublic static unowned MainContext? get_thread_default ();\n\t\tpublic static MainContext ref_thread_default ();\n\t\tpublic void push_thread_default ();\n\t\tpublic void pop_thread_default ();\n\t\t[CCode (cname = \"g_main_context_invoke_full\")]\n\t\tpublic void invoke (owned SourceFunc function, [CCode (pos = 0.1)] int priority = Priority.DEFAULT);\n\t\tpublic void invoke_full (int priority, owned SourceFunc function);\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate int PollFunc (PollFD[] ufds, int timeout_);\n\n\t[CCode (cname = \"GSource\")]\n\tpublic class TimeoutSource : Source {\n\t\tpublic TimeoutSource (uint interval);\n\t\tpublic TimeoutSource.seconds (uint interval);\n\t}\n\n\tnamespace Timeout {\n\t\t[CCode (cname = \"g_timeout_add_full\")]\n\t\tpublic static uint add (uint interval, owned SourceFunc function, [CCode (pos = 0.1)] int priority = Priority.DEFAULT);\n\t\tpublic static uint add_full (int priority, uint interval, owned SourceFunc function);\n\t\t[CCode (cname = \"g_timeout_add_seconds_full\")]\n\t\tpublic static uint add_seconds (uint interval, owned SourceFunc function, [CCode (pos = 0.1)] int priority = Priority.DEFAULT);\n\t\tpublic static uint add_seconds_full (int priority, uint interval, owned SourceFunc function);\n\t}\n\n\t[CCode (cname = \"GSource\")]\n\tpublic class IdleSource : Source {\n\t\tpublic IdleSource ();\n\t}\n\n\tnamespace Idle {\n\t\t[CCode (cname = \"g_idle_add_full\")]\n\t\tpublic static uint add (owned SourceFunc function, [CCode (pos = 0.1)] int priority = Priority.DEFAULT_IDLE);\n\t\tpublic static uint add_full (int priority, owned SourceFunc function);\n\t\tpublic static bool remove_by_data (void* data);\n\t}\n\n\t[CCode (type_id = \"G_TYPE_INT\", marshaller_type_name = \"INT\", get_value_function = \"g_value_get_int\", set_value_function = \"g_value_set_int\", default_value = \"0\")]\n\t[IntegerType (rank = 6)]\n\tpublic struct Pid : int {\n\t}\n\n\tpublic delegate void ChildWatchFunc (Pid pid, int status);\n\n\t[CCode (cname = \"GSource\")]\n\tpublic class ChildWatchSource : Source {\n\t\tpublic ChildWatchSource (Pid pid);\n\t}\n\n\tnamespace ChildWatch {\n\t\t[CCode (cname = \"g_child_watch_add_full\")]\n\t\tpublic static uint add (Pid pid, owned ChildWatchFunc function, [CCode (pos = 0.1)] int priority = Priority.DEFAULT_IDLE);\n\t\tpublic static uint add_full (int priority, Pid pid, owned ChildWatchFunc function);\n\t}\n\n\tpublic struct PollFD {\n\t\tpublic int fd;\n\t\tpublic IOCondition events;\n\t\tpublic IOCondition revents;\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_source_ref\", unref_function = \"g_source_unref\")]\n\tpublic abstract class Source {\n\t\tprotected Source ();\n\t\tpublic void set_funcs (SourceFuncs funcs);\n\t\tpublic uint attach (MainContext? context);\n\t\tpublic void destroy ();\n\t\tpublic bool is_destroyed ();\n\t\tpublic void set_priority (int priority);\n\t\tpublic int get_priority ();\n\t\tpublic void set_can_recurse (bool can_recurse);\n\t\tpublic bool get_can_recurse ();\n\t\tpublic uint get_id ();\n\t\tpublic unowned string? get_name ();\n\t\tpublic void set_name (string? name);\n\t\tpublic static void set_name_by_id (uint tag, string? name);\n\t\tpublic unowned MainContext get_context ();\n\t\tpublic void set_callback (owned SourceFunc func);\n\t\tpublic void set_callback_indirect (void* callback_data, SourceCallbackFuncs callback_funcs);\n\t\tpublic void* add_unix_fd (int fd, IOCondition events);\n\t\tpublic void remove_unix_fd (void* tag);\n\t\tpublic void modify_unix_fd (void* tag, IOCondition new_events);\n\t\tpublic IOCondition query_unix_fd (void* tag);\n\t\tpublic void add_poll (ref PollFD fd);\n\t\tpublic void remove_poll (ref PollFD fd);\n\t\tpublic void add_child_source (Source child_source);\n\t\tpublic void remove_child_source (Source child_source);\n\t\tpublic int64 get_time ();\n\t\t[Deprecated (since = \"2.28\", replacement = \"get_time\")]\n\t\tpublic void get_current_time (out TimeVal timeval);\n\t\tpublic void set_ready_time (int64 ready_time);\n\t\tpublic int64 get_ready_time ();\n\t\tpublic static bool remove (uint id);\n\t\tpublic static bool remove_by_funcs_user_data (void* user_data);\n\t\tpublic static bool remove_by_user_data (void* user_data);\n#if GLIB_2_32\n\t\t[CCode (cname = \"G_SOURCE_CONTINUE\")]\n\t\tpublic static const bool CONTINUE;\n\t\t[CCode (cname = \"G_SOURCE_REMOVE\")]\n\t\tpublic static const bool REMOVE;\n#endif\n\n\t\tprotected abstract bool prepare (out int timeout_);\n\t\tprotected abstract bool check ();\n\t\tprotected abstract bool dispatch (SourceFunc _callback);\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate void SourceDummyMarshal ();\n\n\t[CCode (has_target = false)]\n\tpublic delegate bool SourcePrepareFunc (Source source, out int timeout_);\n\t[CCode (has_target = false)]\n\tpublic delegate bool SourceCheckFunc (Source source);\n\t[CCode (has_target = false)]\n\tpublic delegate bool SourceDispatchFunc (Source source, SourceFunc _callback);\n\t[CCode (has_target = false)]\n\tpublic delegate void SourceFinalizeFunc (Source source);\n\n\tpublic struct SourceFuncs {\n\t\tpublic SourcePrepareFunc prepare;\n\t\tpublic SourceCheckFunc check;\n\t\tpublic SourceDispatchFunc dispatch;\n\t\tpublic SourceFinalizeFunc finalize;\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate void SourceCallbackRefFunc (void* cb_data);\n\t[CCode (has_target = false)]\n\tpublic delegate void SourceCallbackUnrefFunc (void* cb_data);\n\t[CCode (has_target = false)]\n\tpublic delegate void SourceCallbackGetFunc (void* cb_data, Source source, SourceFunc func);\n\n\t[Compact]\n\tpublic class SourceCallbackFuncs {\n\t\tpublic SourceCallbackRefFunc @ref;\n\t\tpublic SourceCallbackUnrefFunc unref;\n\t\tpublic SourceCallbackGetFunc @get;\n\t}\n\n\tpublic delegate bool SourceFunc ();\n\n\tpublic errordomain ThreadError {\n\t\tAGAIN\n\t}\n\n\t/* Thread support */\n\n\t[CCode (scope = \"async\")]\n\tpublic delegate G ThreadFunc<G> ();\n\tpublic delegate void Func<G> (G data);\n\n\tpublic uint get_num_processors ();\n\n\t[CCode (has_type_id = false)]\n\tpublic enum ThreadPriority {\n\t\tLOW,\n\t\tNORMAL,\n\t\tHIGH,\n\t\tURGENT\n\t}\n\n\t[Compact]\n#if GLIB_2_32\n\t[CCode (ref_function = \"g_thread_ref\", unref_function = \"g_thread_unref\")]\n#endif\n\tpublic class Thread<T> {\n#if GLIB_2_32\n\t\tpublic Thread (string? name, owned ThreadFunc<T> func);\n\t\t[CCode (cname = \"g_thread_try_new\")]\n\t\tpublic Thread.try (string? name, owned ThreadFunc<T> func) throws GLib.Error;\n#endif\n\t\tpublic static bool supported ();\n\t\t[Deprecated (since = \"2.32\", replacement = \"new Thread<T> ()\")]\n\t\t[CCode (simple_generics = true)]\n\t\tpublic static unowned Thread<T> create<T> (owned ThreadFunc<T> func, bool joinable) throws ThreadError;\n\t\t[Deprecated (since = \"2.32\", replacement = \"new Thread<T> ()\")]\n\t\t[CCode (simple_generics = true)]\n\t\tpublic static unowned Thread<T> create_full<T> (owned ThreadFunc<T> func, ulong stack_size, bool joinable, bool bound, ThreadPriority priority) throws ThreadError;\n\t\t[CCode (simple_generics = true)]\n\t\tpublic static unowned Thread<T> self<T> ();\n\t\t[DestroysInstance]\n\t\tpublic T join ();\n\t\t[Deprecated (since = \"2.32\")]\n\t\tpublic void set_priority (ThreadPriority priority);\n\t\tpublic static void yield ();\n\t\tpublic static void exit (T retval);\n\t\t[Deprecated (since = \"2.32\")]\n\t\tpublic static void @foreach (Func<Thread> thread_func);\n\n\t\t[CCode (cname = \"g_usleep\")]\n\t\tpublic static void usleep (ulong microseconds);\n\t}\n\n#if GLIB_2_32\n\t[CCode (destroy_function = \"g_mutex_clear\", lvalue_access = false)]\n\tpublic struct Mutex {\n#else\n\t[Compact]\n\t[CCode (free_function = \"g_mutex_free\")]\n\t[Deprecated (since = \"glib-2.32\", replacement = \"Mutex (with --target-glib=2.32)\")]\n\tpublic class Mutex {\n#endif\n\t\tpublic Mutex ();\n\t\tpublic void @lock ();\n\t\tpublic bool trylock ();\n\t\tpublic void unlock ();\n\t}\n\n\t[CCode (destroy_function = \"g_rec_mutex_clear\")]\n\tpublic struct RecMutex {\n\t\tpublic RecMutex ();\n\t\tpublic void lock ();\n\t\tpublic bool trylock ();\n\t\tpublic void unlock ();\n\t}\n\n\t[CCode (destroy_function = \"g_rw_lock_clear\")]\n\tpublic struct RWLock {\n\t\tpublic RWLock ();\n\t\tpublic void writer_lock ();\n\t\tpublic bool writer_trylock ();\n\t\tpublic void writer_unlock ();\n\t\tpublic void reader_lock ();\n\t\tpublic bool reader_trylock ();\n\t\tpublic void reader_unlock ();\n\t}\n\n\t[CCode (destroy_function = \"g_static_mutex_free\", default_value = \"G_STATIC_MUTEX_INIT\")]\n\t[Deprecated (since = \"glib-2.32\", replacement = \"Mutex\")]\n\tpublic struct StaticMutex {\n\t\tpublic StaticMutex ();\n\t\tpublic void lock ();\n\t\tpublic bool trylock ();\n\t\tpublic void unlock ();\n\t\tpublic void lock_full ();\n\t}\n\n\t[CCode (destroy_function = \"g_static_rec_mutex_free\", default_value = \"G_STATIC_REC_MUTEX_INIT\")]\n\t[Deprecated (since = \"glib-2.32\", replacement = \"RecMutex\")]\n\tpublic struct StaticRecMutex {\n\t\tpublic StaticRecMutex ();\n\t\tpublic void lock ();\n\t\tpublic bool trylock ();\n\t\tpublic void unlock ();\n\t\tpublic void lock_full ();\n\t}\n\n\t[CCode (destroy_function = \"g_static_rw_lock_free\", default_value = \"G_STATIC_RW_LOCK_INIT\")]\n\t[Deprecated (since = \"glib-2.32\", replacement = \"RWLock\")]\n\tpublic struct StaticRWLock {\n\t\tpublic StaticRWLock ();\n\t\tpublic void reader_lock ();\n\t\tpublic bool reader_trylock ();\n\t\tpublic void reader_unlock ();\n\t\tpublic void writer_lock ();\n\t\tpublic bool writer_trylock ();\n\t\tpublic void writer_unlock ();\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"\", unref_function = \"\")]\n\tpublic class Private {\n\t\tpublic Private (DestroyNotify? destroy_func = null);\n\t\tpublic void* get ();\n\t\tpublic void set (void* data);\n\t\tpublic void replace (void* data);\n\t}\n\n\t[CCode (destroy_function = \"g_static_private_free\", default_value = \"G_STATIC_PRIVATE_INIT\")]\n\t[Deprecated (since = \"glib-2.32\")]\n\tpublic struct StaticPrivate {\n\t\tpublic StaticPrivate ();\n\t\tpublic void* get ();\n\t\tpublic void set (void* data, DestroyNotify? destroy_func);\n\t}\n\n#if GLIB_2_32\n\t[CCode (destroy_function = \"g_cond_clear\", lvalue_access = false)]\n\tpublic struct Cond {\n#else\n\t[Compact]\n\t[CCode (free_function = \"g_cond_free\")]\n\t[Deprecated (since = \"glib-2.32\", replacement = \"Cond (with --target-glib=2.32)\")]\n\tpublic class Cond {\n#endif\n\t\tpublic Cond ();\n\t\tpublic void @signal ();\n\t\tpublic void broadcast ();\n\t\tpublic void wait (Mutex mutex);\n\t\t[Deprecated (since = \"2.32\", replacement = \"wait_until\")]\n\t\tpublic bool timed_wait (Mutex mutex, TimeVal abs_time);\n\t\tpublic bool wait_until (Mutex mutex, int64 end_time);\n\t}\n\n\t[CCode (cname = \"GThreadFunc\")]\n\tpublic delegate G OnceFunc<G> ();\n\n\t[CCode (default_value = \"G_ONCE_INIT\")]\n\tpublic struct Once<G> {\n\t\t[CCode (cname = \"g_once\")]\n\t\tpublic unowned G once (OnceFunc<G> function);\n\t\tpublic static bool init_enter ([CCode (ctype=\"volatile gsize *\")] size_t *value);\n\t\tpublic static void init_leave ([CCode (ctype=\"volatile gsize *\")] size_t *value, size_t set_value);\n\t\tpublic OnceStatus status;\n\t}\n\n\t[CCode (cprefix = \"G_ONCE_STATUS_\", has_type_id = false)]\n\tpublic enum OnceStatus {\n\t\tNOTCALLED,\n\t\tPROGRESS,\n\t\tREADY\n\t}\n\n\t/* Thread Pools */\n\n\t[CCode (cname = \"GFunc\")]\n\tpublic delegate void ThreadPoolFunc<G> (owned G data);\n\n\t[Compact]\n\t[CCode (free_function = \"g_thread_pool_free\")]\n\tpublic class ThreadPool<T> {\n\t\t[Deprecated (since = \"vala-0.18\", replacement = \"ThreadPool.with_owned_data\")]\n\t\tpublic ThreadPool (Func<T> func, int max_threads, bool exclusive) throws ThreadError;\n\t\t[CCode (cname = \"g_thread_pool_new\")]\n\t\tpublic ThreadPool.with_owned_data (ThreadPoolFunc<T> func, int max_threads, bool exclusive) throws ThreadError;\n\t\t[Deprecated (since = \"vala-0.18\", replacement = \"add\")]\n\t\tpublic void push (T data) throws ThreadError;\n\t\t[CCode (cname = \"g_thread_pool_push\")]\n\t\tpublic void add (owned T data) throws ThreadError;\n\t\tpublic void set_max_threads (int max_threads) throws ThreadError;\n\t\tpublic int get_max_threads ();\n\t\tpublic uint get_num_threads ();\n\t\tpublic uint unprocessed ();\n\t\t[CCode (cname = \"g_thread_pool_free\")]\n\t\tvoid _free (bool immediate, bool wait);\n\t\t[CCode (cname = \"vala__g_thread_pool_free_wrapper\")]\n\t\tpublic static void free (owned ThreadPool? pool, bool immediate, bool wait) {\n\t\t\tThreadPool* ptr = (owned) pool;\n\t\t\tif (ptr != null) {\n\t\t\t\t((ThreadPool)ptr)._free (immediate, wait);\n\t\t\t}\n\t\t}\n\t\tpublic static void set_max_unused_threads (int max_threads);\n\t\tpublic static int get_max_unused_threads ();\n\t\tpublic static uint get_num_unused_threads ();\n\t\tpublic static void stop_unused_threads ();\n\t\tpublic void set_sort_function (CompareDataFunc<T> func);\n\t\tpublic static void set_max_idle_time (uint interval);\n\t\tpublic static uint get_max_idle_time ();\n\t}\n\n\t/* Asynchronous Queues */\n\n\t[Compact]\n\t[CCode (ref_function = \"g_async_queue_ref\", unref_function = \"g_async_queue_unref\")]\n\tpublic class AsyncQueue<G> {\n\t\t[CCode (cname = \"g_async_queue_new_full\", simple_generics = true)]\n\t\tpublic AsyncQueue ();\n\t\tpublic void push (owned G data);\n\t\tpublic void push_sorted (owned G data, CompareDataFunc<G> func);\n\t\tpublic G pop ();\n\t\tpublic G? try_pop ();\n\t\tpublic G? timed_pop (ref TimeVal end_time);\n\t\tpublic int length ();\n\t\tpublic void sort (CompareDataFunc<G> func);\n\t\tpublic void @lock ();\n\t\tpublic void unlock ();\n\t\tpublic void ref_unlocked ();\n\t\tpublic void unref_and_unlock ();\n\t\tpublic void push_unlocked (owned G data);\n\t\tpublic void push_sorted_unlocked (owned G data, CompareDataFunc<G> func);\n\t\tpublic G pop_unlocked ();\n\t\tpublic G? try_pop_unlocked ();\n\t\tpublic G? timed_pop_unlocked (ref TimeVal end_time);\n\t\tpublic int length_unlocked ();\n\t\tpublic void sort_unlocked (CompareDataFunc<G> func);\n\t}\n\n\t/* Memory Allocation */\n\n\tpublic static void* malloc (size_t n_bytes);\n\tpublic static void* malloc0 (size_t n_bytes);\n\tpublic static void* realloc (void* mem, size_t n_bytes);\n\n\tpublic static void* try_malloc (size_t n_bytes);\n\tpublic static void* try_malloc0 (size_t n_bytes);\n\tpublic static void* try_realloc (void* mem, size_t n_bytes);\n\n\tpublic static void free (void* mem);\n\n\tpublic class MemVTable {\n\t}\n\n\t[CCode (cname = \"glib_mem_profiler_table\")]\n\tpublic static MemVTable mem_profiler_table;\n\n\tpublic static void mem_set_vtable (MemVTable vtable);\n\tpublic static void mem_profile ();\n\n\t[CCode (cheader_filename = \"string.h\")]\n\tnamespace Memory {\n\t\t[CCode (cname = \"memcmp\")]\n\t\tpublic static int cmp (void* s1, void* s2, size_t n);\n\t\t[CCode (cname = \"memcpy\")]\n\t\tpublic static void* copy (void* dest, void* src, size_t n);\n\t\t[CCode (cname = \"memset\")]\n\t\tpublic static void* set (void* dest, int src, size_t n);\n\t\t[CCode (cname = \"g_memmove\")]\n\t\tpublic static void* move (void* dest, void* src, size_t n);\n\t\t[CCode (cname = \"g_memdup\")]\n\t\tpublic static void* dup (void* mem, uint n);\n\t}\n\n\tnamespace Slice {\n\t\tpublic static void* alloc (size_t block_size);\n\t\tpublic static void* alloc0 (size_t block_size);\n\t\tpublic static void* copy (size_t block_size, void* mem_block);\n\t\t[CCode (cname = \"g_slice_free1\")]\n\t\tpublic static void free (size_t block_size, void* mem_block);\n\t\tpublic static void free_chain_with_offset (size_t block_size, void *mem_chain, size_t next_offset);\n\t\tpublic static int64 get_config (SliceConfig ckey);\n\t\t[CCode (array_length_cname = \"n_values\", array_length_type = \"guint\")]\n\t\tpublic static int64[] get_config_state (SliceConfig ckey, int64 address);\n\t\tpublic static void set_config (SliceConfig ckey, int64 value);\n\t}\n\n\t[CCode (cprefix = \"G_SLICE_CONFIG_\", has_type_id = false)]\n\tpublic enum SliceConfig {\n\t\tALWAYS_MALLOC,\n\t\tBYPASS_MAGAZINES,\n\t\tWORKING_SET_MSECS,\n\t\tCOLOR_INCREMENT,\n\t\tCHUNK_SIZES,\n\t\tCONTENTION_COUNTER\n\t}\n\n\t/* IO Channels */\n\n\t[Compact]\n\t[CCode (ref_function = \"g_io_channel_ref\", unref_function = \"g_io_channel_unref\")]\n\tpublic class IOChannel {\n\t\t[CCode (cname = \"g_io_channel_unix_new\")]\n\t\tpublic IOChannel.unix_new (int fd);\n\t\tpublic int unix_get_fd ();\n\t\t[CCode (cname = \"g_io_channel_win32_new_fd\")]\n\t\tpublic IOChannel.win32_new_fd (int fd);\n\t\t[CCode (cname = \"g_io_channel_win32_new_socket\")]\n\t\tpublic IOChannel.win32_socket (int socket);\n\t\t[CCode (cname = \"g_io_channel_win32_new_messages\")]\n\t\tpublic IOChannel.win32_messages (size_t hwnd);\n\t\tpublic void init ();\n\t\tpublic IOChannel.file (string filename, string mode) throws FileError;\n\t\tpublic IOStatus read_chars (char[] buf, out size_t bytes_read) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus read_unichar (out unichar thechar) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus read_line (out string str_return, out size_t length, out size_t terminator_pos) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus read_line_string (StringBuilder buffer, out size_t terminator_pos) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus read_to_end (out string str_return, out size_t length) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus write_chars (char[] buf, out size_t bytes_written) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus write_unichar (unichar thechar) throws ConvertError, IOChannelError;\n\t\tpublic IOStatus flush () throws IOChannelError;\n\t\tpublic IOStatus seek_position (int64 offset, SeekType type) throws IOChannelError;\n\t\tpublic IOStatus shutdown (bool flush) throws IOChannelError;\n\t\t[CCode (cname = \"g_io_create_watch\")]\n\t\tpublic IOSource create_watch (IOCondition condition);\n\t\t[CCode (cname = \"g_io_add_watch\")]\n\t\tpublic uint add_watch (IOCondition condition, IOFunc func);\n\t\t[CCode (cname = \"g_io_add_watch_full\")]\n\t\tpublic uint add_watch_full (int priority, IOCondition condition, owned IOFunc func);\n\t\tpublic size_t get_buffer_size ();\n\t\tpublic void set_buffer_size (size_t size);\n\t\tpublic IOCondition get_buffer_condition ();\n\t\tpublic IOFlags get_flags ();\n\t\tpublic IOStatus set_flags (IOFlags flags) throws IOChannelError;\n\t\tpublic unowned string get_line_term (out int length);\n\t\tpublic void set_line_term (string line_term, int length);\n\t\tpublic bool get_buffered ();\n\t\tpublic void set_buffered (bool buffered);\n\t\tpublic unowned string get_encoding ();\n\t\tpublic IOStatus set_encoding (string? encoding) throws IOChannelError;\n\t\tpublic bool get_close_on_unref ();\n\t\tpublic void set_close_on_unref (bool do_close);\n\t}\n\n\t[Compact]\n\t[CCode (cname = \"GSource\")]\n\tpublic class IOSource : Source {\n\t\t[CCode (cname = \"g_io_create_watch\")]\n\t\tpublic IOSource (IOChannel channel, IOCondition condition);\n\t\t[CCode (cname = \"g_source_set_callback\")]\n\t\tpublic void set_callback ([CCode (type = \"GSourceFunc\")] owned IOFunc func);\n\t}\n\n\t[CCode (cprefix = \"G_SEEK_\", has_type_id = false)]\n\tpublic enum SeekType {\n\t\tCUR,\n\t\tSET,\n\t\tEND\n\t}\n\n\t[CCode (has_type_id = false)]\n\tpublic enum IOStatus {\n\t\tERROR,\n\t\tNORMAL,\n\t\tEOF,\n\t\tAGAIN\n\t}\n\n\tpublic errordomain IOChannelError {\n\t\tFBIG,\n\t\tINVAL,\n\t\tIO,\n\t\tISDIR,\n\t\tNOSPC,\n\t\tNXIO,\n\t\tOVERFLOW,\n\t\tPIPE,\n\t\tFAILED\n\t}\n\n\t[Flags]\n\t[CCode (cprefix = \"G_IO_\")]\n\tpublic enum IOCondition {\n\t\tIN,\n\t\tOUT,\n\t\tPRI,\n\t\tERR,\n\t\tHUP,\n\t\tNVAL\n\t}\n\n\tpublic delegate bool IOFunc (IOChannel source, IOCondition condition);\n\n\t[CCode (cprefix = \"G_IO_FLAG_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum IOFlags {\n\t\tAPPEND,\n\t\tNONBLOCK,\n\t\tIS_READABLE,\n\t\tIS_WRITABLE,\n\t\tIS_WRITEABLE,\n\t\tIS_SEEKABLE,\n\t\tMASK,\n\t\tGET_MASK,\n\t\tSET_MASK\n\t}\n\n\t/* Error Reporting */\n\n\t[Compact]\n\t[ErrorBase]\n\t[CCode (copy_function = \"g_error_copy\", free_function = \"g_error_free\")]\n\tpublic class Error {\n\t\t[PrintfFormat]\n\t\tpublic Error (Quark domain, int code, string format, ...);\n\t\tpublic Error copy ();\n\t\tpublic bool matches (Quark domain, int code);\n\n\t\tpublic Quark domain;\n\t\tpublic int code;\n\t\tpublic string message;\n\t}\n\n\t/* Message Output and Debugging Functions */\n\n\t[PrintfFormat]\n\tpublic static void print (string format, ...);\n\tpublic static void set_print_handler (PrintFunc func);\n\t[CCode (has_target = false)]\n\tpublic delegate void PrintFunc (string text);\n\t[PrintfFormat]\n\tpublic static void printerr (string format, ...);\n\tpublic static void set_printerr_handler (PrintFunc func);\n\n\tpublic static void return_if_fail (bool expr);\n\t[CCode (sentinel = \"\")]\n\tpublic static void return_val_if_fail (bool expr, ...);\n\t[NoReturn]\n\tpublic static void return_if_reached ();\n\t[NoReturn]\n\t[CCode (sentinel = \"\")]\n\tpublic static void return_val_if_reached (...);\n\tpublic static void warn_if_fail (bool expr);\n\tpublic static void warn_if_reached ();\n\n\t[Assert]\n\tpublic static void assert (bool expr);\n\t[Assert]\n\tpublic static void assert_false (bool expr);\n\t[Assert]\n\tpublic static void assert_true (bool expr);\n\t[Assert]\n\tpublic static void assert_null (void* expr);\n\t[Assert]\n\tpublic static void assert_nonnull (void* expr);\n\t[NoReturn]\n\tpublic static void assert_not_reached ();\n\n\tpublic static void on_error_query (string? prg_name = null);\n\tpublic static void on_error_stack_trace (string? prg_name = null);\n\t[CCode (cname = \"G_BREAKPOINT\")]\n\tpublic static void breakpoint ();\n\n\t/* Message Logging */\n\n\t[CCode (cprefix = \"G_LOG_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum LogLevelFlags {\n\t\t/* log flags */\n\t\tFLAG_RECURSION,\n\t\tFLAG_FATAL,\n\n\t\t/* GLib log levels */\n\t\tLEVEL_ERROR,\n\t\tLEVEL_CRITICAL,\n\t\tLEVEL_WARNING,\n\t\tLEVEL_MESSAGE,\n\t\tLEVEL_INFO,\n\t\tLEVEL_DEBUG,\n\n\t\tLEVEL_MASK\n\t}\n\n\tpublic void logv (string? log_domain, LogLevelFlags log_level, string format, va_list args);\n\t[Diagnostics]\n\t[PrintfFormat]\n\tpublic void log (string? log_domain, LogLevelFlags log_level, string format, ...);\n\n\t[Diagnostics]\n\t[PrintfFormat]\n\tpublic void message (string format, ...);\n\t[Diagnostics]\n\t[PrintfFormat]\n\tpublic void warning (string format, ...);\n\t[Diagnostics]\n\t[PrintfFormat]\n\tpublic void critical (string format, ...);\n\t[Diagnostics]\n\t[PrintfFormat]\n\t[NoReturn]\n\tpublic void error (string format, ...);\n\t[Diagnostics]\n\t[PrintfFormat]\n\tpublic void debug (string format, ...);\n\t[Diagnostics]\n\t[PrintfFormat]\n\tpublic void info (string format, ...);\n\n\tpublic delegate void LogFunc (string? log_domain, LogLevelFlags log_levels, string message);\n\n\tnamespace Log {\n\t\tpublic static uint set_handler (string? log_domain, LogLevelFlags log_levels, LogFunc log_func);\n\t\tpublic static void set_default_handler (LogFunc log_func);\n\t\t[CCode (delegate_target = false)]\n\t\tpublic static GLib.LogFunc default_handler;\n\t\tpublic static LogLevelFlags set_fatal_mask (string log_domain, LogLevelFlags log_levels);\n\t\tpublic static LogLevelFlags set_always_fatal (LogLevelFlags log_levels);\n\t\tpublic static void remove_handler (string? log_domain, uint handler_id);\n\n\t\tpublic const string FILE;\n\t\tpublic const int LINE;\n\t\tpublic const string METHOD;\n\t}\n\n\t[CCode (has_type_id = false)]\n\tpublic struct DebugKey {\n\t\tunowned string key;\n\t\tuint value;\n\t}\n\n\tpublic uint parse_debug_string (string? debug_string, DebugKey[] keys);\n\n\t/* String Utility Functions */\n\n\tpublic void strfreev (string** str_array);\n\tpublic uint strv_length ([CCode (array_length = false, array_null_terminated = true)] string[] str_array);\n\tpublic bool strv_contains ([CCode (array_length = false, array_null_terminated = true)] string[] str_array, string str);\n\n\t[CCode (cname = \"errno\", cheader_filename = \"errno.h\")]\n\tpublic int errno;\n\tpublic unowned string strerror (int errnum);\n\n\t/* Character Set Conversions */\n\n\tpublic static string convert (string str, ssize_t len, string to_codeset, string from_codeset, out size_t bytes_read = null, out size_t bytes_written = null) throws ConvertError;\n\tpublic static bool get_charset (out unowned string charset);\n\tpublic static bool get_filename_charsets ([CCode (array_length = false, array_null_terminated = true)] out unowned string[] charsets);\n\n\t[SimpleType]\n\tpublic struct IConv {\n\t\tpublic static IConv open (string to_codeset, string from_codeset);\n\t\t[CCode (cname = \"g_iconv\")]\n\t\tpublic uint iconv (out string inbuf, out uint inbytes_left, out string outbuf, out uint outbytes_left);\n\t\tpublic int close ();\n\t}\n\n\tnamespace Filename {\n\t\tpublic static string to_utf8 (string opsysstring, ssize_t len, out size_t bytes_read, out size_t bytes_written) throws ConvertError;\n\t\tpublic static string from_utf8 (string utf8string, ssize_t len, out size_t bytes_read, out size_t bytes_written) throws ConvertError;\n\t\tpublic static string from_uri (string uri, out string hostname = null) throws ConvertError;\n\t\tpublic static string to_uri (string filename, string? hostname = null) throws ConvertError;\n\t\tpublic static string display_name (string filename);\n\t\tpublic static string display_basename (string filename);\n\t}\n\n\tpublic errordomain ConvertError {\n\t\tNO_CONVERSION,\n\t\tILLEGAL_SEQUENCE,\n\t\tFAILED,\n\t\tPARTIAL_INPUT,\n\t\tBAD_URI,\n\t\tNOT_ABSOLUTE_PATH\n\t}\n\n\t/* Base64 Encoding */\n\n\tnamespace Base64 {\n\t\tpublic static size_t encode_step (uchar[] _in, bool break_lines, char* _out, ref int state, ref int save);\n\t\tpublic static size_t encode_close (bool break_lines, char* _out, ref int state, ref int save);\n\t\tpublic static string encode (uchar[] data);\n\t\tpublic static size_t decode_step (char[] _in, uchar* _out, ref int state, ref uint save);\n\t\t[CCode (array_length_type = \"size_t\")]\n\t\tpublic static uchar[] decode (string text);\n\t}\n\n\t/* Data Checksums */\n\n\t[CCode (cprefix = \"G_CHECKSUM_\", has_type_id = false)]\n\tpublic enum ChecksumType {\n\t\tMD5,\n\t\tSHA1,\n\t\tSHA256,\n\t\tSHA512;\n\n\t\tpublic ssize_t get_length ();\n\t}\n\n\t[Compact]\n\t[CCode (free_function = \"g_checksum_free\")]\n\tpublic class Checksum {\n\t\tpublic Checksum (ChecksumType checksum_type);\n\t\tpublic Checksum copy ();\n\t\tpublic void update ([CCode (array_length = false)] uchar[] data, size_t length);\n\t\tpublic unowned string get_string ();\n\t\tpublic void get_digest ([CCode (array_length = false)] uint8[] buffer, ref size_t digest_len);\n\t\t[CCode (cname = \"g_compute_checksum_for_data\")]\n\t\tpublic static string compute_for_data (ChecksumType checksum_type, uchar[] data);\n\t\t[CCode (cname = \"g_compute_checksum_for_string\")]\n\t\tpublic static string compute_for_string (ChecksumType checksum_type, string str, size_t length = -1);\n\t\t[CCode (cname = \"g_compute_checksum_for_bytes\")]\n\t\tpublic static string compute_for_bytes (ChecksumType checksum_type, Bytes data);\n\t}\n\n\t/* Secure HMAC Digests */\n\n\t[Compact]\n\t[CCode (ref_function = \"g_hmac_ref\", unref_function = \"g_hmac_unref\")]\n\tpublic class Hmac {\n\t\tpublic Hmac (ChecksumType digest_type, [CCode (array_length_type = \"gsize\")] uint8[] key);\n\t\tpublic Hmac copy ();\n\t\tpublic void update ([CCode (array_length_type = \"gssize\")] uint8[] data);\n\t\tpublic unowned string get_string ();\n\t\tpublic void get_digest ([CCode (array_length = false)] uint8[] buffer, ref size_t digest_len);\n\t\t[CCode (cname = \"g_compute_hmac_for_data\")]\n\t\tpublic static string compute_for_data (ChecksumType checksum_type, uint8[] key, uint8[] data);\n\t\t[CCode (cname = \"g_compute_hmac_for_string\")]\n\t\tpublic static string compute_for_string (ChecksumType checksum_type, uint8[] key, string str, size_t length = -1);\n\t}\n\n\t/* Date and Time Functions */\n\n\t[CCode (has_type_id = false)]\n\tpublic struct TimeVal {\n\t\tpublic long tv_sec;\n\t\tpublic long tv_usec;\n\n\t\t[CCode (cname = \"g_get_current_time\")]\n\t\tpublic TimeVal ();\n\t\t[CCode (cname = \"g_get_current_time\")]\n\t\tpublic void get_current_time ();\n\t\tpublic void add (long microseconds);\n\t\t[CCode (instance_pos = -1)]\n\t\tpublic bool from_iso8601 (string iso_date);\n\t\tpublic string to_iso8601 ();\n\t}\n\n\tpublic static int64 get_monotonic_time ();\n\tpublic static int64 get_real_time ();\n\n\tpublic struct DateDay : uchar {\n\t\t[CCode (cname = \"G_DATE_BAD_DAY\")]\n\t\tpublic static DateDay BAD_DAY;\n\n\t\t[CCode (cname = \"g_date_valid_day\")]\n\t\tpublic bool valid ();\n\t}\n\n\t[CCode (cprefix = \"G_DATE_\", has_type_id = false)]\n\tpublic enum DateMonth {\n\t\tBAD_MONTH,\n\t\tJANUARY,\n\t\tFEBRUARY,\n\t\tMARCH,\n\t\tAPRIL,\n\t\tMAY,\n\t\tJUNE,\n\t\tJULY,\n\t\tAUGUST,\n\t\tSEPTEMBER,\n\t\tOCTOBER,\n\t\tNOVEMBER,\n\t\tDECEMBER;\n\n\t\t[CCode (cname = \"g_date_get_days_in_month\")]\n\t\tpublic uchar get_days_in_month (DateYear year);\n\t\t[CCode (cname = \"g_date_valid_month\")]\n\t\tpublic bool valid ();\n\t}\n\n\tpublic struct DateYear : ushort {\n\t\t[CCode (cname = \"G_DATE_BAD_YEAR\")]\n\t\tpublic static DateDay BAD_YEAR;\n\n\t\t[CCode (cname = \"g_date_is_leap_year\")]\n\t\tpublic bool is_leap_year ();\n\t\t[CCode (cname = \"g_date_get_monday_weeks_in_year\")]\n\t\tpublic uchar get_monday_weeks_in_year ();\n\t\t[CCode (cname = \"g_date_get_sunday_weeks_in_year\")]\n\t\tpublic uchar get_sunday_weeks_in_year ();\n\t\t[CCode (cname = \"g_date_valid_year\")]\n\t\tpublic bool valid ();\n\t}\n\n\t[CCode (cprefix = \"G_DATE_\", has_type_id = false)]\n\tpublic enum DateWeekday {\n\t\tBAD_WEEKDAY,\n\t\tMONDAY,\n\t\tTUESDAY,\n\t\tWEDNESDAY,\n\t\tTHURSDAY,\n\t\tFRIDAY,\n\t\tSATURDAY,\n\t\tSUNDAY;\n\n\t\t[CCode (cname = \"g_date_valid_weekday\")]\n\t\tpublic bool valid ();\n\t}\n\n\t[CCode (cprefix = \"G_DATE_\", has_type_id = false)]\n\tpublic enum DateDMY {\n\t\tDAY,\n\t\tMONTH,\n\t\tYEAR\n\t}\n\n\t[CCode (type_id = \"G_TYPE_DATE\")]\n\tpublic struct Date {\n\t\tpublic void clear (uint n_dates = 1);\n\t\tpublic void set_day (DateDay day);\n\t\tpublic void set_month (DateMonth month);\n\t\tpublic void set_year (DateYear year);\n\t\tpublic void set_dmy (DateDay day, int month, DateYear y);\n\t\tpublic void set_julian (uint julian_day);\n\t\tpublic void set_time_t (time_t timet);\n\t\tpublic void set_time_val (TimeVal timeval);\n\t\tpublic void set_parse (string str);\n\t\tpublic void add_days (uint n_days);\n\t\tpublic void subtract_days (uint n_days);\n\t\tpublic void add_months (uint n_months);\n\t\tpublic void subtract_months (uint n_months);\n\t\tpublic void add_years (uint n_years);\n\t\tpublic void subtract_years (uint n_years);\n\t\tpublic int days_between (Date date2);\n\t\tpublic int compare (Date rhs);\n\t\tpublic void clamp (Date min_date, Date max_date);\n\t\tpublic void order (Date date2);\n\t\tpublic DateDay get_day ();\n\t\tpublic DateMonth get_month ();\n\t\tpublic DateYear get_year ();\n\t\tpublic uint get_julian ();\n\t\tpublic DateWeekday get_weekday ();\n\t\tpublic uint get_day_of_year ();\n\t\tpublic bool is_first_of_month ();\n\t\tpublic bool is_last_of_month ();\n\t\tpublic uint get_monday_week_of_year ();\n\t\tpublic uint get_sunday_week_of_year ();\n\t\tpublic uint get_iso8601_week_of_year ();\n\t\t[CCode (instance_pos = -1)]\n\t\tpublic size_t strftime (char[] s, string format);\n\t\t[CCode (cname = \"g_date_to_struct_tm\")]\n\t\tpublic void to_time (out Time tm);\n\t\tpublic bool valid ();\n\t\tpublic static uchar get_days_in_month (DateMonth month, DateYear year);\n\t\tpublic static bool valid_day (DateDay day);\n\t\tpublic static bool valid_dmy (DateDay day, DateMonth month, DateYear year);\n\t\tpublic static bool valid_julian (uint julian_date);\n\t\tpublic static bool valid_weekday (DateWeekday weekday);\n\t}\n\n\t[CCode (cname = \"struct tm\", cheader_filename = \"time.h\", has_type_id = false)]\n\tpublic struct Time {\n\t\t[CCode (cname = \"tm_sec\")]\n\t\tpublic int second;\n\t\t[CCode (cname = \"tm_min\")]\n\t\tpublic int minute;\n\t\t[CCode (cname = \"tm_hour\")]\n\t\tpublic int hour;\n\t\t[CCode (cname = \"tm_mday\")]\n\t\tpublic int day;\n\t\t[CCode (cname = \"tm_mon\")]\n\t\tpublic int month;\n\t\t[CCode (cname = \"tm_year\")]\n\t\tpublic int year;\n\t\t[CCode (cname = \"tm_wday\")]\n\t\tpublic int weekday;\n\t\t[CCode (cname = \"tm_yday\")]\n\t\tpublic int day_of_year;\n\t\t[CCode (cname = \"tm_isdst\")]\n\t\tpublic int isdst;\n\n\t\t[CCode (cname = \"gmtime_r\")]\n\t\tstatic void gmtime_r (ref time_t time, out Time result);\n\t\t[CCode (cname = \"localtime_r\")]\n\t\tstatic void localtime_r (ref time_t time, out Time result);\n\n\t\tpublic static Time gm (time_t time) {\n\t\t\tTime result;\n\t\t\tgmtime_r (ref time, out result);\n\t\t\treturn result;\n\t\t}\n\t\tpublic static Time local (time_t time) {\n\t\t\tTime result;\n\t\t\tlocaltime_r (ref time, out result);\n\t\t\treturn result;\n\t\t}\n\n\t\tpublic string to_string () {\n\t\t\treturn \"%04d-%02d-%02d %02d:%02d:%02d\".printf (year + 1900, month + 1, day, hour, minute, second);\n\t\t}\n\n\t\tpublic string format (string format) {\n\t\t\tvar buffer = new char[64];\n\t\t\tthis.strftime (buffer, format);\n\t\t\treturn (string) buffer;\n\t\t}\n\n\t\t[CCode (cname = \"mktime\")]\n\t\tpublic time_t mktime ();\n\n\t\t[CCode (cname = \"strftime\", instance_pos = -1)]\n\t\tpublic size_t strftime (char[] s, string format);\n\t\t[CCode (cname = \"strptime\", instance_pos = -1)]\n\t\tpublic unowned string? strptime (string buf, string format);\n\t}\n\n\t[SimpleType]\n\t[CCode (cheader_filename = \"glib.h\", type_id = \"G_TYPE_INT64\", marshaller_type_name = \"INT64\", get_value_function = \"g_value_get_int64\", set_value_function = \"g_value_set_int64\", default_value = \"0LL\", type_signature = \"x\")]\n\t[IntegerType (rank = 10)]\n\tpublic struct TimeSpan : int64 {\n\t\tpublic const TimeSpan DAY;\n\t\tpublic const TimeSpan HOUR;\n\t\tpublic const TimeSpan MINUTE;\n\t\tpublic const TimeSpan SECOND;\n\t\tpublic const TimeSpan MILLISECOND;\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_date_time_ref\", unref_function = \"g_date_time_unref\", type_id = \"G_TYPE_DATE_TIME\")]\n\tpublic class DateTime {\n\t\tpublic DateTime.now (TimeZone tz);\n\t\tpublic DateTime.now_local ();\n\t\tpublic DateTime.now_utc ();\n\t\tpublic DateTime.from_unix_local (int64 t);\n\t\tpublic DateTime.from_unix_utc (int64 t);\n\t\tpublic DateTime.from_timeval_local (TimeVal tv);\n\t\tpublic DateTime.from_timeval_utc (TimeVal tv);\n\t\tpublic DateTime (TimeZone tz, int year, int month, int day, int hour, int minute, double seconds);\n\t\tpublic DateTime.local (int year, int month, int day, int hour, int minute, double seconds);\n\t\tpublic DateTime.utc (int year, int month, int day, int hour, int minute, double seconds);\n\t\tpublic DateTime add (TimeSpan timespan);\n\t\tpublic DateTime add_years (int years);\n\t\tpublic DateTime add_months (int months);\n\t\tpublic DateTime add_weeks (int weeks);\n\t\tpublic DateTime add_days (int days);\n\t\tpublic DateTime add_hours (int hours);\n\t\tpublic DateTime add_minutes (int minutes);\n\t\tpublic DateTime add_seconds (double seconds);\n\t\tpublic DateTime add_full (int years, int months, int days, int hours = 0, int minutes = 0, double seconds = 0);\n\t\tpublic int compare (DateTime dt);\n\t\tpublic TimeSpan difference (DateTime begin);\n\t\tpublic uint hash ();\n\t\tpublic bool equal (DateTime dt);\n\t\tpublic void get_ymd (out int year, out int month, out int day);\n\t\tpublic int get_year ();\n\t\tpublic int get_month ();\n\t\tpublic int get_day_of_month ();\n\t\tpublic int get_week_numbering_year ();\n\t\tpublic int get_week_of_year ();\n\t\tpublic int get_day_of_week ();\n\t\tpublic int get_day_of_year ();\n\t\tpublic int get_hour ();\n\t\tpublic int get_minute ();\n\t\tpublic int get_second ();\n\t\tpublic int get_microsecond ();\n\t\tpublic double get_seconds ();\n\t\tpublic int64 to_unix ();\n\t\tpublic bool to_timeval (out TimeVal tv);\n\t\tpublic TimeSpan get_utc_offset ();\n\t\tpublic unowned string get_timezone_abbreviation ();\n\t\tpublic bool is_daylight_savings ();\n\t\tpublic DateTime to_timezone (TimeZone tz);\n\t\tpublic DateTime to_local ();\n\t\tpublic DateTime to_utc ();\n\t\tpublic string format (string format);\n\t\tpublic string to_string () {\n\t\t\treturn this.format (\"%FT%H:%M:%S%z\");\n\t\t}\n\t}\n\n\tpublic enum TimeType {\n\t\tSTANDARD,\n\t\tDAYLIGHT,\n\t\tUNIVERSAL\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_time_zone_ref\", unref_function = \"g_time_zone_unref\")]\n\tpublic class TimeZone {\n\t\tpublic TimeZone (string identifier);\n\t\tpublic TimeZone.utc ();\n\t\tpublic TimeZone.local ();\n\t\tpublic int find_interval (TimeType type, int64 time);\n\t\tpublic int adjust_time (TimeType type, ref int64 time);\n\t\tpublic unowned string get_abbreviation (int interval);\n\t\tpublic int32 get_offset (int interval);\n\t\tpublic bool is_dst (int interval);\n\t}\n\n\t/* Random Numbers */\n\n\t[Compact]\n\t[CCode (copy_function = \"g_rand_copy\", free_function = \"g_rand_free\")]\n\tpublic class Rand {\n\t\tpublic Rand.with_seed (uint32 seed);\n\t\tpublic Rand.with_seed_array ([CCode (array_length = false)] uint32[] seed, uint seed_length);\n\t\tpublic Rand ();\n\t\tpublic void set_seed (uint32 seed);\n\t\tpublic void set_seed_array ([CCode (array_length = false)] uint32[] seed, uint seed_length);\n\t\tpublic bool boolean ();\n\t\t[CCode (cname = \"g_rand_int\")]\n\t\tpublic uint32 next_int ();\n\t\tpublic int32 int_range (int32 begin, int32 end);\n\t\t[CCode (cname = \"g_rand_double\")]\n\t\tpublic double next_double ();\n\t\tpublic double double_range (double begin, double end);\n\t}\n\n\tnamespace Random {\n\t\tpublic static void set_seed (uint32 seed);\n\t\tpublic static bool boolean ();\n\t\t[CCode (cname = \"g_random_int\")]\n\t\tpublic static uint32 next_int ();\n\t\tpublic static int32 int_range (int32 begin, int32 end);\n\t\t[CCode (cname = \"g_random_double\")]\n\t\tpublic static double next_double ();\n\t\tpublic static double double_range (double begin, double end);\n\t}\n\n\t/* Miscellaneous Utility Functions */\n\n\tnamespace Environment {\n\t\t[CCode (cname = \"g_get_application_name\")]\n\t\tpublic static unowned string? get_application_name ();\n\t\t[CCode (cname = \"g_set_application_name\")]\n\t\tpublic static void set_application_name (string application_name);\n\t\t[CCode (cname = \"g_get_prgname\")]\n\t\tpublic static unowned string get_prgname ();\n\t\t[CCode (cname = \"g_set_prgname\")]\n\t\tpublic static void set_prgname (string application_name);\n\t\t[CCode (cname = \"g_getenv\")]\n\t\tpublic static unowned string? get_variable (string variable);\n\t\t[CCode (cname = \"g_setenv\")]\n\t\tpublic static bool set_variable (string variable, string value, bool overwrite);\n\t\t[CCode (cname = \"g_unsetenv\")]\n\t\tpublic static void unset_variable (string variable);\n\t\t[CCode (cname = \"g_listenv\", array_length = false, array_null_terminated = true)]\n\t\tpublic static string[] list_variables ();\n\t\t[CCode (cname = \"g_get_user_name\")]\n\t\tpublic static unowned string get_user_name ();\n\t\t[CCode (cname = \"g_get_real_name\")]\n\t\tpublic static unowned string get_real_name ();\n\t\t[CCode (cname = \"g_get_user_cache_dir\")]\n\t\tpublic static unowned string get_user_cache_dir ();\n\t\t[CCode (cname = \"g_get_user_data_dir\")]\n\t\tpublic static unowned string get_user_data_dir ();\n\t\t[CCode (cname = \"g_get_user_config_dir\")]\n\t\tpublic static unowned string get_user_config_dir ();\n\t\t[CCode (cname = \"g_get_user_special_dir\")]\n\t\tpublic static unowned string get_user_special_dir (UserDirectory directory);\n\t\t[CCode (cname = \"g_get_system_data_dirs\", array_length = false, array_null_terminated = true)]\n\t\tpublic static unowned string[] get_system_data_dirs ();\n\t\t[CCode (cname = \"g_get_system_config_dirs\", array_length = false, array_null_terminated = true)]\n\t\tpublic static unowned string[] get_system_config_dirs ();\n\t\t[CCode (cname = \"g_get_host_name\")]\n\t\tpublic static unowned string get_host_name ();\n\t\t[CCode (cname = \"g_get_home_dir\")]\n\t\tpublic static unowned string get_home_dir ();\n\t\t[CCode (cname = \"g_get_tmp_dir\")]\n\t\tpublic static unowned string get_tmp_dir ();\n\t\t[CCode (cname = \"g_get_current_dir\")]\n\t\tpublic static string get_current_dir ();\n\t\t[CCode (cname = \"g_find_program_in_path\")]\n\t\tpublic static string? find_program_in_path (string program);\n\t\t[Deprecated (since = \"2.32\")]\n\t\t[CCode (cname = \"g_atexit\")]\n\t\tpublic static void atexit (VoidFunc func);\n\t\t[CCode (cname = \"g_chdir\")]\n\t\tpublic static int set_current_dir (string path);\n\t}\n\n\tnamespace Environ {\n\t\t[CCode (cname = \"g_get_environ\", array_length = false, array_null_terminated = true)]\n\t\tpublic static string[] get ();\n\t\t[CCode (cname = \"g_environ_getenv\")]\n\t\tpublic static unowned string? get_variable ([CCode (array_length = false, array_null_terminated = true)] string[]? envp, string variable);\n\t\t[CCode (cname = \"g_environ_setenv\", array_length = false, array_null_terminated = true)]\n\t\tpublic static string[] set_variable ([CCode (array_length = false, array_null_terminated = true)] owned string[]? envp, string variable, string value, bool overwrite = true);\n\t\t[CCode (cname = \"g_environ_unsetenv\", array_length = false, array_null_terminated = true)]\n\t\tpublic static string[] unset_variable ([CCode (array_length = false, array_null_terminated = true)] owned string[]? envp, string variable);\n\t}\n\n\t[CCode (has_type_id = false)]\n\tpublic enum UserDirectory {\n\t\tDESKTOP,\n\t\tDOCUMENTS,\n\t\tDOWNLOAD,\n\t\tMUSIC,\n\t\tPICTURES,\n\t\tPUBLIC_SHARE,\n\t\tTEMPLATES,\n\t\tVIDEOS,\n\t\t[CCode (cname = \"G_USER_N_DIRECTORIES\")]\n\t\tN_DIRECTORIES\n\t}\n\n\tnamespace Path {\n\t\tpublic static bool is_absolute (string file_name);\n\t\tpublic static unowned string skip_root (string file_name);\n\t\tpublic static string get_basename (string file_name);\n\t\tpublic static string get_dirname (string file_name);\n\t\t[CCode (cname = \"g_build_filename\")]\n\t\tpublic static string build_filename (string first_element, ...);\n\t\t[CCode (cname = \"g_build_path\")]\n\t\tpublic static string build_path (string separator, string first_element, ...);\n\n\t\t[CCode (cname = \"G_DIR_SEPARATOR\")]\n\t\tpublic const char DIR_SEPARATOR;\n\t\t[CCode (cname = \"G_DIR_SEPARATOR_S\")]\n\t\tpublic const string DIR_SEPARATOR_S;\n\t\t[CCode (cname = \"G_IS_DIR_SEPARATOR\")]\n\t\tpublic static bool is_dir_separator (unichar c);\n\t\t[CCode (cname = \"G_SEARCHPATH_SEPARATOR\")]\n\t\tpublic const char SEARCHPATH_SEPARATOR;\n\t\t[CCode (cname = \"G_SEARCHPATH_SEPARATOR_S\")]\n\t\tpublic const string SEARCHPATH_SEPARATOR_S;\n\t}\n\n\tnamespace Bit {\n\t\tpublic static int nth_lsf (ulong mask, int nth_bit);\n\t\tpublic static int nth_msf (ulong mask, int nth_bit);\n\t\tpublic static uint storage (ulong number);\n\t}\n\n\tnamespace SpacedPrimes {\n\t\tpublic static uint closest (uint num);\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate void FreeFunc (void* data);\n\t[CCode (has_target = false)]\n\tpublic delegate void VoidFunc ();\n\n\t[Deprecated (since = \"2.16\", replacement = \"format_size\")]\n\tpublic string format_size_for_display (int64 size);\n\n\t[CCode (cname = \"g_format_size_full\")]\n\tpublic string format_size (uint64 size, FormatSizeFlags flags = FormatSizeFlags.DEFAULT);\n\n\t[CCode (cprefix = \"G_FORMAT_SIZE_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum FormatSizeFlags {\n\t\tDEFAULT,\n\t\tLONG_FORMAT,\n\t\tIEC_UNITS\n\t}\n\n\t/* Lexical Scanner */\n\t[CCode (has_target = false)]\n\tpublic delegate void ScannerMsgFunc (Scanner scanner, string message, bool error);\n\n\t[Compact]\n\t[CCode (free_function = \"g_scanner_destroy\")]\n\tpublic class Scanner {\n\t\tpublic unowned string input_name;\n\t\tpublic TokenType token;\n\t\tpublic TokenValue value;\n\t\tpublic uint line;\n\t\tpublic uint position;\n\t\tpublic TokenType next_token;\n\t\tpublic TokenValue next_value;\n\t\tpublic uint next_line;\n\t\tpublic uint next_position;\n\t\tpublic ScannerMsgFunc msg_handler;\n\t\tpublic ScannerConfig? config;\n\t\tpublic Scanner (ScannerConfig? config_templ);\n\t\tpublic void input_file (int input_fd);\n\t\tpublic void sync_file_offset ();\n\t\tpublic void input_text (string text, uint text_len);\n\t\tpublic TokenType peek_next_token ();\n\t\tpublic TokenType get_next_token ();\n\t\tpublic bool eof ();\n\t\tpublic int cur_line ();\n\t\tpublic int cur_position ();\n\t\tpublic TokenType cur_token ();\n\t\tpublic TokenValue cur_value ();\n\t\tpublic uint set_scope (uint scope_id);\n\t\tpublic void scope_add_symbol (uint scope_id, string symbol, void* value);\n\t\tpublic void scope_foreach_symbol (uint scope_id, HFunc func);\n\t\tpublic void* scope_lookup_symbol (uint scope_id, string symbol);\n\t\tpublic void scope_remove_symbol (uint scope_id, string symbol);\n\t\tpublic void* lookup_symbol (string symbol);\n\t\t[PrintfFormat]\n\t\tpublic void warn (string format, ...);\n\t\t[PrintfFormat]\n\t\tpublic void error (string format, ...);\n\t\tpublic void unexp_token (TokenType expected_token, string? identifier_spec, string? symbol_spec, string? symbol_name, string? message, bool is_error);\n\t}\n\n\tpublic struct ScannerConfig {\n\t\tpublic string* cset_skip_characters;\n\t\tpublic string* cset_identifier_first;\n\t\tpublic string* cset_identifier_nth;\n\t\tpublic string* cpair_comment_single;\n\t\tpublic bool case_sensitive;\n\t\tpublic bool skip_comment_multi;\n\t\tpublic bool skip_comment_single;\n\t\tpublic bool scan_comment_multi;\n\t\tpublic bool scan_identifier;\n\t\tpublic bool scan_identifier_1char;\n\t\tpublic bool scan_identifier_NULL;\n\t\tpublic bool scan_symbols;\n\t\tpublic bool scan_binary;\n\t\tpublic bool scan_octal;\n\t\tpublic bool scan_float;\n\t\tpublic bool scan_hex;\n\t\tpublic bool scan_hex_dollar;\n\t\tpublic bool scan_string_sq;\n\t\tpublic bool scan_string_dq;\n\t\tpublic bool numbers_2_int;\n\t\tpublic bool int_2_float;\n\t\tpublic bool identifier_2_string;\n\t\tpublic bool char_2_token;\n\t\tpublic bool symbol_2_token;\n\t\tpublic bool scope_0_fallback;\n\t\tpublic bool store_int64;\n\t}\n\n\t[CCode (lower_case_cprefix=\"G_CSET_\")]\n\tnamespace CharacterSet {\n\t\tpublic const string A_2_Z;\n\t\tpublic const string a_2_z;\n\t\tpublic const string DIGITS;\n\t\tpublic const string LATINC;\n\t\tpublic const string LATINS;\n\t}\n\n\t[CCode (cprefix = \"G_TOKEN_\", has_type_id = false)]\n\tpublic enum TokenType {\n\t\tEOF,\n\t\tLEFT_PAREN,\n\t\tRIGHT_PAREN,\n\t\tLEFT_CURLY,\n\t\tRIGHT_CURLY,\n\t\tLEFT_BRACE,\n\t\tRIGHT_BRACE,\n\t\tEQUAL_SIGN,\n\t\tCOMMA,\n\t\tNONE,\n\t\tERROR,\n\t\tCHAR,\n\t\tBINARY,\n\t\tOCTAL,\n\t\tINT,\n\t\tHEX,\n\t\tFLOAT,\n\t\tSTRING,\n\t\tSYMBOL,\n\t\tIDENTIFIER,\n\t\tIDENTIFIER_NULL,\n\t\tCOMMENT_SINGLE,\n\t\tCOMMENT_MULTI,\n\t\tLAST\n\t}\n\n\t[SimpleType]\n\tpublic struct TokenValue {\n\t\t[CCode (cname=\"v_symbol\")]\n\t\tpublic void* symbol;\n\t\t[CCode (cname=\"v_identifier\")]\n\t\tpublic unowned string identifier;\n\t\t[CCode (cname=\"v_binary\")]\n\t\tpublic ulong binary;\n\t\t[CCode (cname=\"v_octal\")]\n\t\tpublic ulong octal;\n\t\t[CCode (cname=\"v_int\")]\n\t\tpublic ulong int;\n\t\t[CCode (cname=\"v_int64\")]\n\t\tpublic ulong int64;\n\t\t[CCode (cname=\"v_float\")]\n\t\tpublic double float;\n\t\t[CCode (cname=\"v_hex\")]\n\t\tpublic ulong hex;\n\t\t[CCode (cname=\"v_string\")]\n\t\tpublic unowned string string;\n\t\t[CCode (cname=\"v_comment\")]\n\t\tpublic unowned string comment;\n\t\t[CCode (cname=\"v_char\")]\n\t\tpublic uchar char;\n\t\t[CCode (cname=\"v_error\")]\n\t\tpublic uint error;\n\t}\n\n\t[CCode (cprefix = \"G_ERR_\", has_type_id = false)]\n\tpublic enum ErrorType {\n\t\tUNKNOWN,\n\t\tUNEXP_EOF,\n\t\tUNEXP_EOF_IN_STRING,\n\t\tUNEXP_EOF_IN_COMMENT,\n\t\tNON_DIGIT_IN_CONST,\n\t\tDIGIT_RADIX,\n\t\tFLOAT_RADIX,\n\t\tFLOAT_MALFORMED\n\t}\n\n\t/* Automatic String Completion */\n\n\t[Deprecated (since = \"2.26\")]\n\t[Compact]\n\t[CCode (free_function = \"g_completion_free\")]\n\tpublic class Completion {\n\t\tpublic Completion (CompletionFunc? func = null);\n\t\tpublic List<void*> items;\n\t\tpublic CompletionFunc func;\n\t\tpublic string prefix;\n\t\tpublic List<void*> cache;\n\t\tpublic CompletionStrncmpFunc strncmp_func;\n\t\tpublic void add_items (List<void*> items);\n\t\tpublic void remove_items (List<void*> items);\n\t\tpublic void clear_items ();\n\t\tpublic unowned List<void*> complete (string prefix, out string? new_prefix = null);\n\t\tpublic unowned List<void*> complete_utf8 (string prefix, out string? new_prefix = null);\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate string CompletionFunc (void* item);\n\t[CCode (has_target = false)]\n\tpublic delegate int CompletionStrncmpFunc (string s1, string s2, size_t n);\n\n\t/* Timers */\n\n\t[Compact]\n\t[CCode (free_function = \"g_timer_destroy\")]\n\tpublic class Timer {\n\t\tpublic Timer ();\n\t\tpublic void start ();\n\t\tpublic void stop ();\n\t\tpublic void @continue ();\n\t\tpublic double elapsed (out ulong microseconds = null);\n\t\tpublic void reset ();\n\t}\n\n\t/* Spawning Processes */\n\n\tpublic errordomain SpawnError {\n\t\tFORK,\n\t\tREAD,\n\t\tCHDIR,\n\t\tACCES,\n\t\tPERM,\n\t\tTOO_BIG,\n\t\tNOEXEC,\n\t\tNAMETOOLONG,\n\t\tNOENT,\n\t\tNOMEM,\n\t\tNOTDIR,\n\t\tLOOP,\n\t\tTXTBUSY,\n\t\tIO,\n\t\tNFILE,\n\t\tMFILE,\n\t\tINVAL,\n\t\tISDIR,\n\t\tLIBBAD,\n\t\tFAILED\n\t}\n\n\t[CCode (cprefix = \"G_SPAWN_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum SpawnFlags {\n\t\tLEAVE_DESCRIPTORS_OPEN,\n\t\tDO_NOT_REAP_CHILD,\n\t\tSEARCH_PATH,\n\t\tSTDOUT_TO_DEV_NULL,\n\t\tSTDERR_TO_DEV_NULL,\n\t\tCHILD_INHERITS_STDIN,\n\t\tFILE_AND_ARGV_ZERO,\n\t\tSEARCH_PATH_FROM_ENVP\n\t}\n\n\tpublic delegate void SpawnChildSetupFunc ();\n\t[CCode (has_target = false, cheader_filename = \"signal.h\")]\n\tpublic delegate void SignalHandlerFunc (int signum);\n\n\tpublic unowned string strsignal (int signum);\n\n\t[CCode (lower_case_cprefix = \"g_\")]\n\tnamespace Process {\n\t\tpublic static bool spawn_async_with_pipes (string? working_directory, [CCode (array_length = false, array_null_terminated = true)] string[] argv, [CCode (array_length = false, array_null_terminated = true)] string[]? envp, SpawnFlags _flags, SpawnChildSetupFunc? child_setup, out Pid child_pid, out int standard_input = null, out int standard_output = null, out int standard_error = null) throws SpawnError;\n\t\tpublic static bool spawn_async (string? working_directory, [CCode (array_length = false, array_null_terminated = true)] string[] argv, [CCode (array_length = false, array_null_terminated = true)] string[]? envp, SpawnFlags _flags, SpawnChildSetupFunc? child_setup, out Pid child_pid) throws SpawnError;\n\t\tpublic static bool spawn_sync (string? working_directory, [CCode (array_length = false, array_null_terminated = true)] string[] argv, [CCode (array_length = false, array_null_terminated = true)] string[]? envp, SpawnFlags _flags, SpawnChildSetupFunc? child_setup, out string standard_output = null, out string standard_error = null, out int exit_status = null) throws SpawnError;\n\t\tpublic static bool spawn_command_line_async (string command_line) throws SpawnError;\n\t\tpublic static bool spawn_command_line_sync (string command_line, out string standard_output = null, out string standard_error = null, out int exit_status = null) throws SpawnError;\n\t\t[CCode (cname = \"g_spawn_close_pid\")]\n\t\tpublic static void close_pid (Pid pid);\n\t\t[CCode (cname = \"g_spawn_check_exit_status\")]\n\t\tpublic static bool check_exit_status (int exit_status) throws GLib.Error;\n\n\t\t/* these macros are required to examine the exit status of a process */\n\t\t[CCode (cname = \"WIFEXITED\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static bool if_exited (int status);\n\t\t[CCode (cname = \"WEXITSTATUS\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static int exit_status (int status);\n\t\t[CCode (cname = \"WIFSIGNALED\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static bool if_signaled (int status);\n\t\t[CCode (cname = \"WTERMSIG\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static ProcessSignal term_sig (int status);\n\t\t[CCode (cname = \"WCOREDUMP\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static bool core_dump (int status);\n\t\t[CCode (cname = \"WIFSTOPPED\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static bool if_stopped (int status);\n\t\t[CCode (cname = \"WSTOPSIG\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static ProcessSignal stop_sig (int status);\n\t\t[CCode (cname = \"WIFCONTINUED\", cheader_filename = \"sys/wait.h\")]\n\t\tpublic static bool if_continued (int status);\n\n\t\t[NoReturn]\n\t\t[CCode (cname = \"abort\", cheader_filename = \"stdlib.h\")]\n\t\tpublic void abort ();\n\t\t[NoReturn]\n\t\t[CCode (cname = \"exit\", cheader_filename = \"stdlib.h\")]\n\t\tpublic void exit (int status);\n\t\t[CCode (cname = \"raise\", cheader_filename = \"signal.h\")]\n\t\tpublic int raise (ProcessSignal sig);\n\t\t[CCode (cname = \"signal\", cheader_filename = \"signal.h\")]\n\t\tpublic SignalHandlerFunc @signal (ProcessSignal signum, SignalHandlerFunc handler);\n\t}\n\n\t[CCode (cname = \"int\", has_type_id = false, cheader_filename = \"signal.h\", cprefix = \"SIG\")]\n\tpublic enum ProcessSignal {\n\t\tHUP,\n\t\tINT,\n\t\tQUIT,\n\t\tILL,\n\t\tTRAP,\n\t\tABRT,\n\t\tBUS,\n\t\tFPE,\n\t\tKILL,\n\t\tSEGV,\n\t\tPIPE,\n\t\tALRM,\n\t\tTERM,\n\t\tUSR1,\n\t\tUSR2,\n\t\tCHLD,\n\t\tCONT,\n\t\tSTOP,\n\t\tTSTP,\n\t\tTTIN,\n\t\tTTOU\n\t}\n\n\n\t/* File Utilities */\n\n\tpublic errordomain FileError {\n\t\tEXIST,\n\t\tISDIR,\n\t\tACCES,\n\t\tNAMETOOLONG,\n\t\tNOENT,\n\t\tNOTDIR,\n\t\tNXIO,\n\t\tNODEV,\n\t\tROFS,\n\t\tTXTBSY,\n\t\tFAULT,\n\t\tLOOP,\n\t\tNOSPC,\n\t\tNOMEM,\n\t\tMFILE,\n\t\tNFILE,\n\t\tBADF,\n\t\tINVAL,\n\t\tPIPE,\n\t\tAGAIN,\n\t\tINTR,\n\t\tIO,\n\t\tPERM,\n\t\tNOSYS,\n\t\tFAILED\n\t}\n\n\t[CCode (has_type_id = false)]\n\t[Flags]\n\tpublic enum FileTest {\n\t\tIS_REGULAR,\n\t\tIS_SYMLINK,\n\t\tIS_DIR,\n\t\tIS_EXECUTABLE,\n\t\tEXISTS\n\t}\n\n\t[CCode (cname = \"int\", cprefix = \"SEEK_\", has_type_id = false)]\n\tpublic enum FileSeek {\n\t\tSET,\n\t\tCUR,\n\t\tEND\n\t}\n\n\t[Compact]\n\t[CCode (cname = \"FILE\", free_function = \"fclose\", cheader_filename = \"stdio.h\")]\n\tpublic class FileStream {\n\t\t[CCode (cname = \"EOF\", cheader_filename = \"stdio.h\")]\n\t\tpublic const int EOF;\n\n\t\t[CCode (cname = \"g_fopen\", cheader_filename = \"glib/gstdio.h\")]\n\t\tpublic static FileStream? open (string path, string mode);\n\t\t[CCode (cname = \"fdopen\")]\n\t\tpublic static FileStream? fdopen (int fildes, string mode);\n\t\t[CCode (cname = \"fprintf\")]\n\t\t[PrintfFormat ()]\n\t\tpublic void printf (string format, ...);\n\t\t[CCode (cname = \"vfprintf\")]\n\t\tpublic void vprintf (string format, va_list args);\n\t\t[CCode (cname = \"fputc\", instance_pos = -1)]\n\t\tpublic void putc (char c);\n\t\t[CCode (cname = \"fputs\", instance_pos = -1)]\n\t\tpublic void puts (string s);\n\t\t[CCode (cname = \"fgetc\")]\n\t\tpublic int getc ();\n\t\t[CCode (cname = \"ungetc\", instance_pos = -1)]\n\t\tpublic int ungetc (int c);\n\t\t[CCode (cname = \"fgets\", instance_pos = -1)]\n\t\tpublic unowned string? gets (char[] s);\n\t\t[CCode (cname = \"feof\")]\n\t\tpublic bool eof ();\n\t\t[CCode (cname = \"fscanf\"), ScanfFormat]\n\t\tpublic int scanf (string format, ...);\n\t\t[CCode (cname = \"fflush\")]\n\t\tpublic int flush ();\n\t\t[CCode (cname = \"fseek\")]\n\t\tpublic int seek (long offset, FileSeek whence);\n\t\t[CCode (cname = \"ftell\")]\n\t\tpublic long tell ();\n\t\t[CCode (cname = \"rewind\")]\n\t\tpublic void rewind ();\n\t\t[CCode (cname = \"fileno\")]\n\t\tpublic int fileno ();\n\t\t[CCode (cname = \"ferror\")]\n\t\tpublic int error ();\n\t\t[CCode (cname = \"clearerr\")]\n\t\tpublic void clearerr ();\n\t\t[CCode (cname = \"fread\", instance_pos = -1)]\n\t\tpublic size_t read ([CCode (array_length_pos = 2.1)] uint8[] buf, size_t size = 1);\n\t\t[CCode (cname = \"fwrite\", instance_pos = -1)]\n\t\tpublic size_t write ([CCode (array_length_pos = 2.1)] uint8[] buf, size_t size = 1);\n\n\t\tpublic string? read_line () {\n\t\t\tint c;\n\t\t\tStringBuilder? ret = null;\n\t\t\twhile ((c = getc ()) != EOF) {\n\t\t\t\tif (ret == null) {\n\t\t\t\t\tret = new StringBuilder ();\n\t\t\t\t}\n\t\t\t\tif (c == '\\n') {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t((!)(ret)).append_c ((char) c);\n\t\t\t}\n\t\t\tif (ret == null) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\treturn ((!)(ret)).str;\n\t\t\t}\n\t\t}\n\t}\n\n\t[CCode (cname = \"struct utimbuf\", cheader_filename = \"sys/types.h,utime.h\")]\n\tpublic struct UTimBuf {\n\t\ttime_t actime;       /* access time */\n\t\ttime_t modtime;      /* modification time */\n\t}\n\n\t[CCode (lower_case_cprefix = \"g_file_\", cheader_filename = \"glib/gstdio.h\")]\n\tnamespace FileUtils {\n\t\tpublic static bool get_contents (string filename, out string contents, out size_t length = null) throws FileError;\n\t\tpublic static bool set_contents (string filename, string contents, ssize_t length = -1) throws FileError;\n\t\t[CCode (cname = \"g_file_get_contents\")]\n\t\tpublic static bool get_data (string filename, [CCode (type = \"gchar**\", array_length_type = \"size_t\")] out uint8[] contents) throws FileError;\n\t\t[CCode (cname = \"g_file_set_contents\")]\n\t\tpublic static bool set_data (string filename, [CCode (type = \"const char*\", array_length_type = \"size_t\")] uint8[] contents) throws FileError;\n\t\tpublic static bool test (string filename, FileTest test);\n\t\tpublic static int open_tmp (string tmpl, out string name_used) throws FileError;\n\t\tpublic static string read_link (string filename) throws FileError;\n\t\tpublic static int error_from_errno (int err_no);\n\n\t\t[CCode (cname = \"g_mkstemp\")]\n\t\tpublic static int mkstemp (string tmpl);\n\t\t[CCode (cname = \"g_rename\")]\n\t\tpublic static int rename (string oldfilename, string newfilename);\n\t\t[CCode (cname = \"g_remove\")]\n\t\tpublic static int remove (string filename);\n\t\t[CCode (cname = \"g_unlink\")]\n\t\tpublic static int unlink (string filename);\n\t\t[CCode (cname = \"g_chmod\")]\n\t\tpublic static int chmod (string filename, int mode);\n\t\t[CCode (cname = \"g_utime\")]\n\t\tpublic static int utime (string filename, UTimBuf? times = null);\n\n\t\t[CCode (cname = \"symlink\", cheader_filename = \"unistd.h\")]\n\t\tpublic static int symlink (string oldpath, string newpath);\n\n\t\t[CCode (cname = \"close\", cheader_filename = \"unistd.h\")]\n\t\tpublic static int close (int fd);\n\t}\n\n\t[CCode (cname = \"struct stat\", cheader_filename = \"sys/stat.h,glib/gstdio.h\")]\n\tpublic struct Stat {\n\t\t[CCode (cname = \"g_stat\", instance_pos = -1)]\n\t\tpublic Stat (string filename);\n\t\t[CCode (cname = \"g_lstat\", instance_pos = -1)]\n\t\tpublic Stat.l (string filename);\n\t}\n\n\t[Compact]\n\t[CCode (free_function = \"g_dir_close\")]\n\tpublic class Dir {\n\t\tpublic static Dir open (string filename, uint _flags = 0) throws FileError;\n\t\tpublic unowned string? read_name ();\n\t\tpublic void rewind ();\n\t}\n\n\t[CCode (cheader_filename = \"glib/gstdio.h\")]\n\tnamespace DirUtils {\n\t\t[CCode (cname = \"g_mkdir\")]\n\t\tpublic static int create (string pathname, int mode);\n\t\t[CCode (cname = \"g_mkdir_with_parents\")]\n\t\tpublic static int create_with_parents (string pathname, int mode);\n\t\t[CCode (cname = \"mkdtemp\")]\n\t\tpublic static unowned string mkdtemp (string template);\n\t\t[CCode (cname = \"g_dir_make_tmp\")]\n\t\tpublic static string make_tmp (string tmpl) throws FileError;\n\t\t[CCode (cname = \"g_rmdir\")]\n\t\tpublic static int remove (string filename);\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_mapped_file_ref\", unref_function = \"g_mapped_file_unref\")]\n\tpublic class MappedFile {\n\t\tpublic MappedFile (string filename, bool writable) throws FileError;\n\t\tpublic size_t get_length ();\n\t\tpublic unowned char* get_contents ();\n\t\tpublic Bytes get_bytes ();\n\t}\n\n\t[CCode (cname = \"stdin\", cheader_filename = \"stdio.h\")]\n\tpublic static FileStream stdin;\n\n\t[CCode (cname = \"stdout\", cheader_filename = \"stdio.h\")]\n\tpublic static FileStream stdout;\n\n\t[CCode (cname = \"stderr\", cheader_filename = \"stdio.h\")]\n\tpublic static FileStream stderr;\n\n\t/* URI Functions */\n\n\tnamespace Uri {\n\t\tpublic const string RESERVED_CHARS_ALLOWED_IN_PATH;\n\t\tpublic const string RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT;\n\t\tpublic const string RESERVED_CHARS_ALLOWED_IN_USERINFO;\n\t\tpublic const string RESERVED_CHARS_GENERIC_DELIMITERS;\n\t\tpublic const string RESERVED_CHARS_SUBCOMPONENT_DELIMITERS;\n\n\t\tpublic static string? parse_scheme (string uri);\n\t\tpublic static string escape_string (string unescaped, string? reserved_chars_allowed = null, bool allow_utf8 = true);\n\t\tpublic static string? unescape_string (string escaped_string, string? illegal_characters = null);\n\t\tpublic static string? unescape_segment (string? escaped_string, string? escaped_string_end, string? illegal_characters = null);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic static string[] list_extract_uris (string uri_list);\n\t}\n\n\t/* Shell-related Utilities */\n\n\tpublic errordomain ShellError {\n\t\tBAD_QUOTING,\n\t\tEMPTY_STRING,\n\t\tFAILED\n\t}\n\n\tnamespace Shell {\n\t\tpublic static bool parse_argv (string command_line, [CCode (array_length_pos = 1.9)] out string[] argvp) throws ShellError;\n\t\tpublic static string quote (string unquoted_string);\n\t\tpublic static string unquote (string quoted_string) throws ShellError;\n\t}\n\n\t/* Commandline option parser */\n\n\tpublic errordomain OptionError {\n\t\tUNKNOWN_OPTION,\n\t\tBAD_VALUE,\n\t\tFAILED\n\t}\n\n\t[Compact]\n\t[CCode (free_function = \"g_option_context_free\")]\n\tpublic class OptionContext {\n\t\tpublic OptionContext (string? parameter_string = null);\n\t\tpublic void set_summary (string summary);\n\t\tpublic unowned string get_summary ();\n\t\tpublic void set_description (string description);\n\t\tpublic void get_description ();\n\t\tpublic void set_translate_func (TranslateFunc func, DestroyNotify? destroy_notify);\n\t\tpublic void set_translation_domain (string domain);\n\t\tpublic bool parse ([CCode (array_length_pos = 0.9)] ref unowned string[] argv) throws OptionError;\n\t\tpublic bool parse_strv ([CCode (array_length = false, array_null_terminated = true)] ref string[] argv) throws OptionError;\n\t\tpublic void set_help_enabled (bool help_enabled);\n\t\tpublic bool get_help_enabled ();\n\t\tpublic void set_ignore_unknown_options (bool ignore_unknown);\n\t\tpublic bool get_ignore_unknown_options ();\n\t\tpublic string get_help (bool main_help, OptionGroup? group);\n\t\tpublic void add_main_entries ([CCode (array_length = false)] OptionEntry[] entries, string? translation_domain);\n\t\tpublic void add_group (owned OptionGroup group);\n\t\tpublic void set_main_group (owned OptionGroup group);\n\t\tpublic unowned OptionGroup get_main_group ();\n\t\tpublic void set_strict_posix (bool strict_posix);\n\t\tpublic bool get_strict_posix ();\n\t}\n\n\tpublic delegate unowned string TranslateFunc (string str);\n\n\t[CCode (has_type_id = false)]\n\tpublic enum OptionArg {\n\t\tNONE,\n\t\tSTRING,\n\t\tINT,\n\t\tCALLBACK,\n\t\tFILENAME,\n\t\tSTRING_ARRAY,\n\t\tFILENAME_ARRAY,\n\t\tDOUBLE,\n\t\tINT64\n\t}\n\n\t[Flags]\n\t[CCode (cprefix = \"G_OPTION_FLAG_\", has_type_id = false)]\n\tpublic enum OptionFlags {\n\t\tHIDDEN,\n\t\tIN_MAIN,\n\t\tREVERSE,\n\t\tNO_ARG,\n\t\tFILENAME,\n\t\tOPTIONAL_ARG,\n\t\tNOALIAS\n\t}\n\n\tpublic struct OptionEntry {\n\t\tpublic unowned string long_name;\n\t\tpublic char short_name;\n\t\tpublic int flags;\n\n\t\tpublic OptionArg arg;\n\t\tpublic void* arg_data;\n\n\t\tpublic unowned string description;\n\t\tpublic unowned string? arg_description;\n\t}\n\n\t[Compact]\n\t[CCode (free_function = \"g_option_group_free\")]\n\tpublic class OptionGroup {\n\t\tpublic OptionGroup (string name, string description, string help_description, void* user_data = null, DestroyNotify? destroy = null);\n\t\tpublic void add_entries ([CCode (array_length = false)] OptionEntry[] entries);\n\t\tpublic void set_parse_hooks (OptionParseFunc? pre_parse_func, OptionParseFunc? post_parse_hook);\n\t\tpublic void set_error_hook (OptionErrorFunc? error_func);\n\t\tpublic void set_translate_func (owned TranslateFunc? func);\n\t\tpublic void set_translation_domain (string domain);\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate bool OptionParseFunc (OptionContext context, OptionGroup group, void* data) throws OptionError;\n\t[CCode (has_target = false)]\n\tpublic delegate void OptionErrorFunc (OptionContext context, OptionGroup group, void* data, ref Error error);\n\n\t/* Perl-compatible regular expressions */\n\n\tpublic errordomain RegexError {\n\t\tCOMPILE,\n\t\tOPTIMIZE,\n\t\tREPLACE,\n\t\tMATCH,\n\t\tINTERNAL,\n\t\tSTRAY_BACKSLASH,\n\t\tMISSING_CONTROL_CHAR,\n\t\tUNRECOGNIZED_ESCAPE,\n\t\tQUANTIFIERS_OUT_OF_ORDER,\n\t\tQUANTIFIER_TOO_BIG,\n\t\tUNTERMINATED_CHARACTER_CLASS,\n\t\tINVALID_ESCAPE_IN_CHARACTER_CLASS,\n\t\tRANGE_OUT_OF_ORDER,\n\t\tNOTHING_TO_REPEAT,\n\t\tUNRECOGNIZED_CHARACTER,\n\t\tPOSIX_NAMED_CLASS_OUTSIDE_CLASS,\n\t\tUNMATCHED_PARENTHESIS,\n\t\tINEXISTENT_SUBPATTERN_REFERENCE,\n\t\tUNTERMINATED_COMMENT,\n\t\tEXPRESSION_TOO_LARGE,\n\t\tMEMORY_ERROR,\n\t\tVARIABLE_LENGTH_LOOKBEHIND,\n\t\tMALFORMED_CONDITION,\n\t\tTOO_MANY_CONDITIONAL_BRANCHES,\n\t\tASSERTION_EXPECTED,\n\t\tUNKNOWN_POSIX_CLASS_NAME,\n\t\tPOSIX_COLLATING_ELEMENTS_NOT_SUPPORTED,\n\t\tHEX_CODE_TOO_LARGE,\n\t\tINVALID_CONDITION,\n\t\tSINGLE_BYTE_MATCH_IN_LOOKBEHIND,\n\t\tINFINITE_LOOP,\n\t\tMISSING_SUBPATTERN_NAME_TERMINATOR,\n\t\tDUPLICATE_SUBPATTERN_NAME,\n\t\tMALFORMED_PROPERTY,\n\t\tUNKNOWN_PROPERTY,\n\t\tSUBPATTERN_NAME_TOO_LONG,\n\t\tTOO_MANY_SUBPATTERNS,\n\t\tINVALID_OCTAL_VALUE,\n\t\tTOO_MANY_BRANCHES_IN_DEFINE,\n\t\tDEFINE_REPETION,\n\t\tINCONSISTENT_NEWLINE_OPTIONS,\n\t\tMISSING_BACK_REFERENCE,\n\t\tINVALID_RELATIVE_REFERENCE,\n\t\tBACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN,\n\t\tUNKNOWN_BACKTRACKING_CONTROL_VERB,\n\t\tNUMBER_TOO_BIG,\n\t\tMISSING_SUBPATTERN_NAME,\n\t\tMISSING_DIGIT,\n\t\tINVALID_DATA_CHARACTER,\n\t\tEXTRA_SUBPATTERN_NAME,\n\t\tBACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED,\n\t\tINVALID_CONTROL_CHAR,\n\t\tMISSING_NAME,\n\t\tNOT_SUPPORTED_IN_CLASS,\n\t\tTOO_MANY_FORWARD_REFERENCES,\n\t\tNAME_TOO_LONG,\n\t\tCHARACTER_VALUE_TOO_LARGE\n\t}\n\n\t[CCode (cprefix = \"G_REGEX_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum RegexCompileFlags {\n\t\tCASELESS,\n\t\tMULTILINE,\n\t\tDOTALL,\n\t\tEXTENDED,\n\t\tANCHORED,\n\t\tDOLLAR_ENDONLY,\n\t\tUNGREEDY,\n\t\tRAW,\n\t\tNO_AUTO_CAPTURE,\n\t\tOPTIMIZE,\n\t\tDUPNAMES,\n\t\tNEWLINE_CR,\n\t\tNEWLINE_LF,\n\t\tNEWLINE_CRLF,\n\t\tNEWLINE_ANYCRLF,\n\t\tBSR_ANYCRLF,\n\t\tJAVASCRIPT_COMPAT\n\t}\n\n\t[CCode (cprefix = \"G_REGEX_MATCH_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum RegexMatchFlags {\n\t\tANCHORED,\n\t\tNOTBOL,\n\t\tNOTEOL,\n\t\tNOTEMPTY,\n\t\tPARTIAL,\n\t\tNEWLINE_CR,\n\t\tNEWLINE_LF,\n\t\tNEWLINE_CRLF,\n\t\tNEWLINE_ANY,\n\t\tNEWLINE_ANYCRLF,\n\t\tBSR_ANYCRLF,\n\t\tBSR_ANY,\n\t\tPARTIAL_SOFT,\n\t\tPARTIAL_HARD,\n\t\tNOTEMPTY_ATSTART\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_regex_ref\", unref_function = \"g_regex_unref\", type_id = \"G_TYPE_REGEX\")]\n\tpublic class Regex {\n\t\tpublic Regex (string pattern, RegexCompileFlags compile_options = 0, RegexMatchFlags match_options = 0) throws RegexError;\n\t\tpublic unowned string get_pattern ();\n\t\tpublic RegexCompileFlags get_compile_flags ();\n\t\tpublic RegexMatchFlags get_match_flags ();\n\t\tpublic int get_max_backref ();\n\t\tpublic int get_max_lookbehind ();\n\t\tpublic int get_capture_count ();\n\t\tpublic int get_string_number (string name);\n\t\tpublic static string escape_string (string str, int length = -1);\n\t\tpublic static bool match_simple (string pattern, string str, RegexCompileFlags compile_options = 0, RegexMatchFlags match_options = 0);\n\t\tpublic bool match (string str, RegexMatchFlags match_options = 0, out MatchInfo match_info = null);\n\t\tpublic bool match_full (string str, ssize_t string_len = -1, int start_position = 0, RegexMatchFlags match_options = 0, out MatchInfo match_info = null) throws RegexError;\n\t\tpublic bool match_all (string str, RegexMatchFlags match_options = 0, out MatchInfo match_info = null);\n\t\tpublic bool match_all_full (string str, ssize_t string_len = -1, int start_position = 0, RegexMatchFlags match_options = 0, out MatchInfo match_info = null) throws RegexError;\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic static string[] split_simple (string pattern, string str, RegexCompileFlags compile_options = 0, RegexMatchFlags match_options = 0);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] split (string str, RegexMatchFlags match_options = 0);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] split_full (string str, ssize_t string_len = -1, int start_position = 0, RegexMatchFlags match_options = 0, int max_tokens = 0) throws RegexError;\n\t\tpublic string replace (string str, ssize_t string_len, int start_position, string replacement, RegexMatchFlags match_options = 0) throws RegexError;\n\t\tpublic string replace_literal (string str, ssize_t string_len, int start_position, string replacement, RegexMatchFlags match_options = 0) throws RegexError;\n\t\tpublic string replace_eval (string str, ssize_t string_len, int start_position, RegexMatchFlags match_options, RegexEvalCallback eval) throws RegexError;\n\t\tpublic static bool check_replacement (out bool has_references = null) throws RegexError;\n\t}\n\n\tpublic delegate bool RegexEvalCallback (MatchInfo match_info, StringBuilder result);\n\n\t[Compact]\n#if GLIB_2_30\n\t[CCode (ref_function = \"g_match_info_ref\", unref_function = \"g_match_info_unref\", type_id = \"G_TYPE_MATCH_INFO\")]\n#else\n\t[CCode (free_function = \"g_match_info_free\")]\n#endif\n\tpublic class MatchInfo {\n\t\tpublic unowned Regex get_regex ();\n\t\tpublic unowned string get_string ();\n\t\tpublic bool matches ();\n\t\tpublic bool next () throws RegexError;\n\t\tpublic int get_match_count ();\n\t\tpublic bool is_partial_match ();\n\t\tpublic string expand_references (string string_to_expand) throws RegexError;\n\t\tpublic string? fetch (int match_num);\n\t\tpublic bool fetch_pos (int match_num, out int start_pos, out int end_pos);\n\t\tpublic string? fetch_named (string name);\n\t\tpublic bool fetch_named_pos (string name, out int start_pos, out int end_pos);\n\t\t[CCode (array_length = false, array_null_terminated = true)]\n\t\tpublic string[] fetch_all ();\n\t}\n\n\t/* Simple XML Subset Parser\n\t   See http://live.gnome.org/Vala/MarkupSample for an example */\n\n\tpublic errordomain MarkupError {\n\t\tBAD_UTF8,\n\t\tEMPTY,\n\t\tPARSE,\n\t\tUNKNOWN_ELEMENT,\n\t\tUNKNOWN_ATTRIBUTE,\n\t\tINVALID_CONTENT,\n\t\tMISSING_ATTRIBUTE\n\t}\n\n\t[CCode (cprefix = \"G_MARKUP_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum MarkupParseFlags {\n\t\tTREAT_CDATA_AS_TEXT,\n\t\tPREFIX_ERROR_POSITION\n\t}\n\n\t[Compact]\n#if GLIB_2_36\n\t[CCode (ref_function = \"g_markup_parse_context_ref\", unref_function = \"g_markup_parse_context_unref\", type_id = \"G_TYPE_MARKUP_PARSE_CONTEXT\")]\n#else\n\t[CCode (free_function = \"g_markup_parse_context_free\")]\n#endif\n\tpublic class MarkupParseContext {\n\t\tpublic MarkupParseContext (MarkupParser parser, MarkupParseFlags _flags, void* user_data, DestroyNotify? user_data_dnotify);\n\t\tpublic bool parse (string text, ssize_t text_len) throws MarkupError;\n\t\tpublic bool end_parse () throws MarkupError;\n\t\tpublic unowned string get_element ();\n\t\tpublic unowned SList<string> get_element_stack ();\n\t\tpublic void get_position (out int line_number, out int char_number);\n\t\tpublic void push (MarkupParser parser, void* user_data);\n\t\tpublic void* pop ();\n\t\tpublic void* get_user_data ();\n\t}\n\n\tpublic delegate void MarkupParserStartElementFunc (MarkupParseContext context, string element_name, [CCode (array_length = false, array_null_terminated = true)] string[] attribute_names, [CCode (array_length = false, array_null_terminated = true)] string[] attribute_values) throws MarkupError;\n\n\tpublic delegate void MarkupParserEndElementFunc (MarkupParseContext context, string element_name) throws MarkupError;\n\n\tpublic delegate void MarkupParserTextFunc (MarkupParseContext context, string text, size_t text_len) throws MarkupError;\n\n\tpublic delegate void MarkupParserPassthroughFunc (MarkupParseContext context, string passthrough_text, size_t text_len) throws MarkupError;\n\n\tpublic delegate void MarkupParserErrorFunc (MarkupParseContext context, Error error);\n\n\tpublic struct MarkupParser {\n\t\t[CCode (delegate_target = false)]\n\t\tpublic unowned MarkupParserStartElementFunc start_element;\n\t\t[CCode (delegate_target = false)]\n\t\tpublic unowned MarkupParserEndElementFunc end_element;\n\t\t[CCode (delegate_target = false)]\n\t\tpublic unowned MarkupParserTextFunc text;\n\t\t[CCode (delegate_target = false)]\n\t\tpublic unowned MarkupParserPassthroughFunc passthrough;\n\t\t[CCode (delegate_target = false)]\n\t\tpublic unowned MarkupParserErrorFunc error;\n\t}\n\n\tnamespace Markup {\n\t\t[CCode (cprefix = \"G_MARKUP_COLLECT_\", has_type_id = false)]\n\t\tpublic enum CollectType {\n\t\t\tINVALID,\n\t\t\tSTRING,\n\t\t\tSTRDUP,\n\t\t\tBOOLEAN,\n\t\t\tTRISTATE,\n\t\t\tOPTIONAL\n\t\t}\n\n\t\tpublic static string escape_text (string text, ssize_t length = -1);\n\t\t[PrintfFormat]\n\t\tpublic static string printf_escaped (string format, ...);\n\t\tpublic static string vprintf_escaped (string format, va_list args);\n\t\t[CCode (sentinel = \"G_MARKUP_COLLECT_INVALID\")]\n\t\tpublic static bool collect_attributes (string element_name, string[] attribute_names, string[] attribute_values, ...) throws MarkupError;\n\t}\n\n\t/* Key-value file parser */\n\n\tpublic errordomain KeyFileError {\n\t\tUNKNOWN_ENCODING,\n\t\tPARSE,\n\t\tNOT_FOUND,\n\t\tKEY_NOT_FOUND,\n\t\tGROUP_NOT_FOUND,\n\t\tINVALID_VALUE\n\t}\n\n\t[Compact]\n#if GLIB_2_32\n\t[CCode (ref_function = \"g_key_file_ref\", unref_function = \"g_key_file_unref\", type_id = \"G_TYPE_KEY_FILE\")]\n#else\n\t[CCode (free_function = \"g_key_file_free\")]\n#endif\n\tpublic class KeyFile {\n\t\tpublic KeyFile ();\n\t\tpublic void set_list_separator (char separator);\n\t\tpublic bool load_from_file (string file, KeyFileFlags @flags) throws KeyFileError, FileError;\n\t\tpublic bool load_from_dirs (string file, [CCode (array_length = false, array_null_terminated = true)] string[] search_dirs, out string full_path, KeyFileFlags @flags) throws KeyFileError, FileError;\n\t\tpublic bool load_from_data (string data, size_t length, KeyFileFlags @flags) throws KeyFileError;\n\t\tpublic bool load_from_data_dirs (string file, out string full_path, KeyFileFlags @flags) throws KeyFileError, FileError;\n\t\t// g_key_file_to_data never throws an error according to the documentation\n\t\tpublic string to_data (out size_t length = null, out GLib.Error error = null);\n\t\tpublic string get_start_group ();\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic string[] get_groups ();\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic string[] get_keys (string group_name) throws KeyFileError;\n\t\tpublic bool has_group (string group_name);\n\t\tpublic bool has_key (string group_name, string key) throws KeyFileError;\n\t\tpublic string get_value (string group_name, string key) throws KeyFileError;\n\t\tpublic string get_string (string group_name, string key) throws KeyFileError;\n\t\tpublic string get_locale_string (string group_name, string key, string? locale = null) throws KeyFileError;\n\t\tpublic bool get_boolean (string group_name, string key) throws KeyFileError;\n\t\tpublic int get_integer (string group_name, string key) throws KeyFileError;\n\t\tpublic int64 get_int64 (string group_name, string key) throws KeyFileError;\n\t\tpublic uint64 get_uint64 (string group_name, string key) throws KeyFileError;\n\t\tpublic double get_double (string group_name, string key) throws KeyFileError;\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic string[] get_string_list (string group_name, string key) throws KeyFileError;\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic string[] get_locale_string_list (string group_name, string key, string? locale = null) throws KeyFileError;\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic bool[] get_boolean_list (string group_name, string key) throws KeyFileError;\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic int[] get_integer_list (string group_name, string key) throws KeyFileError;\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic double[] get_double_list (string group_name, string key) throws KeyFileError;\n\t\tpublic string get_comment (string? group_name, string? key) throws KeyFileError;\n\t\tpublic bool save_to_file (string filename) throws GLib.FileError;\n\t\tpublic void set_value (string group_name, string key, string value);\n\t\tpublic void set_string (string group_name, string key, string str);\n\t\tpublic void set_locale_string (string group_name, string key, string locale, string str);\n\t\tpublic void set_boolean (string group_name, string key, bool value);\n\t\tpublic void set_integer (string group_name, string key, int value);\n\t\tpublic void set_int64 (string group_name, string key, int64 value);\n\t\tpublic void set_uint64 (string group_name, string key, uint64 value);\n\t\tpublic void set_double (string group_name, string key, double value);\n\t\tpublic void set_string_list (string group_name, string key, [CCode (type = \"const gchar* const*\")] string[] list);\n\t\tpublic void set_locale_string_list (string group_name, string key, string locale, string[] list);\n\t\tpublic void set_boolean_list (string group_name, string key, bool[] list);\n\t\tpublic void set_integer_list (string group_name, string key, int[] list);\n\t\tpublic void set_double_list (string group_name, string key, double[] list);\n\t\tpublic void set_comment (string? group_name, string? key, string comment) throws KeyFileError;\n\t\tpublic void remove_group (string group_name) throws KeyFileError;\n\t\tpublic void remove_key (string group_name, string key) throws KeyFileError;\n\t\tpublic void remove_comment (string group_name, string key) throws KeyFileError;\n\t}\n\n\t[CCode (cprefix = \"G_KEY_FILE_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum KeyFileFlags {\n\t\tNONE,\n\t\tKEEP_COMMENTS,\n\t\tKEEP_TRANSLATIONS\n\t}\n\n\t[CCode (cprefix = \"G_KEY_FILE_DESKTOP_\")]\n\tnamespace KeyFileDesktop {\n\t\tpublic const string GROUP;\n\t\tpublic const string KEY_ACTIONS;\n\t\tpublic const string KEY_CATEGORIES;\n\t\tpublic const string KEY_COMMENT;\n\t\tpublic const string KEY_DBUS_ACTIVATABLE;\n\t\tpublic const string KEY_EXEC;\n\t\tpublic const string KEY_FULLNAME;\n\t\tpublic const string KEY_GENERIC_NAME;\n\t\tpublic const string KEY_GETTEXT_DOMAIN;\n\t\tpublic const string KEY_HIDDEN;\n\t\tpublic const string KEY_ICON;\n\t\tpublic const string KEY_KEYWORDS;\n\t\tpublic const string KEY_MIME_TYPE;\n\t\tpublic const string KEY_NAME;\n\t\tpublic const string KEY_NOT_SHOW_IN;\n\t\tpublic const string KEY_NO_DISPLAY;\n\t\tpublic const string KEY_ONLY_SHOW_IN;\n\t\tpublic const string KEY_PATH;\n\t\tpublic const string KEY_STARTUP_NOTIFY;\n\t\tpublic const string KEY_STARTUP_WM_CLASS;\n\t\tpublic const string KEY_TERMINAL;\n\t\tpublic const string KEY_TRY_EXEC;\n\t\tpublic const string KEY_TYPE;\n\t\tpublic const string KEY_URL;\n\t\tpublic const string KEY_VERSION;\n\t\tpublic const string TYPE_APPLICATION;\n\t\tpublic const string TYPE_DIRECTORY;\n\t\tpublic const string TYPE_LINK;\n\t}\n\n\t/* Bookmark file parser */\n\n\t[Compact]\n\t[CCode (free_function = \"g_bookmark_file_free\")]\n\tpublic class BookmarkFile {\n\t\tpublic BookmarkFile ();\n\t\tpublic bool load_from_file (string file) throws BookmarkFileError;\n\t\tpublic bool load_from_data (string data, size_t length) throws BookmarkFileError;\n\t\tpublic bool load_from_data_dirs (string file, out string full_path) throws BookmarkFileError;\n\t\tpublic string to_data (out size_t length) throws BookmarkFileError;\n\t\tpublic bool to_file (string filename) throws BookmarkFileError;\n\t\tpublic bool has_item (string uri);\n\t\tpublic bool has_group (string uri, string group) throws BookmarkFileError;\n\t\tpublic bool has_application (string uri, string name) throws BookmarkFileError;\n\t\tpublic int get_size ();\n\t\tpublic string[] get_uris ();\n\t\tpublic string get_title (string uri) throws BookmarkFileError;\n\t\tpublic string get_description (string uri) throws BookmarkFileError;\n\t\tpublic string get_mime_type (string uri) throws BookmarkFileError;\n\t\tpublic bool get_is_private (string uri) throws BookmarkFileError;\n\t\tpublic bool get_icon (string uri, out string href, out string mime_type) throws BookmarkFileError;\n\t\tpublic time_t get_added (string uri) throws BookmarkFileError;\n\t\tpublic time_t get_modified (string uri) throws BookmarkFileError;\n\t\tpublic time_t get_visited (string uri) throws BookmarkFileError;\n\t\tpublic string[] get_groups (string uri) throws BookmarkFileError;\n\t\tpublic string[] get_applications (string uri) throws BookmarkFileError;\n\t\tpublic bool get_app_info (string uri, string name, out string exec, out uint count, out time_t stamp) throws BookmarkFileError;\n\t\tpublic void set_title (string uri, string title);\n\t\tpublic void set_description (string uri, string description);\n\t\tpublic void set_mime_type (string uri, string mime_type);\n\t\tpublic void set_is_private (string uri, bool is_private);\n\t\tpublic void set_icon (string uri, string href, string mime_type);\n\t\tpublic void set_added (string uri, time_t added);\n\t\tpublic void set_groups (string uri, string[] groups);\n\t\tpublic void set_modified (string uri, time_t modified);\n\t\tpublic void set_visited (string uri, time_t visited);\n\t\tpublic bool set_app_info (string uri, string name, string exec, int count, time_t stamp) throws BookmarkFileError;\n\t\tpublic void add_group (string uri, string group);\n\t\tpublic void add_application (string uri, string name, string exec);\n\t\tpublic bool remove_group (string uri, string group) throws BookmarkFileError;\n\t\tpublic bool remove_application (string uri, string name) throws BookmarkFileError;\n\t\tpublic bool remove_item (string uri) throws BookmarkFileError;\n\t\tpublic bool move_item (string old_uri, string new_uri) throws BookmarkFileError;\n\t}\n\n\tpublic errordomain BookmarkFileError {\n\t\tINVALID_URI,\n\t\tINVALID_VALUE,\n\t\tAPP_NOT_REGISTERED,\n\t\tURI_NOT_FOUND,\n\t\tREAD,\n\t\tUNKNOWN_ENCODING,\n\t\tWRITE,\n\t\tFILE_NOT_FOUND\n\t}\n\n\t/* Testing */\n\n\tnamespace Test {\n\t\t[CCode (cprefix = \"G_TEST_\", has_type_id = false)]\n\t\tpublic enum FileType {\n\t\t\tDIST,\n\t\t\tBUILT\n\t\t}\n\n\t\t[PrintfFormat]\n\t\tpublic static void minimized_result (double minimized_quantity, string format, ...);\n\t\t[PrintfFormat]\n\t\tpublic static void maximized_result (double maximized_quantity, string format, ...);\n\t\tpublic static void init ([CCode (array_length_pos = 0.9)] ref unowned string[] args, ...);\n\t\tpublic static bool quick ();\n\t\tpublic static bool slow ();\n\t\tpublic static bool thorough ();\n\t\tpublic static bool perf ();\n\t\tpublic static bool verbose ();\n\t\tpublic static bool quiet ();\n\t\tpublic static int run ();\n#if GLIB_2_26\n\t\tpublic static void add_func (string testpath, TestFunc test_funcvoid);\n#else\n\t\tpublic static void add_func (string testpath, Callback test_funcvoid);\n#endif\n\t\tpublic static void add_data_func (string testpath, [CCode (delegate_target_pos = 1.9)] TestDataFunc test_funcvoid);\n\t\tpublic static string build_filename (GLib.Test.FileType file_type, params string[] path_segments);\n\t\tpublic static void fail ();\n\t\tpublic static bool failed ();\n\t\tpublic static unowned string get_dir (GLib.Test.FileType file_type);\n\t\tpublic static unowned string get_filename (GLib.Test.FileType file_type, params string[] path_segments);\n\t\tpublic static void incomplete (string msg);\n\t\t[PrintfFormat]\n\t\tpublic static void message (string format, ...);\n\t\tpublic static void set_nonfatal_assertions ();\n\t\tpublic static void skip (string msg);\n\t\tpublic static bool subprocess ();\n\t\tpublic static void bug_base (string uri_pattern);\n\t\tpublic static void bug (string bug_uri_snippet);\n\t\tpublic static void timer_start ();\n\t\tpublic static double timer_elapsed ();\n\t\tpublic static double timer_last ();\n\t\t[Deprecated (since = \"2.38\", replacement = \"trap_subprocess\")]\n\t\tpublic static bool trap_fork (uint64 usec_timeout, TestTrapFlags test_trap_flags);\n\t\tpublic static bool trap_has_passed ();\n\t\tpublic static bool trap_reached_timeout ();\n\t\tpublic static void trap_subprocess (string test_path, uint64 usec_timeout, TestSubprocessFlags test_flags);\n\t\tpublic static void trap_assert_passed ();\n\t\tpublic static void trap_assert_failed ();\n\t\tpublic static void trap_assert_stdout (string soutpattern);\n\t\tpublic static void trap_assert_stdout_unmatched (string soutpattern);\n\t\tpublic static void trap_assert_stderr (string serrpattern);\n\t\tpublic static void trap_assert_stderr_unmatched (string serrpattern);\n\t\tpublic static bool rand_bit ();\n\t\tpublic static int32 rand_int ();\n\t\tpublic static int32 rand_int_range (int32 begin, int32 end);\n\t\tpublic static double rand_double ();\n\t\tpublic static double rand_double_range (double begin, double end);\n\t\tpublic static void log_set_fatal_handler (LogFatalFunc log_func);\n\t}\n\n\tpublic delegate bool LogFatalFunc (string? log_domain, LogLevelFlags log_levels, string message);\n\n\t[Compact]\n\t[CCode (cname = \"GTestCase\", ref_function = \"\", unref_function = \"\")]\n\tpublic class TestCase {\n\t\t[CCode (cname = \"g_test_create_case\")]\n#if GLIB_2_26\n\t\tpublic TestCase (string test_name, [CCode (delegate_target_pos = 1.9)] TestFixtureFunc data_setup, [CCode (delegate_target_pos = 1.9)] TestFixtureFunc data_func, [CCode (delegate_target_pos = 1.9)] TestFixtureFunc data_teardown, [CCode (pos = 1.8)] size_t data_size = 0);\n#else\n\t\tpublic TestCase (string test_name, [CCode (delegate_target_pos = 1.9, type = \"void (*) (void)\")] TestFunc data_setup, [CCode (delegate_target_pos = 1.9, type = \"void (*) (void)\")] TestFunc data_func, [CCode (delegate_target_pos = 1.9, type = \"void (*) (void)\")] TestFunc data_teardown, [CCode (pos = 1.8)] size_t data_size = 0);\n#endif\n\t}\n\n\t[Compact]\n\t[CCode (cname = \"GTestSuite\", ref_function = \"\", unref_function = \"\")]\n\tpublic class TestSuite {\n\t\t[CCode (cname = \"g_test_create_suite\")]\n\t\tpublic TestSuite (string name);\n\t\t[CCode (cname = \"g_test_get_root\")]\n\t\tpublic static TestSuite get_root ();\n\t\t[CCode (cname = \"g_test_suite_add\")]\n\t\tpublic void add (TestCase test_case);\n\t\t[CCode (cname = \"g_test_suite_add_suite\")]\n\t\tpublic void add_suite (TestSuite test_suite);\n\t}\n\n#if GLIB_2_26\n\t[CCode (has_target = false)]\n\tpublic delegate void TestFunc ();\n\tpublic delegate void TestDataFunc ();\n\tpublic delegate void TestFixtureFunc (void* fixture);\n#else\n\tpublic delegate void TestFunc (void* fixture);\n\tpublic delegate void TestDataFunc ();\n#endif\n\n\t[CCode (cprefix = \"G_TEST_SUBPROCESS_INHERIT_\", has_type_id = false)]\n\t[Flags]\n\tpublic enum TestSubprocessFlags {\n\t\tSTDIN,\n\t\tSTDOUT,\n\t\tSTDERR\n\t}\n\n\t[Flags]\n\t[CCode (cprefix = \"G_TEST_TRAP_\", has_type_id = false)]\n\tpublic enum TestTrapFlags {\n\t\tSILENCE_STDOUT,\n\t\tSILENCE_STDERR,\n\t\tINHERIT_STDIN\n\t}\n\n\t/* Doubly-Linked Lists */\n\n\t[Compact]\n\t[CCode (dup_function = \"g_list_copy\", free_function = \"g_list_free\")]\n\tpublic class List<G> {\n\t\tpublic List ();\n\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void append (owned G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void prepend (owned G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert (owned G data, int position);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert_before (List<G> sibling, owned G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert_sorted (owned G data, CompareFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void remove (G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void remove_link (List<G> llink);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void delete_link (List<G> link_);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void remove_all (G data);\n\n\t\tpublic uint length ();\n\t\tpublic List<unowned G> copy ();\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void reverse ();\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void sort (CompareFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert_sorted_with_data (owned G data, CompareDataFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void sort_with_data (CompareDataFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void concat (owned List<G> list2);\n\t\tpublic void @foreach (Func<G> func);\n\n\t\tpublic unowned List<G> first ();\n\t\tpublic unowned List<G> last ();\n\t\tpublic unowned List<G> nth (uint n);\n\t\tpublic unowned G nth_data (uint n);\n\t\tpublic unowned List<G> nth_prev (uint n);\n\n\t\tpublic unowned List<G> find (G data);\n\t\tpublic unowned List<G> find_custom (G data, CompareFunc<G> func);\n\t\t[CCode (cname = \"g_list_find_custom\", simple_generics = true)]\n\t\tpublic unowned List<G> search<T> (T data, SearchFunc<T,G> func);\n\n\t\tpublic int position (List<G> llink);\n\t\tpublic int index (G data);\n\n\t\tpublic G data;\n\t\tpublic List<G> next;\n\t\tpublic unowned List<G> prev;\n\t}\n\n\t/* Singly-Linked Lists */\n\n\t[Compact]\n\t[CCode (dup_function = \"g_slist_copy\", free_function = \"g_slist_free\")]\n\tpublic class SList<G> {\n\t\tpublic SList ();\n\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void append (owned G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void prepend (owned G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert (owned G data, int position);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert_before (SList<G> sibling, owned G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert_sorted (owned G data, CompareFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void remove (G data);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void remove_link (SList<G> llink);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void delete_link (SList<G> link_);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void remove_all (G data);\n\n\t\tpublic uint length ();\n\t\tpublic SList<unowned G> copy ();\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void reverse ();\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void insert_sorted_with_data (owned G data, CompareDataFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void sort (CompareFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void sort_with_data (CompareDataFunc<G> compare_func);\n\t\t[ReturnsModifiedPointer ()]\n\t\tpublic void concat (owned SList<G> list2);\n\t\tpublic void @foreach (Func<G> func);\n\n\t\tpublic unowned SList<G> last ();\n\t\tpublic unowned SList<G> nth (uint n);\n\t\tpublic unowned G nth_data (uint n);\n\n\t\tpublic unowned SList<G> find (G data);\n\t\tpublic unowned SList<G> find_custom (G data, CompareFunc<G> func);\n\t\t[CCode (cname = \"g_slist_find_custom\", simple_generics = true)]\n\t\tpublic unowned SList<G> search<T> (T data, SearchFunc<T,G> func);\n\n\t\tpublic int position (SList<G> llink);\n\t\tpublic int index (G data);\n\n\t\tpublic G data;\n\t\tpublic SList<G> next;\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate int CompareFunc<G> (G a, G b);\n\n\tpublic delegate int CompareDataFunc<G> (G a, G b);\n\n\t[CCode (cname = \"g_strcmp0\")]\n\tpublic static GLib.CompareFunc<string> strcmp;\n\n\t[CCode (cname = \"GCompareFunc\", has_target = false)]\n\tpublic delegate int SearchFunc<G,T> (G a, T b);\n\n\t/* Double-ended Queues */\n\n\t[Compact]\n\t[CCode (dup_function = \"g_queue_copy\", free_function = \"g_queue_free\")]\n\tpublic class Queue<G> {\n\t\tpublic unowned List<G> head;\n\t\tpublic unowned List<G> tail;\n\t\tpublic uint length;\n\n\t\tpublic Queue ();\n\n\t\tpublic void clear ();\n\t\tpublic bool is_empty ();\n\t\tpublic uint get_length ();\n\t\tpublic void reverse ();\n\t\tpublic Queue copy ();\n\t\tpublic unowned List<G> find (G data);\n\t\tpublic unowned List<G> find_custom (G data, CompareFunc<G> func);\n\t\t[CCode (cname = \"g_queue_find_custom\", simple_generics = true)]\n\t\tpublic unowned List<G> search<T> (T data, SearchFunc<T,G> func);\n\t\tpublic void sort (CompareDataFunc<G> compare_func);\n\t\tpublic void push_head (owned G data);\n\t\tpublic void push_tail (owned G data);\n\t\tpublic void push_nth (owned G data, int n);\n\t\tpublic G pop_head ();\n\t\tpublic G pop_tail ();\n\t\tpublic G pop_nth (uint n);\n\t\tpublic unowned G peek_head ();\n\t\tpublic unowned G peek_tail ();\n\t\tpublic unowned G peek_nth (uint n);\n\t\tpublic int index (G data);\n\t\tpublic void remove (G data);\n\t\tpublic void remove_all (G data);\n\t\tpublic void delete_link (List<G> link);\n\t\tpublic void unlink (List<G> link);\n\t\tpublic void insert_before (List<G> sibling, owned G data);\n\t\tpublic void insert_after (List<G> sibling, owned G data);\n\t\tpublic void insert_sorted (owned G data, CompareDataFunc<G> func);\n\t}\n\n\t/* Sequences */\n\n\t[Compact]\n\t[CCode (free_function = \"g_sequence_free\")]\n\tpublic class Sequence<G> {\n\t\t[CCode (simple_generics = true)]\n\t\tpublic Sequence ();\n\t\tpublic int get_length ();\n\t\tpublic void @foreach (Func<G> func);\n\t\tpublic void sort (CompareDataFunc<G> cmp_func);\n\t\tpublic void sort_iter (SequenceIterCompareFunc<G> func);\n\t\tpublic SequenceIter<G> get_begin_iter ();\n\t\tpublic SequenceIter<G> get_end_iter ();\n\t\tpublic SequenceIter<G> get_iter_at_pos (int pos);\n\t\tpublic SequenceIter<G> append (owned G data);\n\t\tpublic SequenceIter<G> prepend (owned G data);\n\t\tpublic SequenceIter<G> insert_sorted (owned G data, CompareDataFunc<G> cmp_func);\n\t\tpublic SequenceIter<G> insert_sorted_iter (owned G data, SequenceIterCompareFunc<G> iter_cmp);\n\t\tpublic SequenceIter<G> search (G data, CompareDataFunc<G> cmp_func);\n\t\tpublic SequenceIter<G> search_iter (G data, SequenceIterCompareFunc<G> iter_cmp);\n\t\tpublic SequenceIter<G> lookup (G data, CompareDataFunc<G> cmp_func);\n\t\tpublic SequenceIter<G> lookup_iter (G data, SequenceIterCompareFunc<G> iter_cmp);\n\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.foreach_range\")]\n\t\tpublic static void foreach_range (SequenceIter<G> begin, SequenceIter<G> end, Func<G> func);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.insert_before\")]\n\t\tpublic static SequenceIter<G> insert_before (SequenceIter<G> iter, owned G data);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.move_to\")]\n\t\tpublic static void move (SequenceIter<G> src, SequenceIter<G> dest);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.swap\")]\n\t\tpublic static void swap (SequenceIter<G> src, SequenceIter<G> dest);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.sort_changed\")]\n\t\tpublic static void sort_changed (SequenceIter<G> iter, CompareDataFunc<G> cmp_func);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.sort_changed_iter\")]\n\t\tpublic static void sort_changed_iter (SequenceIter<G> iter, SequenceIterCompareFunc<G> iter_cmp);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.remove\")]\n\t\tpublic static void remove (SequenceIter<G> iter);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.remove_range\")]\n\t\tpublic static void remove_range (SequenceIter<G> begin, SequenceIter<G> end);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.move_range\")]\n\t\tpublic static void move_range (SequenceIter<G> dest, SequenceIter<G> begin, SequenceIter<G> end);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.get\")]\n\t\tpublic static unowned G get (SequenceIter<G> iter);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.set\")]\n\t\tpublic static void set (SequenceIter<G> iter, owned G data);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"SequenceIter.range_get_midpoint\")]\n\t\tpublic static SequenceIter<G> range_get_midpoint (SequenceIter<G> begin, SequenceIter<G> end);\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"\", unref_function = \"\")]\n\tpublic class SequenceIter<G> {\n\t\tpublic bool is_begin ();\n\t\tpublic bool is_end ();\n\t\tpublic SequenceIter<G> next ();\n\t\tpublic SequenceIter<G> prev ();\n\t\tpublic int get_position ();\n\t\tpublic SequenceIter<G> move (int delta);\n\t\tpublic unowned Sequence<G> get_sequence ();\n\t\tpublic int compare (SequenceIter<G> other);\n\n\t\t[CCode (cname = \"g_sequence_foreach_range\")]\n\t\tpublic void foreach_range (SequenceIter<G> end, Func<G> func);\n\t\t[CCode (cname = \"g_sequence_insert_before\")]\n\t\tpublic SequenceIter<G> insert_before (owned G data);\n\t\t[CCode (cname = \"g_sequence_move\")]\n\t\tpublic void move_to (SequenceIter<G> dest);\n\t\t[CCode (cname = \"g_sequence_swap\")]\n\t\tpublic void swap (SequenceIter<G> dest);\n\t\t[CCode (cname = \"g_sequence_sort_changed\")]\n\t\tpublic void sort_changed (CompareDataFunc<G> cmp_func);\n\t\t[CCode (cname = \"g_sequence_sort_changed_iter\")]\n\t\tpublic void sort_changed_iter (SequenceIterCompareFunc<G> iter_cmp);\n\t\t[CCode (cname = \"g_sequence_remove\")]\n\t\tpublic void remove ();\n\t\t[CCode (cname = \"g_sequence_remove_range\")]\n\t\tpublic void remove_range (SequenceIter<G> end);\n\t\t[CCode (cname = \"g_sequence_move_range\")]\n\t\tpublic void move_range (SequenceIter<G> begin, SequenceIter<G> end);\n\t\t[CCode (cname = \"g_sequence_get\")]\n\t\tpublic unowned G get ();\n\t\t[CCode (cname = \"g_sequence_set\")]\n\t\tpublic void set (owned G data);\n\t\t[CCode (cname = \"g_sequence_range_get_midpoint\")]\n\t\tpublic SequenceIter<G> range_get_midpoint (SequenceIter<G> end);\n\t}\n\n\tpublic delegate int SequenceIterCompareFunc<G> (SequenceIter<G> a, SequenceIter<G> b);\n\n\t/* Hash Tables */\n\n\t[Compact]\n\t[CCode (ref_function = \"g_hash_table_ref\", unref_function = \"g_hash_table_unref\", type_id = \"G_TYPE_HASH_TABLE\", type_signature = \"a{%s}\")]\n\tpublic class HashTable<K,V> {\n\t\t[CCode (cname = \"g_hash_table_new_full\", simple_generics = true)]\n\t\tpublic HashTable (HashFunc<K>? hash_func, EqualFunc<K>? key_equal_func);\n\t\tpublic HashTable.full (HashFunc<K>? hash_func, EqualFunc<K>? key_equal_func, DestroyNotify? key_destroy_func, DestroyNotify? value_destroy_func);\n\t\tpublic void insert (owned K key, owned V value);\n\t\tpublic void replace (owned K key, owned V value);\n\t\t[Deprecated (since = \"vala-0.26\", replacement = \"GenericSet.add\")]\n\t\tpublic void add (owned K key);\n\t\tpublic unowned V? lookup (K key);\n\t\tpublic bool lookup_extended (K lookup_key, out unowned K orig_key, out unowned V value);\n\t\tpublic bool contains (K key);\n\t\tpublic bool remove (K key);\n\t\tpublic void remove_all ();\n\t\tpublic uint foreach_remove (HRFunc<K,V> predicate);\n\t\t[CCode (cname = \"g_hash_table_lookup\")]\n\t\tpublic unowned V? @get (K key);\n\t\t[CCode (cname = \"g_hash_table_insert\")]\n\t\tpublic void @set (owned K key, owned V value);\n\t\tpublic List<unowned K> get_keys ();\n#if VALA_0_26\n\t\tpublic (unowned K)[] get_keys_as_array ();\n#endif\n\t\tpublic List<unowned V> get_values ();\n\t\tpublic void @foreach (HFunc<K,V> func);\n\t\t[CCode (cname = \"g_hash_table_foreach\")]\n\t\tpublic void for_each (HFunc<K,V> func);\n\t\tpublic unowned V? find (HRFunc<K,V> predicate);\n\t\tpublic uint size ();\n\t\tpublic bool steal (K key);\n\t\tpublic void steal_all ();\n\t\t[CCode (cname = \"_vala_g_hash_table_take\")]\n\t\tpublic V? take (K key, out bool exists = null) {\n\t\t\tGLib.HashTable<K,V>? ht = null;\n\t\t\tvoid** htp = &ht;\n\t\t\t*htp = this.lookup (key);\n\t\t\texists = this.steal (key);\n\t\t\treturn ht;\n\t\t}\n\t\tpublic uint length {\n\t\t\t[CCode (cname = \"g_hash_table_size\")]\n\t\t\tget;\n\t\t}\n\t}\n\n\tpublic struct HashTableIter<K,V> {\n\t\tpublic HashTableIter (GLib.HashTable<K,V> table);\n\t\tpublic bool next ([CCode (type = \"gpointer*\")] out unowned K key, [CCode (type = \"gpointer*\")] out unowned V value);\n\t\tpublic void remove ();\n\t\tpublic void steal ();\n\t\tpublic unowned GLib.HashTable<K,V> get_hash_table ();\n\t}\n\n\t[Compact, CCode (cname = \"GHashTable\", lower_case_cprefix = \"g_hash_table_\", ref_function = \"g_hash_table_ref\", unref_function = \"g_hash_table_unref\", type_id = \"G_TYPE_HASH_TABLE\", type_signature = \"a{%s}\")]\n\tpublic class GenericSet<T> {\n\t\t[CCode (cname = \"g_hash_table_new_full\", simple_generics = true)]\n\t\tpublic GenericSet (HashFunc<T>? hash_func, EqualFunc<T>? equal_func, GLib.DestroyNotify? always_pass_null_here = null);\n\t\tpublic void add (owned T value);\n\t\tpublic bool contains (T valule);\n\t\tpublic bool remove (T value);\n\t\tpublic void remove_all ();\n\t\tpublic GLib.List<unowned T> get_values ();\n\t\t[CCode (cname = \"g_hash_table_iter_init\", instance_pos = -1)]\n\t\tpublic GLib.GenericSetIter<T> iterator ();\n\t\t[CCode (cname = \"_vala_g_hash_set_foreach\")]\n\t\tpublic void @foreach (GLib.Func<T> func) {\n\t\t\t((GLib.HashTable<unowned T,T>) this).foreach ((k, v) => func (v));\n\t\t}\n\t\tpublic uint length {\n\t\t\t[CCode (cname = \"g_hash_table_size\")]\n\t\t\tget;\n\t\t}\n\t}\n\n\t[CCode (cname = \"GHashTableIter\", lower_case_cprefix = \"g_hash_table_iter_\")]\n\tpublic struct GenericSetIter<T> {\n\t\t[CCode (cname = \"_vala_hash_set_next_value\")]\n\t\tpublic unowned T? next_value () {\n\t\t\tvoid* vi = &this;\n\t\t\tGLib.HashTableIter<unowned T,T>* htp = vi;\n\t\t\tunowned T? value;\n\t\t\treturn htp->next (out value, null) ? value : null;\n\t\t}\n\t\tpublic void remove ();\n\t}\n\n\t[CCode (has_target = false)]\n\tpublic delegate uint HashFunc<K> (K key);\n\t[CCode (has_target = false)]\n\tpublic delegate bool EqualFunc<G> (G a, G b);\n\tpublic delegate void HFunc<K,V> (K key, V value);\n\tpublic delegate bool HRFunc<K,V> (K key, V value);\n\n\t[CCode (has_target = false)]\n\tpublic delegate void DestroyNotify (void* data);\n\n\t[CCode (cname = \"g_direct_hash\")]\n\tpublic static GLib.HashFunc<void*> direct_hash;\n\t[CCode (cname = \"g_direct_equal\")]\n\tpublic static GLib.EqualFunc<void*> direct_equal;\n\t[CCode (cname = \"g_int64_hash\")]\n\tpublic static GLib.HashFunc<int64?> int64_hash;\n\t[CCode (cname = \"g_int64_equal\")]\n\tpublic static GLib.EqualFunc<int64?> int64_equal;\n\t[CCode (cname = \"g_int_hash\")]\n\tpublic static GLib.HashFunc<int?> int_hash;\n\t[CCode (cname = \"g_int_equal\")]\n\tpublic static GLib.EqualFunc<int?> int_equal;\n\t[CCode (cname = \"g_str_hash\")]\n\tpublic static GLib.HashFunc<string> str_hash;\n\t[CCode (cname = \"g_str_equal\")]\n\tpublic static GLib.EqualFunc<string> str_equal;\n\t[CCode (cname = \"g_free\")]\n\tpublic static GLib.DestroyNotify g_free;\n\t[CCode (cname = \"g_object_unref\")]\n\tpublic static GLib.DestroyNotify g_object_unref;\n\t[CCode (cname = \"g_list_free\")]\n\tpublic static GLib.DestroyNotify g_list_free;\n\t[CCode (cname = \"((GDestroyNotify) g_variant_unref)\")]\n\tpublic static GLib.DestroyNotify g_variant_unref;\n\n\t/* Strings */\n\n\t[Compact]\n\t[GIR (name = \"String\")]\n\t[CCode (cname = \"GString\", cprefix = \"g_string_\", free_function = \"g_string_free\", type_id = \"G_TYPE_GSTRING\")]\n\tpublic class StringBuilder {\n\t\tpublic StringBuilder (string init = \"\");\n\t\t[CCode (cname = \"g_string_sized_new\")]\n\t\tpublic StringBuilder.sized (size_t dfl_size);\n\t\tpublic unowned StringBuilder assign (string rval);\n\t\tpublic unowned StringBuilder append (string val);\n\t\tpublic unowned StringBuilder append_c (char c);\n\t\tpublic unowned StringBuilder append_unichar (unichar wc);\n\t\tpublic unowned StringBuilder append_len (string val, ssize_t len);\n\t\tpublic unowned StringBuilder prepend (string val);\n\t\tpublic unowned StringBuilder prepend_c (char c);\n\t\tpublic unowned StringBuilder prepend_unichar (unichar wc);\n\t\tpublic unowned StringBuilder prepend_len (string val, ssize_t len);\n\t\tpublic unowned StringBuilder insert (ssize_t pos, string val);\n\t\tpublic unowned StringBuilder insert_len (ssize_t pos, string val, ssize_t len);\n\t\tpublic unowned StringBuilder insert_unichar (ssize_t pos, unichar wc);\n\t\tpublic unowned StringBuilder overwrite (size_t pos, string val);\n\t\tpublic unowned StringBuilder overwrite_len (size_t pos, string val, ssize_t len);\n\t\tpublic unowned StringBuilder erase (ssize_t pos = 0, ssize_t len = -1);\n\t\tpublic unowned StringBuilder truncate (size_t len = 0);\n\n\t\t[PrintfFormat]\n\t\tpublic void printf (string format, ...);\n\t\t[PrintfFormat]\n\t\tpublic void append_printf (string format, ...);\n\t\tpublic void vprintf (string format, va_list args);\n\t\tpublic void append_vprintf (string format, va_list args);\n\n\t\tpublic string str;\n\t\tpublic ssize_t len;\n\t\tpublic ssize_t allocated_len;\n\n\t\tpublic uint8[] data {\n\t\t\tget {\n\t\t\t\tunowned uint8[] res = (uint8[]) this.str;\n\t\t\t\tres.length = (int) this.len;\n\t\t\t\treturn res;\n\t\t\t}\n\t\t}\n\n\t\tpublic static Bytes free_to_bytes (StringBuilder str);\n\t}\n\n\t/* String Chunks */\n\n\t[Compact]\n\t[CCode (free_function = \"g_string_chunk_free\")]\n\tpublic class StringChunk {\n\t\tpublic StringChunk (size_t size);\n\t\tpublic unowned string insert (string str);\n\t\tpublic unowned string insert_const (string str);\n\t\tpublic unowned string insert_len (string str, ssize_t len);\n\t\tpublic void clear ();\n\t}\n\n\t/* Pointer Arrays */\n\n\t[Compact, Deprecated (since = \"vala-0.26\", replacement=\"GenericArray\")]\n\t[CCode (ref_function = \"g_ptr_array_ref\", unref_function = \"g_ptr_array_unref\", type_id = \"G_TYPE_PTR_ARRAY\")]\n\tpublic class PtrArray {\n\t\tpublic PtrArray ();\n\t\tpublic PtrArray.with_free_func (GLib.DestroyNotify? element_free_func);\n\t\t[CCode (cname = \"g_ptr_array_sized_new\")]\n\t\tpublic PtrArray.sized (uint reserved_size);\n\t\tpublic void add (void* data);\n\t\tpublic void foreach (GLib.Func<void*> func);\n\t\t[CCode (cname = \"g_ptr_array_index\")]\n\t\tpublic void* index(uint index);\n\t\tpublic bool remove (void* data);\n\t\tpublic void* remove_index (uint index);\n\t\tpublic bool remove_fast (void *data);\n\t\tpublic void remove_index_fast (uint index);\n\t\tpublic void remove_range (uint index, uint length);\n\t\tpublic void sort (CompareFunc<void**> compare_func);\n\t\tpublic void sort_with_data (CompareDataFunc<void**> compare_func);\n\t\tpublic void set_free_func (GLib.DestroyNotify? element_free_function);\n\t\tpublic void set_size (int length);\n\n\t\tpublic uint len;\n\t\tpublic void** pdata;\n\t}\n\n\t[Compact]\n\t[CCode (cname = \"GPtrArray\", cprefix = \"g_ptr_array_\", ref_function = \"g_ptr_array_ref\", unref_function = \"g_ptr_array_unref\", type_id = \"G_TYPE_PTR_ARRAY\")]\n\t[GIR (name = \"PtrArray\")]\n\tpublic class GenericArray<G> {\n#if GLIB_2_30\n\t\t[CCode (cname = \"g_ptr_array_new_full\", simple_generics = true)]\n\t\tpublic GenericArray (uint reserved_size = 0);\n#else\n\t\t[CCode (cname = \"g_ptr_array_new_with_free_func\", simple_generics = true)]\n\t\tpublic GenericArray ();\n#endif\n\t\tpublic void add (owned G data);\n\t\tpublic void foreach (GLib.Func<G> func);\n\t\t[CCode (cname = \"g_ptr_array_index\")]\n\t\tpublic unowned G get (uint index);\n\t\tpublic void insert (int index, owned G data);\n\t\tpublic bool remove (G data);\n\t\tpublic void remove_index (uint index);\n\t\tpublic bool remove_fast (G data);\n\t\tpublic void remove_index_fast (uint index);\n\t\tpublic void remove_range (uint index, uint length);\n\t\tpublic void set (uint index, owned G data) {\n\t\t\tthis.add ((owned) data);\n\t\t\tthis.remove_index_fast (index);\n\t\t}\n\t\t[CCode (cname = \"vala_g_ptr_array_sort\")]\n\t\tpublic void sort (GLib.CompareFunc<G> compare_func) {\n\t\t\tthis._sort_with_data ((a, b) => {\n\t\t\t\treturn compare_func ((G**) (*a), (G**) (*b));\n\t\t\t});\n\t\t}\n\t\t[CCode (cname = \"g_ptr_array_sort_with_data\")]\n\t\tpublic void _sort_with_data (GLib.CompareDataFunc<G**> compare_func);\n\t\t[CCode (cname = \"vala_g_ptr_array_sort_with_data\")]\n\t\tpublic void sort_with_data (GLib.CompareDataFunc<G> compare_func) {\n\t\t\tthis._sort_with_data ((a, b) => {\n\t\t\t\treturn compare_func ((G**) (*a), (G**) (*b));\n\t\t\t});\n\t\t}\n\t\tprivate void set_size (int length);\n\n\t\tpublic int length {\n\t\t\tget { return (int) this.len; }\n\t\t\tset { this.set_size (value); }\n\t\t}\n\n\t\t[CCode (cname = \"pdata\", array_length_cname = \"len\", array_length_type = \"guint\")]\n\t\tpublic G[] data;\n\n\t\tprivate uint len;\n\t}\n\n\t[Compact]\n\t[CCode (cprefix = \"g_bytes_\", ref_function = \"g_bytes_ref\", unref_function = \"g_bytes_unref\", type_id = \"G_TYPE_BYTES\")]\n\tpublic class Bytes {\n\t\tpublic Bytes ([CCode (array_length_type = \"gsize\")] uint8[] data);\n\t\tpublic Bytes.take ([CCode (array_length_type = \"gsize\")] owned uint8[] data);\n\t\tpublic Bytes.static ([CCode (array_length_type = \"gsize\")] uint8[] data);\n\t\tpublic Bytes.with_free_func ([CCode (array_length_type = \"gsize\")] owned uint8[] data, GLib.DestroyNotify? free_func = GLib.g_free);\n\t\tpublic Bytes.from_bytes (GLib.Bytes bytes, size_t offset, size_t length);\n\n\t\t[CCode (cname = \"g_bytes_new_with_free_func\", simple_generics = true)]\n\t\tpublic static Bytes new_with_owner<T> ([CCode (array_length_type = \"gsize\")] uint8[] data, [CCode (destroy_notify_pos = 1.9)] owned T? owner = null);\n\n\t\t[CCode (array_length_type = \"gsize\")]\n\t\tpublic unowned uint8[] get_data ();\n\t\tpublic size_t get_size ();\n\t\tpublic uint hash ();\n\t\tpublic int compare (GLib.Bytes bytes2);\n\t\tpublic static uint8[] unref_to_data (owned GLib.Bytes bytes);\n\t\tpublic static GLib.ByteArray unref_to_array (owned GLib.Bytes bytes);\n\n\t\t[CCode (cname = \"_vala_g_bytes_get\")]\n\t\tpublic uint8 get (int index) {\n\t\t\tunowned uint8[] data = this.get_data ();\n\t\t\treturn data[index];\n\t\t}\n\n\t\t[CCode (cname = \"_vala_g_bytes_slice\")]\n\t\tpublic GLib.Bytes slice (int start, int end) {\n\t\t\tunowned uint8[] data = this.get_data ();\n\t\t\treturn new GLib.Bytes (data[start:end]);\n\t\t}\n\n\t\tpublic int length {\n\t\t\t[CCode (cname = \"_vala_g_bytes_get_length\")]\n\t\t\tget {\n\t\t\t\treturn (int) this.get_size ();\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Byte Arrays */\n\n\t[Compact]\n\t[CCode (cprefix = \"g_byte_array_\", ref_function = \"g_byte_array_ref\", unref_function = \"g_byte_array_unref\", type_id = \"G_TYPE_BYTE_ARRAY\")]\n\tpublic class ByteArray {\n\t\tpublic ByteArray ();\n\t\t[CCode (cname = \"g_byte_array_sized_new\")]\n\t\tpublic ByteArray.sized (uint reserved_size);\n\t\tpublic ByteArray.take (owned uint8[] data);\n\t\tpublic void append (uint8[] data);\n\t\tpublic static GLib.Bytes free_to_bytes (owned GLib.ByteArray array);\n\t\tpublic void prepend (uint8[] data);\n\t\tpublic void remove_index (uint index);\n\t\tpublic void remove_index_fast (uint index);\n\t\tpublic void remove_range (uint index, uint length);\n\t\tpublic void sort (CompareFunc<int8> compare_func);\n\t\tpublic void sort_with_data (CompareDataFunc<int8> compare_func);\n\t\tpublic void set_size (uint length);\n\n\t\tpublic uint len;\n\t\t[CCode (array_length_cname = \"len\", array_length_type = \"guint\")]\n\t\tpublic uint8[] data;\n\t}\n\n\t/* N-ary Trees */\n\n\tpublic delegate bool NodeTraverseFunc (Node node);\n\tpublic delegate void NodeForeachFunc (Node node);\n\n\t[CCode (cprefix = \"G_TRAVERSE_\")]\n\tpublic enum TraverseFlags {\n\t\tLEAVES,\n\t\tNON_LEAVES,\n\t\tALL,\n\t\tMASK,\n\t\tLEAFS,\n\t\tNON_LEAFS\n\t}\n\n\t[Compact]\n\t[CCode (dup_function = \"g_node_copy\", free_function = \"g_node_destroy\")]\n\tpublic class Node<G> {\n\t\tpublic Node(owned G? data = null);\n\t\tpublic Node<unowned G> copy ();\n\t\tpublic unowned Node<G> insert (int position, owned Node<G> node);\n\t\tpublic unowned Node<G> insert_before (Node<G> sibling, owned Node<G> node);\n\t\tpublic unowned Node<G> insert_after (Node<G> sibling, owned Node<G> node);\n\t\tpublic unowned Node<G> append (owned Node<G> node);\n\t\tpublic unowned Node<G> prepend (owned Node<G> node);\n\t\tpublic unowned Node<G> insert_data (int position, owned G data);\n\t\tpublic unowned Node<G> insert_data_before (Node<G> sibling, owned G data);\n\t\tpublic unowned Node<G> append_data (owned G data);\n\t\tpublic unowned Node<G> prepend_data (owned G data);\n\t\tpublic void reverse_children ();\n\t\tpublic void traverse (TraverseType order, TraverseFlags flags, int max_depth, NodeTraverseFunc func);\n\t\tpublic void children_foreach (TraverseFlags flags, NodeForeachFunc func);\n\t\tpublic unowned Node<G> get_root ();\n\t\tpublic unowned Node<G> find (TraverseType order, TraverseFlags flags, G data);\n\t\tpublic unowned Node<G> find_child (TraverseFlags flags, G data);\n\t\tpublic int child_index (G data);\n\t\tpublic int child_position (Node<G> child);\n\t\tpublic unowned Node<G> first_child ();\n\t\tpublic unowned Node<G> last_child ();\n\t\tpublic unowned Node<G> nth_child (uint n);\n\t\tpublic unowned Node<G> first_sibling ();\n\t\tpublic unowned Node<G> next_sibling ();\n\t\tpublic unowned Node<G> prev_sibling ();\n\t\tpublic unowned Node<G> last_sibling ();\n\n\t\t[CCode (cname = \"G_NODE_IS_LEAF\")]\n\t\tpublic bool is_leaf ();\n\t\t[CCode (cname = \"G_NODE_IS_ROOT\")]\n\t\tpublic bool is_root ();\n\t\tpublic bool is_ancestor (Node<G> descendant);\n\n\t\tpublic uint depth ();\n\t\tpublic uint n_nodes (TraverseFlags flags);\n\t\tpublic uint n_children ();\n\t\tpublic uint max_height ();\n\n\t\t[CCode (cname = \"g_node_unlink\")]\n\t\tpublic void _unlink ();\n\t\t[CCode (cname = \"g_node_unlink_vala\")]\n\t\tpublic Node<G> unlink ()\n\t\t{\n\t\t\tvoid *ptr = this;\n\t\t\t_unlink ();\n\t\t\treturn (Node<G>) (owned) ptr;\n\t\t}\n\n\t\tpublic G data;\n\t\tpublic Node next;\n\t\tpublic Node prev;\n\t\tpublic Node parent;\n\t\tpublic Node children;\n\t}\n\n\t/* Quarks */\n\n\t[CCode (type_id = \"G_TYPE_UINT\")]\n\tpublic struct Quark : uint32 {\n\t\tpublic static Quark from_string (string str);\n\t\tpublic static Quark try_string (string str);\n\t\tpublic unowned string to_string ();\n\t}\n\n\t/* Keyed Data Lists */\n\n\t[CCode (cname = \"GData*\")]\n\tpublic struct Datalist<G> {\n\t\tpublic Datalist ();\n\t\tpublic void clear ();\n\t\tpublic unowned G id_get_data (Quark key_id);\n\t\tpublic void id_set_data (Quark key_id, owned G data);\n\t\tpublic void id_set_data_full (Quark key_id, owned G data, DestroyNotify? destroy_func);\n\t\tpublic void id_remove_data (Quark key_id);\n\t\tpublic G id_remove_no_notify (Quark key_id);\n\t\tpublic void @foreach (DataForeachFunc func);\n\t\tpublic unowned G get_data (string key);\n\t\tpublic void set_data_full (string key, owned G data, DestroyNotify? destry_func);\n\t\tpublic G remove_no_notify (string key);\n\t\tpublic void set_data (string key, owned G data);\n\t\tpublic void remove_data (string key);\n\t}\n\n\tpublic delegate void DataForeachFunc<G> (Quark key_id, G data);\n\n\t/* GArray */\n\n\t[Compact]\n\t[CCode (ref_function = \"g_array_ref\", unref_function = \"g_array_unref\", type_id = \"G_TYPE_ARRAY\")]\n\tpublic class Array<G> {\n\t\t[CCode (cname = \"len\")]\n\t\tpublic uint length;\n\t\t[CCode (cname = \"data\", array_length_cname = \"len\", array_length_type = \"uint\")]\n\t\tpublic G[] data;\n\n\t\tpublic Array (bool zero_terminated = true, bool clear = true, ulong element_size = 0);\n\t\t[CCode (cname = \"g_array_sized_new\")]\n\t\tpublic Array.sized (bool zero_terminated, bool clear, ulong element_size, uint reserved_size);\n\t\tpublic void append_val (owned G value);\n\t\tpublic void append_vals (void* data, uint len);\n\t\tpublic void prepend_val (owned G value);\n\t\tpublic void prepend_vals (void* data, uint len);\n\t\tpublic void insert_val (uint index, owned G value);\n\t\tpublic void insert_vals (uint index, void* data, uint len);\n\t\tpublic void remove_index (uint index);\n\t\tpublic void remove_index_fast (uint index);\n\t\tpublic void remove_range (uint index, uint length);\n\t\tpublic void sort (CompareFunc<G> compare_func);\n\t\tpublic void sort_with_data (CompareDataFunc<G> compare_func);\n\t\t[CCode (generic_type_pos = 0.1)]\n\t\tpublic unowned G index (uint index);\n\t\tpublic void set_size (uint length);\n\t}\n\n\t/* GTree */\n\n\tpublic delegate bool TraverseFunc<K,V> (K key, V value);\n\n\t[CCode (cprefix = \"G_\", has_type_id = false)]\n\tpublic enum TraverseType {\n\t\tIN_ORDER,\n\t\tPRE_ORDER,\n\t\tPOST_ORDER,\n\t\tLEVEL_ORDER\n\t}\n\n\tpublic delegate int TreeSearchFunc<K> (K key);\n\n\t[Compact]\n\t[CCode (ref_function = \"g_tree_ref\", unref_function = \"g_tree_unref\")]\n\tpublic class Tree<K,V> {\n\t\t[CCode (cname = \"g_tree_new_full\", simple_generics = true)]\n\t\tpublic Tree (CompareDataFunc<K> key_compare_func);\n\t\t[Deprecated (since = \"vala-0.20\", replacement = \"Tree ()\")]\n\t\tpublic Tree.with_data (CompareDataFunc<K> key_compare_func);\n\t\tpublic Tree.full (CompareDataFunc<K> key_compare_func, DestroyNotify? key_destroy_func, DestroyNotify? value_destroy_func);\n\t\tpublic void insert (owned K key, owned V value);\n\t\tpublic void replace (owned K key, owned V value);\n\t\tpublic int nnodes ();\n\t\tpublic int height ();\n\t\tpublic unowned V lookup (K key);\n\t\tpublic bool lookup_extended (K lookup_key, out unowned K orig_key, out unowned V value);\n\t\tpublic void foreach (TraverseFunc<K,V> traverse_func);\n\t\tpublic unowned V search (TreeSearchFunc<K> search_func);\n\t\t[CCode (cname = \"g_tree_search\")]\n\t\tpublic unowned V search_key (CompareFunc<K> search_func, K key);\n\t\tpublic bool remove (K key);\n\t\tpublic bool steal (K key);\n\t}\n\n\t/* Internationalization */\n\n\t[CCode (cname = \"_\", cheader_filename = \"glib.h,glib/gi18n-lib.h\")]\n\tpublic static unowned string _ (string str);\n\t[CCode (cname = \"Q_\", cheader_filename = \"glib.h,glib/gi18n-lib.h\")]\n\tpublic static unowned string Q_ (string str);\n\t[CCode (cname = \"N_\", cheader_filename = \"glib.h,glib/gi18n-lib.h\")]\n\tpublic static unowned string N_ (string str);\n\t[CCode (cname = \"C_\", cheader_filename = \"glib.h,glib/gi18n-lib.h\")]\n\tpublic static unowned string C_ (string context, string str);\n\t[CCode (cname = \"NC_\", cheader_filename = \"glib.h,glib/gi18n-lib.h\")]\n\tpublic static unowned string NC_ (string context, string str);\n\t[CCode (cname = \"ngettext\", cheader_filename = \"glib.h,glib/gi18n-lib.h\")]\n\tpublic static unowned string ngettext (string msgid, string msgid_plural, ulong n);\n\t[CCode (cname = \"g_dgettext\", cheader_filename = \"glib/gi18n-lib.h\")]\n\tpublic static unowned string dgettext (string? domain, string msgid);\n\t[CCode (cname = \"g_dcgettext\", cheader_filename = \"glib/gi18n-lib.h\")]\n\tpublic static unowned string dcgettext (string? domain, string msgid, int category);\n\t[CCode (cname = \"g_dngettext\", cheader_filename = \"glib/gi18n-lib.h\")]\n\tpublic static unowned string dngettext (string? domain, string msgid, string msgid_plural, ulong n);\n\t[CCode (cname = \"g_dpgettext\", cheader_filename = \"glib/gi18n-lib.h\")]\n\tpublic static unowned string dpgettext (string? domain, string msgctxid, size_t msgidoffset);\n\t[CCode (cname = \"g_dpgettext2\", cheader_filename = \"glib/gi18n-lib.h\")]\n\tpublic static unowned string dpgettext2 (string? domain, string context, string msgid);\n\n\t[CCode (cname = \"int\", cprefix = \"LC_\", cheader_filename = \"locale.h\", has_type_id = false)]\n\tpublic enum LocaleCategory {\n\t\tALL,\n\t\tCOLLATE,\n\t\tCTYPE,\n\t\tMESSAGES,\n\t\tMONETARY,\n\t\tNUMERIC,\n\t\tTIME\n\t}\n\n\tnamespace Intl {\n\t\t[CCode (cname = \"setlocale\", cheader_filename = \"locale.h\")]\n\t\tpublic static unowned string? setlocale (LocaleCategory category = GLib.LocaleCategory.ALL, string? locale = \"\");\n\t\t[CCode (cname = \"bindtextdomain\", cheader_filename = \"glib/gi18n-lib.h\")]\n\t\tpublic static unowned string? bindtextdomain (string domainname, string? dirname);\n\t\t[CCode (cname = \"textdomain\", cheader_filename = \"glib/gi18n-lib.h\")]\n\t\tpublic static unowned string? textdomain (string? domainname);\n\t\t[CCode (cname = \"bind_textdomain_codeset\", cheader_filename = \"glib/gi18n-lib.h\")]\n\t\tpublic static unowned string? bind_textdomain_codeset (string domainname, string? codeset);\n\t\t[CCode (cname = \"g_get_language_names\", array_length = false, array_null_terminated = true)]\n\t\tpublic static unowned string[] get_language_names ();\n\t\t[CCode (cname = \"g_strip_context\", cheader_filename = \"glib/gi18n-lib.h\")]\n\t\tpublic static unowned string strip_context (string msgid, string msgval);\n\t}\n\n\t[Compact]\n\tpublic class PatternSpec {\n\t\tpublic PatternSpec (string pattern);\n\t\tpublic bool equal (PatternSpec pspec);\n\t\t[CCode (cname = \"g_pattern_match\")]\n\t\tpublic bool match (uint string_length, string str, string? str_reversed);\n\t\t[CCode (cname = \"g_pattern_match_string\")]\n\t\tpublic bool match_string (string str);\n\t\t[CCode (cname = \"g_pattern_match_simple\")]\n\t\tpublic static bool match_simple (string pattern, string str);\n\t}\n\n\t[CCode (lower_case_cprefix = \"glib_version_\")]\n\tnamespace Version {\n\t\t[CCode (cname = \"glib_major_version\")]\n\t\tpublic const uint major;\n\t\t[CCode (cname = \"glib_minor_version\")]\n\t\tpublic const uint minor;\n\t\t[CCode (cname = \"glib_micro_version\")]\n\t\tpublic const uint micro;\n\t\t[CCode (cname = \"glib_check_version\")]\n\t\tpublic static unowned string? check (uint required_major, uint required_minor = 0, uint required_micro = 0);\n\n\t\t[CCode (cname = \"GLIB_MAJOR_VERSION\")]\n\t\tpublic const uint MAJOR;\n\t\t[CCode (cname = \"GLIB_MINOR_VERSION\")]\n\t\tpublic const uint MINOR;\n\t\t[CCode (cname = \"GLIB_MICRO_VERSION\")]\n\t\tpublic const uint MICRO;\n\t\t[CCode (cname = \"GLIB_CHECK_VERSION\")]\n\t\tpublic static bool CHECK (uint required_major, uint required_minor = 0, uint required_micro = 0);\n\n\t\tpublic const uint @2_26;\n\t\tpublic const uint @2_28;\n\t\tpublic const uint @2_30;\n\t\tpublic const uint @2_32;\n\t\tpublic const uint @2_34;\n\t\tpublic const uint @2_36;\n\t\tpublic const uint @2_38;\n\n\t\t[CCode (cname = \"glib_binary_age\")]\n\t\tpublic const uint binary_age;\n\t\t[CCode (cname = \"glib_interface_age\")]\n\t\tpublic const uint interface_age;\n\t}\n\n\tnamespace Win32 {\n\t\tpublic string error_message (int error);\n\t\tpublic string getlocale ();\n\t\tpublic string get_package_installation_directory_of_module (void* hmodule);\n\t\tpublic uint get_windows_version ();\n\t\tpublic string locale_filename_from_utf8 (string utf8filename);\n\t\t[CCode (cname = \"G_WIN32_HAVE_WIDECHAR_API\")]\n\t\tpublic bool have_widechar_api ();\n\t\t[CCode (cname = \"G_WIN32_IS_NT_BASED\")]\n\t\tpublic bool is_nt_based ();\n\t\tpublic string[] get_command_line ();\n\t}\n\n\t[Compact]\n\t[Immutable]\n\t[CCode (copy_function = \"g_variant_type_copy\", free_function = \"g_variant_type_free\", type_id = \"G_TYPE_VARIANT_TYPE\")]\n\tpublic class VariantType {\n\t\t[CCode (cname = \"G_VARIANT_TYPE_BOOLEAN\")]\n\t\tpublic static VariantType BOOLEAN;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_BYTE\")]\n\t\tpublic static VariantType BYTE;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_INT16\")]\n\t\tpublic static VariantType INT16;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_UINT16\")]\n\t\tpublic static VariantType UINT16;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_INT32\")]\n\t\tpublic static VariantType INT32;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_UINT32\")]\n\t\tpublic static VariantType UINT32;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_INT64\")]\n\t\tpublic static VariantType INT64;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_UINT64\")]\n\t\tpublic static VariantType UINT64;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_HANDLE\")]\n\t\tpublic static VariantType HANDLE;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_DOUBLE\")]\n\t\tpublic static VariantType DOUBLE;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_STRING\")]\n\t\tpublic static VariantType STRING;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_OBJECT_PATH\")]\n\t\tpublic static VariantType OBJECT_PATH;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_SIGNATURE\")]\n\t\tpublic static VariantType SIGNATURE;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_VARIANT\")]\n\t\tpublic static VariantType VARIANT;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_UNIT\")]\n\t\tpublic static VariantType UNIT;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_ANY\")]\n\t\tpublic static VariantType ANY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_BASIC\")]\n\t\tpublic static VariantType BASIC;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_MAYBE\")]\n\t\tpublic static VariantType MAYBE;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_ARRAY\")]\n\t\tpublic static VariantType ARRAY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_TUPLE\")]\n\t\tpublic static VariantType TUPLE;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_DICT_ENTRY\")]\n\t\tpublic static VariantType DICT_ENTRY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_DICTIONARY\")]\n\t\tpublic static VariantType DICTIONARY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_STRING_ARRAY\")]\n\t\tpublic static VariantType STRING_ARRAY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_OBJECT_PATH_ARRAY\")]\n\t\tpublic static VariantType OBJECT_PATH_ARRAY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_BYTESTRING\")]\n\t\tpublic static VariantType BYTESTRING;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_BYTESTRING_ARRAY\")]\n\t\tpublic static VariantType BYTESTRING_ARRAY;\n\t\t[CCode (cname = \"G_VARIANT_TYPE_VARDICT\")]\n\t\tpublic static VariantType VARDICT;\n\n\t\tpublic static bool string_is_valid (string type_string);\n\t\tpublic static bool string_scan (string type_string, char *limit, out char* endptr);\n\n\t\tpublic VariantType (string type_string);\n\t\tpublic size_t get_string_length ();\n\t\tpublic char* peek_string ();\n\t\tpublic string dup_string ();\n\n\t\tpublic bool is_definite ();\n\t\tpublic bool is_container ();\n\t\tpublic bool is_basic ();\n\t\tpublic bool is_maybe ();\n\t\tpublic bool is_array ();\n\t\tpublic bool is_tuple ();\n\t\tpublic bool is_dict_entry ();\n\t\tpublic bool is_variant ();\n\n\t\tpublic uint hash ();\n\t\tpublic bool equal (VariantType other);\n\t\tpublic bool is_subtype_of (VariantType supertype);\n\n\t\tpublic unowned VariantType element ();\n\t\tpublic unowned VariantType first ();\n\t\tpublic unowned VariantType next ();\n\t\tpublic unowned VariantType n_items ();\n\t\tpublic unowned VariantType key ();\n\t\tpublic unowned VariantType value ();\n\n\t\tpublic VariantType.array (VariantType element);\n\t\tpublic VariantType.maybe (VariantType element);\n\t\tpublic VariantType.tuple (VariantType[] items);\n\t\tpublic VariantType.dict_entry (VariantType key, VariantType value);\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_variant_ref\", unref_function = \"g_variant_unref\", ref_sink_function = \"g_variant_ref_sink\", type_id = \"G_TYPE_VARIANT\", marshaller_type_name = \"VARIANT\", param_spec_function = \"g_param_spec_variant\", get_value_function = \"g_value_get_variant\", set_value_function = \"g_value_set_variant\", take_value_function = \"g_value_take_variant\", type_signature = \"v\")]\n\tpublic class Variant {\n\t\t[CCode (has_type_id = false)]\n\t\tpublic enum Class {\n\t\t\tBOOLEAN, BYTE, INT16, UINT16, INT32, UINT32, INT64,\n\t\t\tUINT64, HANDLE, DOUBLE, STRING, OBJECT_PATH,\n\t\t\tSIGNATURE, VARIANT, MAYBE, ARRAY, TUPLE, DICT_ENTRY\n\t\t}\n\n\t\tpublic unowned VariantType get_type ();\n\t\tpublic unowned string get_type_string ();\n\t\tpublic bool is_of_type (VariantType type);\n\t\tpublic bool is_container ();\n\t\tpublic bool is_floating ();\n\t\tpublic Class classify ();\n\t\tpublic int compare (Variant other);\n\n\t\tpublic Variant.boolean (bool value);\n\t\tpublic Variant.byte (uchar value);\n\t\tpublic Variant.int16 (int16 value);\n\t\tpublic Variant.uint16 (uint16 value);\n\t\tpublic Variant.int32 (int32 value);\n\t\tpublic Variant.uint32 (uint32 value);\n\t\tpublic Variant.int64 (int64 value);\n\t\tpublic Variant.uint64 (uint64 value);\n\t\tpublic Variant.handle (int32 value);\n\t\tpublic Variant.double (double value);\n\t\tpublic Variant.string (string value);\n\t\tpublic Variant.bytestring (string value);\n\t\tpublic Variant.object_path (string object_path);\n\t\tpublic static bool is_object_path (string object_path);\n\t\tpublic Variant.signature (string signature);\n\t\tpublic static bool is_signature (string signature);\n\n\t\tpublic bool get_boolean ();\n\t\tpublic uint8 get_byte ();\n\t\tpublic int16 get_int16 ();\n\t\tpublic uint16 get_uint16 ();\n\t\tpublic int32 get_int32 ();\n\t\tpublic uint32 get_uint32 ();\n\t\tpublic int64 get_int64 ();\n\t\tpublic uint64 get_uint64 ();\n\t\tpublic int32 get_handle ();\n\t\tpublic double get_double ();\n\t\tpublic unowned string get_string (out size_t length = null);\n\t\tpublic string dup_string (out size_t length = null);\n\t\tpublic unowned string get_bytestring ();\n\t\tpublic string dup_bytestring (out size_t length);\n\n\t\tpublic Variant.strv (string[] value);\n\t\t[CCode (array_length_type = \"size_t\")]\n#if VALA_0_26\n\t\tpublic (unowned string)[] get_strv ();\n#else\n\t\tpublic string*[] get_strv ();\n#endif\n\t\t[CCode (array_length_type = \"size_t\")]\n\t\tpublic string[] dup_strv ();\n\n\t\tpublic Variant.bytestring_array (string[] value);\n\t\t[CCode (array_length_type = \"size_t\")]\n#if VALA_0_26\n\t\tpublic (unowned string)[] get_bytestring_array ();\n#else\n\t\tpublic string*[] get_bytestring_array ();\n#endif\n\t\t[CCode (array_length_type = \"size_t\")]\n\t\tpublic string[] dup_bytestring_array ();\n\n#if GLIB_2_30\n\t\tpublic Variant.objv (string[] value);\n\t\t[CCode (array_length_type = \"size_t\")]\n#if VALA_0_26\n\t\tpublic (unowned string)[] get_objv ();\n#else\n\t\tpublic string*[] get_objv ();\n#endif\n\t\t[CCode (array_length_type = \"size_t\")]\n\t\tpublic string[] dup_objv ();\n#endif\n\n\t\tpublic Variant (string format, ...);\n\t\t// note: the function changes its behaviour when end_ptr is null, so 'out char *' is wrong\n\t\tpublic Variant.va (string format, char **end_ptr, va_list *app);\n\t\tpublic void get (string format, ...);\n\t\tpublic void get_va (string format, char **end_ptr, va_list *app);\n\n\t\tpublic Variant.variant (Variant value);\n\t\tpublic Variant.maybe (VariantType? child_type, Variant? child);\n\t\tpublic Variant.array (VariantType? child_type, Variant[] children);\n\t\t[CCode (simple_generics = true)]\n\t\tpublic static Variant new_fixed_array<T> (VariantType? element_type, [CCode (array_length_type = \"gsize\")] T[] elements, size_t element_size);\n\t\tpublic Variant.tuple (Variant[] children);\n\t\tpublic Variant.dict_entry (Variant key, Variant value);\n\t\tpublic Variant get_variant ();\n\t\tpublic Variant? get_maybe ();\n\n\t\tpublic size_t n_children ();\n\t\tpublic Variant get_child_value (size_t index);\n\t\tpublic void get_child (size_t index, string format_string, ...);\n\n\t\tpublic Variant? lookup_value (string key, VariantType? expected_type);\n\t\tpublic bool lookup (string key, string format_string, ...);\n\n\t\tpublic size_t get_size ();\n\t\tpublic void *get_data ();\n\t\tpublic void store (void *data);\n\n\t\tpublic string print (bool type_annotate);\n\t\tpublic StringBuilder print_string (StringBuilder? builder, bool type_annotate);\n\n\t\tpublic uint hash ();\n\t\tpublic bool equal (Variant other);\n\n\t\tpublic Variant byteswap ();\n\t\tpublic Variant get_normal_form ();\n\t\tpublic bool is_normal_form ();\n\t\t[CCode (returns_floating_reference = true, simple_generics = true)]\n\t\tpublic static Variant new_from_data<T> (VariantType type, uchar[] data, bool trusted, [CCode (destroy_notify_pos = 3.9)] owned T? owner = null);\n\n\t\t[CCode (cname = \"g_variant_iter_new\")]\n\t\tpublic VariantIter iterator ();\n\n\t\tpublic static Variant parse (VariantType? type, string text, char *limit = null, char **endptr = null) throws GLib.VariantParseError;\n\t\tpublic Variant.parsed (string format_string, ...);\n\n\t\tpublic bool check_format_string (string format_string, bool copy_only);\n\n\t\tpublic Variant.from_bytes (VariantType type, Bytes bytes, bool trusted);\n\t\tpublic Bytes get_data_as_bytes ();\n\n\t\tpublic Variant.printf (string format_string, ...);\n\t\tpublic Variant.take_string (string str);\n\n\t\tpublic static void parse_error_print_context (GLib.VariantParseError error, string source_str);\n\t}\n\n\tpublic errordomain VariantParseError {\n\t\tFAILED,\n\t\tBASIC_TYPE_EXPECTED,\n\t\tCANNOT_INFER_TYPE,\n\t\tDEFINITE_TYPE_EXPECTED,\n\t\tINPUT_NOT_AT_END,\n\t\tINVALID_CHARACTER,\n\t\tINVALID_FORMAT_STRING,\n\t\tINVALID_OBJECT_PATH,\n\t\tINVALID_SIGNATURE,\n\t\tINVALID_TYPE_STRING,\n\t\tNO_COMMON_TYPE,\n\t\tNUMBER_OUT_OF_RANGE,\n\t\tNUMBER_TOO_BIG,\n\t\tTYPE_ERROR,\n\t\tUNEXPECTED_TOKEN,\n\t\tUNKNOWN_KEYWORD,\n\t\tUNTERMINATED_STRING_CONSTANT,\n\t\tVALUE_EXPECTED\n\t}\n\n\t[Compact]\n\tpublic class VariantIter {\n\t\tpublic VariantIter (Variant value);\n\t\tpublic size_t n_children ();\n\t\tpublic Variant? next_value ();\n\t\tpublic bool next (string format_string, ...);\n\t}\n\n\t[Compact]\n\t[CCode (ref_function = \"g_variant_builder_ref\", unref_function = \"g_variant_builder_unref\")]\n\tpublic class VariantBuilder {\n\t\tpublic VariantBuilder (VariantType type);\n\t\tpublic void open (VariantType type);\n\t\tpublic void close ();\n\t\tpublic void add_value (Variant value);\n\t\tpublic void add (string format_string, ...);\n\t\t[CCode (returns_floating_reference = true)]\n\t\tpublic Variant end ();\n\t}\n\n\t[Compact, CCode (ref_function = \"g_variant_dict_ref\", unref_function = \"g_variant_dict_unref\")]\n\tpublic class VariantDict {\n\t\tpublic VariantDict (GLib.Variant? from_asv = null);\n\t\tpublic bool lookup (string key, string format_string, ...);\n\t\tpublic GLib.Variant lookup_value (string key, GLib.VariantType expected_type);\n\t\tpublic bool contains (string key);\n\t\tpublic void insert (string key, string format_string, ...);\n\t\tpublic void insert_value (string key, GLib.Variant value);\n\t\tpublic bool remove (string key);\n\t\tpublic void clear ();\n\t\t[CCode (returns_floating_reference = true)]\n\t\tpublic GLib.Variant end ();\n\t}\n\n\t[CCode (cname = \"char\", const_cname = \"const char\", copy_function = \"g_strdup\", free_function = \"g_free\", cheader_filename = \"stdlib.h,string.h,glib.h\", type_id = \"G_TYPE_STRING\", marshaller_type_name = \"STRING\", param_spec_function = \"g_param_spec_string\", get_value_function = \"g_value_get_string\", set_value_function = \"g_value_set_string\", take_value_function = \"g_value_take_string\", type_signature = \"o\")]\n\tpublic class ObjectPath : string {\n\t\t[CCode (cname = \"g_strdup\")]\n\t\tpublic ObjectPath (string path);\n\t}\n\n\t[CCode (cname = \"char\", const_cname = \"const char\", copy_function = \"g_strdup\", free_function = \"g_free\", cheader_filename = \"stdlib.h,string.h,glib.h\", type_id = \"G_TYPE_STRING\", marshaller_type_name = \"STRING\", param_spec_function = \"g_param_spec_string\", get_value_function = \"g_value_get_string\", set_value_function = \"g_value_set_string\", take_value_function = \"g_value_take_string\")]\n\tpublic class BusName : string {\n\t\t[CCode (cname = \"g_strdup\")]\n\t\tpublic BusName (string bus_name);\n\t}\n\n\t[CCode (cname = \"G_LIKELY\", cheader_filename = \"glib.h\")]\n\tpublic static bool likely (bool expression);\n\t[CCode (cname = \"G_UNLIKELY\", cheader_filename = \"glib.h\")]\n\tpublic static bool unlikely (bool expression);\n\t[CCode (cname = \"G_STATIC_ASSERT\", cheader_filename = \"glib.h\")]\n\tpublic static void static_assert (bool expression);\n\n\t[CCode (simple_generics = true, cname = \"g_qsort_with_data\")]\n\tprivate static void _qsort_with_data<T> (T[] elems, size_t size, [CCode (type = \"GCompareDataFunc\")] GLib.CompareDataFunc<T> compare_func);\n\n\t[CCode (cname = \"_vala_g_qsort_with_data\")]\n\tpublic static void qsort_with_data<T> (T[] elems, size_t size, [CCode (type = \"GCompareDataFunc\")] GLib.CompareDataFunc<T> compare_func) {\n\t\t_qsort_with_data<T*> (elems, size, (a, b) => {\n\t\t\t\treturn compare_func (*a, *b);\n\t\t\t});\n\t}\n\n\t/* Unix-specific functions. All of these have to include glib-unix.h. */\n\tnamespace Unix {\n\t\t[CCode (cheader_filename = \"glib-unix.h\", cname = \"g_unix_signal_add_full\")]\n\t\tpublic static uint signal_add (int signum, owned GLib.SourceFunc handler, [CCode (pos = 0.9)] int priority = Priority.DEFAULT);\n\n\t\t[CCode (cheader_filename = \"glib-unix.h\", cname = \"GSource\")]\n\t\tpublic class SignalSource : GLib.Source {\n\t\t\tpublic SignalSource (int signum);\n\t\t}\n\n\t\t[CCode (cheader_filename = \"glib-unix.h\")]\n\t\tpublic static bool open_pipe (int fds, int flags) throws GLib.Error;\n\t\t[CCode (cheader_filename = \"glib-unix.h\")]\n\t\tpublic static bool set_fd_nonblocking (int fd, bool nonblock) throws GLib.Error;\n\t}\n\n\t[CCode (cname = \"GUnicodeScript\", cprefix = \"G_UNICODE_SCRIPT_\", has_type_id = false)]\n\tpublic enum UnicodeScript {\n\t\tINVALID_CODE,\n\t\tCOMMON,\n\t\tINHERITED,\n\t\tARABIC,\n\t\tARMENIAN,\n\t\tBENGALI,\n\t\tBOPOMOFO,\n\t\tCHEROKEE,\n\t\tCOPTIC,\n\t\tCYRILLIC,\n\t\tDESERET,\n\t\tDEVANAGARI,\n\t\tETHIOPIC,\n\t\tGEORGIAN,\n\t\tGOTHIC,\n\t\tGREEK,\n\t\tGUJARATI,\n\t\tGURMUKHI,\n\t\tHAN,\n\t\tHANGUL,\n\t\tHEBREW,\n\t\tHIRAGANA,\n\t\tKANNADA,\n\t\tKATAKANA,\n\t\tKHMER,\n\t\tLAO,\n\t\tLATIN,\n\t\tMALAYALAM,\n\t\tMONGOLIAN,\n\t\tMYANMAR,\n\t\tOGHAM,\n\t\tOLD_ITALIC,\n\t\tORIYA,\n\t\tRUNIC,\n\t\tSINHALA,\n\t\tSYRIAC,\n\t\tTAMIL,\n\t\tTELUGU,\n\t\tTHAANA,\n\t\tTHAI,\n\t\tTIBETAN,\n\t\tCANADIAN_ABORIGINAL,\n\t\tYI,\n\t\tTAGALOG,\n\t\tHANUNOO,\n\t\tBUHID,\n\t\tTAGBANWA,\n\n\t\tBRAILLE,\n\t\tCYPRIOT,\n\t\tLIMBU,\n\t\tOSMANYA,\n\t\tSHAVIAN,\n\t\tLINEAR_B,\n\t\tTAI_LE,\n\t\tUGARITIC,\n\n\t\tNEW_TAI_LUE,\n\t\tBUGINESE,\n\t\tGLAGOLITIC,\n\t\tTIFINAGH,\n\t\tSYLOTI_NAGRI,\n\t\tOLD_PERSIAN,\n\t\tKHAROSHTHI,\n\n\t\tUNKNOWN,\n\t\tBALINESE,\n\t\tCUNEIFORM,\n\t\tPHOENICIAN,\n\t\tPHAGS_PA,\n\t\tNKO,\n\n\t\tKAYAH_LI,\n\t\tLEPCHA,\n\t\tREJANG,\n\t\tSUNDANESE,\n\t\tSAURASHTRA,\n\t\tCHAM,\n\t\tOL_CHIKI,\n\t\tVAI,\n\t\tCARIAN,\n\t\tLYCIAN,\n\t\tLYDIAN,\n\n\t\t/* Unicode-5.2 additions */\n\t\tAVESTAN,                /* Avst */\n\t\tBAMUM,                  /* Bamu */\n\t\tEGYPTIAN_HIEROGLYPHS,   /* Egyp */\n\t\tIMPERIAL_ARAMAIC,       /* Armi */\n\t\tINSCRIPTIONAL_PAHLAVI,  /* Phli */\n\t\tINSCRIPTIONAL_PARTHIAN, /* Prti */\n\t\tJAVANESE,               /* Java */\n\t\tKAITHI,                 /* Kthi */\n\t\tLISU,                   /* Lisu */\n\t\tMEETEI_MAYEK,           /* Mtei */\n\t\tOLD_SOUTH_ARABIAN,      /* Sarb */\n\t\tOLD_TURKIC,             /* Orkh */\n\t\tSAMARITAN,              /* Samr */\n\t\tTAI_THAM,               /* Lana */\n\t\tTAI_VIET,               /* Tavt */\n\n\t\t/* Unicode-6.0 additions */\n\t\tBATAK,                  /* Batk */\n\t\tBRAHMI,                 /* Brah */\n\t\tMANDAIC,                /* Mand */\n\n\t\t/* Unicode-6.1 additions */\n\t\tCHAKMA,                 /* Cakm */\n\t\tMEROITIC_CURSIVE,       /* Merc */\n\t\tMEROITIC_HIEROGLYPHS,   /* Mero */\n\t\tMIAO,                   /* Plrd */\n\t\tSHARADA,                /* Shrd */\n\t\tSORA_SOMPENG,           /* Sora */\n\t\tTAKRI                   /* Takr */\n\t}\n\n\t[CCode (cname = \"GUnicodeType\", cprefix = \"G_UNICODE_\", has_type_id = false)]\n\tpublic enum UnicodeType {\n\t\tCONTROL,\n\t\tFORMAT,\n\t\tUNASSIGNED,\n\t\tPRIVATE_USE,\n\t\tSURROGATE,\n\t\tLOWERCASE_LETTER,\n\t\tMODIFIER_LETTER,\n\t\tOTHER_LETTER,\n\t\tTITLECASE_LETTER,\n\t\tUPPERCASE_LETTER,\n\t\tCOMBINING_MARK,\n\t\tENCLOSING_MARK,\n\t\tNON_SPACING_MARK,\n\t\tDECIMAL_NUMBER,\n\t\tLETTER_NUMBER,\n\t\tOTHER_NUMBER,\n\t\tCONNECT_PUNCTUATION,\n\t\tDASH_PUNCTUATION,\n\t\tCLOSE_PUNCTUATION,\n\t\tFINAL_PUNCTUATION,\n\t\tINITIAL_PUNCTUATION,\n\t\tOTHER_PUNCTUATION,\n\t\tOPEN_PUNCTUATION,\n\t\tCURRENCY_SYMBOL,\n\t\tMODIFIER_SYMBOL,\n\t\tMATH_SYMBOL,\n\t\tOTHER_SYMBOL,\n\t\tLINE_SEPARATOR,\n\t\tPARAGRAPH_SEPARATOR,\n\t\tSPACE_SEPARATOR\n\t}\n\n\t[CCode (cname = \"GUnicodeBreakType\", cprefix = \"G_UNICODE_BREAK_\", has_type_id = false)]\n\tpublic enum UnicodeBreakType {\n\t\tMANDATORY,\n\t\tCARRIAGE_RETURN,\n\t\tLINE_FEED,\n\t\tCOMBINING_MARK,\n\t\tSURROGATE,\n\t\tZERO_WIDTH_SPACE,\n\t\tINSEPARABLE,\n\t\tNON_BREAKING_GLUE,\n\t\tCONTINGENT,\n\t\tSPACE,\n\t\tAFTER,\n\t\tBEFORE,\n\t\tBEFORE_AND_AFTER,\n\t\tHYPHEN,\n\t\tNON_STARTER,\n\t\tOPEN_PUNCTUATION,\n\t\tCLOSE_PUNCTUATION,\n\t\tQUOTATION,\n\t\tEXCLAMATION,\n\t\tIDEOGRAPHIC,\n\t\tNUMERIC,\n\t\tINFIX_SEPARATOR,\n\t\tSYMBOL,\n\t\tALPHABETIC,\n\t\tPREFIX,\n\t\tPOSTFIX,\n\t\tCOMPLEX_CONTEXT,\n\t\tAMBIGUOUS,\n\t\tUNKNOWN,\n\t\tNEXT_LINE,\n\t\tWORD_JOINER,\n\t\tHANGUL_L_JAMO,\n\t\tHANGUL_V_JAMO,\n\t\tHANGUL_T_JAMO,\n\t\tHANGUL_LV_SYLLABLE,\n\t\tHANGUL_LVT_SYLLABLE,\n\t\tCLOSE_PARANTHESIS,\n\t\tCONDITIONAL_JAPANESE_STARTER,\n\t\tHEBREW_LETTER,\n\t\tREGIONAL_INDICATOR\n\t}\n\n\t[CCode (cname = \"GNormalizeMode\", cprefix = \"G_NORMALIZE_\", has_type_id = false)]\n\tpublic enum NormalizeMode {\n\t\tDEFAULT,\n\t\tNFD,\n\t\tDEFAULT_COMPOSE,\n\t\tNFC,\n\t\tALL,\n\t\tNFKD,\n\t\tALL_COMPOSE,\n\t\tNFKC\n\t}\n}\n"
  }
]