From 87e243ccda2755fa0b7dc24b25d16ec401b0cd65 Mon Sep 17 00:00:00 2001 From: Artem Anufrij Date: Mon, 31 Jul 2017 20:27:03 +0200 Subject: [PATCH] Webby fork --- CMakeLists.txt | 147 ++++ INSTALL | 24 + cmake/GSettings.cmake | 42 + cmake/Makefile | 286 +++++++ cmake/README | 10 + cmake/README.Vala.rst | 173 ++++ cmake/Translations.cmake | 41 + cmake/uninstall.cmake | 21 + cmake/vala/FindVala.cmake | 65 ++ cmake/vala/ParseArguments.cmake | 36 + cmake/vala/ValaPrecompile.cmake | 175 +++++ cmake/vala/ValaVersion.cmake | 96 +++ config.h.cmake | 11 + data/icons/webby.svg | 759 ++++++++++++++++++ data/webby.desktop | 20 + po/CMakeLists.txt | 6 + po/de.po | 75 ++ po/es.po | 75 ++ po/gl.po | 75 ++ po/ru.po | 75 ++ po/vi.po | 75 ++ po/webby.pot | 102 +++ schemas/CMakeLists.txt | 5 + schemas/org.pantheon.Webby.gschema.xml | 24 + src/AppWindow.vala | 200 +++++ src/Assistant.vala | 299 +++++++ src/DesktopFile.vala | 121 +++ src/InfoDialog.vala | 18 + src/Launcher.vala | 0 src/Settings.vala | 23 + src/UrlEntry.vala | 15 + src/WebApp.vala | 152 ++++ src/WebAppWindow.vala | 142 ++++ src/WebBar.vala | 72 ++ src/Webby.vala | 15 + src/Widgets/ApplicationIcon.vala | 129 +++ src/Widgets/ApplicationsView.vala | 86 ++ vapi/CMakeLists.txt | 2 + vapi/cmake/GSettings.cmake | 42 + vapi/cmake/Makefile | 286 +++++++ vapi/cmake/README | 10 + vapi/cmake/README.Vala.rst | 173 ++++ vapi/cmake/Translations.cmake | 41 + vapi/cmake/uninstall.cmake | 21 + vapi/cmake/vala/FindVala.cmake | 65 ++ vapi/cmake/vala/ParseArguments.cmake | 36 + vapi/cmake/vala/ValaPrecompile.cmake | 175 +++++ vapi/cmake/vala/ValaVersion.cmake | 96 +++ vapi/config.vapi | 9 + vapi/webkit2gtk-3.0.deps | 7 + vapi/webkit2gtk-3.0.vapi | 1003 ++++++++++++++++++++++++ 51 files changed, 5656 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 INSTALL create mode 100644 cmake/GSettings.cmake create mode 100644 cmake/Makefile create mode 100644 cmake/README create mode 100644 cmake/README.Vala.rst create mode 100644 cmake/Translations.cmake create mode 100644 cmake/uninstall.cmake create mode 100644 cmake/vala/FindVala.cmake create mode 100644 cmake/vala/ParseArguments.cmake create mode 100644 cmake/vala/ValaPrecompile.cmake create mode 100644 cmake/vala/ValaVersion.cmake create mode 100644 config.h.cmake create mode 100644 data/icons/webby.svg create mode 100644 data/webby.desktop create mode 100644 po/CMakeLists.txt create mode 100644 po/de.po create mode 100644 po/es.po create mode 100644 po/gl.po create mode 100644 po/ru.po create mode 100644 po/vi.po create mode 100644 po/webby.pot create mode 100644 schemas/CMakeLists.txt create mode 100644 schemas/org.pantheon.Webby.gschema.xml create mode 100644 src/AppWindow.vala create mode 100644 src/Assistant.vala create mode 100644 src/DesktopFile.vala create mode 100644 src/InfoDialog.vala create mode 100644 src/Launcher.vala create mode 100644 src/Settings.vala create mode 100644 src/UrlEntry.vala create mode 100644 src/WebApp.vala create mode 100644 src/WebAppWindow.vala create mode 100644 src/WebBar.vala create mode 100644 src/Webby.vala create mode 100644 src/Widgets/ApplicationIcon.vala create mode 100644 src/Widgets/ApplicationsView.vala create mode 100644 vapi/CMakeLists.txt create mode 100644 vapi/cmake/GSettings.cmake create mode 100644 vapi/cmake/Makefile create mode 100644 vapi/cmake/README create mode 100644 vapi/cmake/README.Vala.rst create mode 100644 vapi/cmake/Translations.cmake create mode 100644 vapi/cmake/uninstall.cmake create mode 100644 vapi/cmake/vala/FindVala.cmake create mode 100644 vapi/cmake/vala/ParseArguments.cmake create mode 100644 vapi/cmake/vala/ValaPrecompile.cmake create mode 100644 vapi/cmake/vala/ValaVersion.cmake create mode 100644 vapi/config.vapi create mode 100644 vapi/webkit2gtk-3.0.deps create mode 100644 vapi/webkit2gtk-3.0.vapi diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d45ad8e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,147 @@ +project(Webby) +cmake_minimum_required (VERSION 2.8) + +list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala) + +# +# Base bits +# +set (CMAKE_C_FLAGS "-ggdb") +set (DATADIR "${CMAKE_INSTALL_PREFIX}/share") +set (PKGDATADIR "${DATADIR}/webby") +set (GETTEXT_PACKAGE "webby") +set (RELEASE_NAME "Webby") +set (VERSION "1.0") +set (VERSION_INFO "Release") + + +# +# Niceties +# +set (ARCHIVE_NAME webby-${VERSION}) +add_custom_target (dist + COMMAND bzr export --root=${ARCHIVE_NAME} ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.bz2 + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + +add_custom_target (distcheck + COMMAND cd ${CMAKE_BINARY_DIR} + && rm -rf ${ARCHIVE_NAME} + && tar xf ${ARCHIVE_NAME}.tar.bz2 + && mkdir ${ARCHIVE_NAME}/build + && cd ${ARCHIVE_NAME}/build + && cmake -DCMAKE_INSTALL_PREFIX=../install -DGSETTINGS_LOCALINSTALL=ON .. -DCMAKE_MODULE_PATH=/usr/share/cmake + && make -j8 + && make -j8 install + && make check + ) +add_dependencies(distcheck dist) + +add_custom_target (uninstall "${CMAKE_COMMAND}" -P + "${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake") + + +# +# config.h +# + +configure_file (${CMAKE_SOURCE_DIR}/config.h.cmake ${CMAKE_BINARY_DIR}/config.h) +add_definitions(-include config.h) + + +# +# Data +# + +file (GLOB _datafiles "${CMAKE_CURRENT_SOURCE_DIR}/data/files/*") +install (FILES ${_datafiles} DESTINATION ${PKGDATADIR}/files) + +file (GLOB _imagefiles "${CMAKE_CURRENT_SOURCE_DIR}/data/icons/*") +install (FILES ${_imagefiles} DESTINATION ${PKGDATADIR}) + +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/webby.desktop DESTINATION /usr/share/applications) + +# +# Icons +# + +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/icons/webby.svg DESTINATION share/icons/hicolor/scalable/apps/) + +option (ICON_UPDATE "Run gtk-update-icon-cache after the install." ON) +if (ICON_UPDATE) + install (CODE "message(\"-- Updating icon cache...\")") + install (CODE "execute_process(COMMAND gtk-update-icon-cache -f -t ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor)") +endif () + + +# +# i18n +# +add_subdirectory(vapi) +add_subdirectory(po) + +# +# SRC +# + +find_package(PkgConfig) +pkg_check_modules(DEPS REQUIRED gobject-2.0 glib-2.0 gio-2.0 gtk+-3.0>=3.12 gthread-2.0 granite gee-0.8 webkit2gtk-3.0 libsoup-2.4 gdk-pixbuf-2.0) + +add_definitions(${DEPS_CFLAGS}) + +link_libraries(${DEPS_LIBRARIES}) +link_directories(${DEPS_LIBRARY_DIRS}) + +find_package(Vala REQUIRED) +include(ValaVersion) +ensure_vala_version("0.26.0" MINIMUM) + +set(PKG_DEPS gtk+-3.0 + granite + gio-2.0 + gee-0.8 + posix + webkit2gtk-3.0 + libsoup-2.4 + gdk-pixbuf-2.0) + + +set(SRC_FILES + src/Widgets/ApplicationIcon.vala + src/Widgets/ApplicationsView.vala + src/AppWindow.vala + src/Assistant.vala + src/DesktopFile.vala + src/InfoDialog.vala + src/Launcher.vala + src/Settings.vala + src/UrlEntry.vala + src/WebApp.vala + src/WebBar.vala + src/Webby.vala + src/WebAppWindow.vala) + +# +# schema +# +add_subdirectory (schemas) + + +include(ValaPrecompile) +vala_precompile(VALA_C ${SRC_FILES} PACKAGES ${PKG_DEPS} + +CUSTOM_VAPIS + vapi/config.vapi +OPTIONS + --vapidir=${CMAKE_SOURCE_DIR}/vapi + --thread + -g + --debug + --target-glib=2.32 + ) + +add_definitions(${CFLAGS}-lm -Wall -Winit-self -Wwrite-strings -Wunreachable-code -Wstrict-prototypes) +add_executable(webby ${VALA_C}) +target_link_libraries(webby ${SQLITE_LIBRARIES} ${CLUTTERGTK_LIBRARIES} -lm) +install(TARGETS webby RUNTIME DESTINATION bin) diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..13bc35a --- /dev/null +++ b/INSTALL @@ -0,0 +1,24 @@ +-------------------------------------------------------------------------------- +OPTIONAL +-------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------- +REQUIRED +-------------------------------------------------------------------------------- + + +-------------------------------------------------------------------------------- +DEPENDENCIES +-------------------------------------------------------------------------------- +gtk+-3.0, granite, gio-2.0, gee-0.8, clutter-gtk-1.0, clutter-1.0, posix, webkit2gtk-3.0, libsoup-2.4 +-------------------------------------------------------------------------------- +BUILDING +-------------------------------------------------------------------------------- +bzr branch lp:webby-browser +cd webby-browser +mkdir build +cd build +cmake .. -DCMAKE_INSTALL_PREFIX=/usr +make +sudo make install diff --git a/cmake/GSettings.cmake b/cmake/GSettings.cmake new file mode 100644 index 0000000..8fd745c --- /dev/null +++ b/cmake/GSettings.cmake @@ -0,0 +1,42 @@ +# GSettings.cmake, CMake macros written for Marlin, feel free to re-use them. + +option (GSETTINGS_LOCALINSTALL "Install GSettings Schemas locally instead of to the GLib prefix" ON) + +option (GSETTINGS_COMPILE "Compile GSettings Schemas after installation" ${GSETTINGS_LOCALINSTALL}) + +if(GSETTINGS_LOCALINSTALL) + message(STATUS "GSettings schemas will be installed locally.") +endif() + +if(GSETTINGS_COMPILE) + message(STATUS "GSettings shemas will be compiled.") +endif() + +macro(add_schema SCHEMA_NAME) + + set(PKG_CONFIG_EXECUTABLE pkg-config) + # Have an option to not install the schema into where GLib is + if (GSETTINGS_LOCALINSTALL) + SET (GSETTINGS_DIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/") + else (GSETTINGS_LOCALINSTALL) + execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} glib-2.0 --variable prefix OUTPUT_VARIABLE _glib_prefix OUTPUT_STRIP_TRAILING_WHITESPACE) + SET (GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/") + endif (GSETTINGS_LOCALINSTALL) + + # Run the validator and error if it fails + execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE _glib_comple_schemas OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process (COMMAND ${_glib_comple_schemas} --dry-run --schema-file=${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} ERROR_VARIABLE _schemas_invalid OUTPUT_STRIP_TRAILING_WHITESPACE) + + if (_schemas_invalid) + message (SEND_ERROR "Schema validation error: ${_schemas_invalid}") + endif (_schemas_invalid) + + # Actually install and recomple schemas + message (STATUS "GSettings schemas will be installed into ${GSETTINGS_DIR}") + install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} DESTINATION ${GSETTINGS_DIR} OPTIONAL) + + if (GSETTINGS_COMPILE) + install (CODE "message (STATUS \"Compiling GSettings schemas\")") + install (CODE "execute_process (COMMAND ${_glib_comple_schemas} ${GSETTINGS_DIR})") + endif () +endmacro() diff --git a/cmake/Makefile b/cmake/Makefile new file mode 100644 index 0000000..aee34c9 --- /dev/null +++ b/cmake/Makefile @@ -0,0 +1,286 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canoncical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/mefrio/Scrivania/cmake + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/mefrio/Scrivania/cmake/cmake + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/mefrio/Scrivania/cmake/cmake/CMakeFiles /home/mefrio/Scrivania/cmake/cmake/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/mefrio/Scrivania/cmake/cmake/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named scratch + +# Build rule for target. +scratch: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 scratch +.PHONY : scratch + +# fast build rule for target. +scratch/fast: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/build +.PHONY : scratch/fast + +src/entry.o: src/entry.c.o +.PHONY : src/entry.o + +# target to build an object file +src/entry.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/entry.c.o +.PHONY : src/entry.c.o + +src/entry.i: src/entry.c.i +.PHONY : src/entry.i + +# target to preprocess a source file +src/entry.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/entry.c.i +.PHONY : src/entry.c.i + +src/entry.s: src/entry.c.s +.PHONY : src/entry.s + +# target to generate assembly for a file +src/entry.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/entry.c.s +.PHONY : src/entry.c.s + +src/main_window.o: src/main_window.c.o +.PHONY : src/main_window.o + +# target to build an object file +src/main_window.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/main_window.c.o +.PHONY : src/main_window.c.o + +src/main_window.i: src/main_window.c.i +.PHONY : src/main_window.i + +# target to preprocess a source file +src/main_window.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/main_window.c.i +.PHONY : src/main_window.c.i + +src/main_window.s: src/main_window.c.s +.PHONY : src/main_window.s + +# target to generate assembly for a file +src/main_window.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/main_window.c.s +.PHONY : src/main_window.c.s + +src/menu.o: src/menu.c.o +.PHONY : src/menu.o + +# target to build an object file +src/menu.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/menu.c.o +.PHONY : src/menu.c.o + +src/menu.i: src/menu.c.i +.PHONY : src/menu.i + +# target to preprocess a source file +src/menu.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/menu.c.i +.PHONY : src/menu.c.i + +src/menu.s: src/menu.c.s +.PHONY : src/menu.s + +# target to generate assembly for a file +src/menu.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/menu.c.s +.PHONY : src/menu.c.s + +src/notebook.o: src/notebook.c.o +.PHONY : src/notebook.o + +# target to build an object file +src/notebook.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/notebook.c.o +.PHONY : src/notebook.c.o + +src/notebook.i: src/notebook.c.i +.PHONY : src/notebook.i + +# target to preprocess a source file +src/notebook.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/notebook.c.i +.PHONY : src/notebook.c.i + +src/notebook.s: src/notebook.c.s +.PHONY : src/notebook.s + +# target to generate assembly for a file +src/notebook.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/notebook.c.s +.PHONY : src/notebook.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... scratch" + @echo "... src/entry.o" + @echo "... src/entry.i" + @echo "... src/entry.s" + @echo "... src/main_window.o" + @echo "... src/main_window.i" + @echo "... src/main_window.s" + @echo "... src/menu.o" + @echo "... src/menu.i" + @echo "... src/menu.s" + @echo "... src/notebook.o" + @echo "... src/notebook.i" + @echo "... src/notebook.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/cmake/README b/cmake/README new file mode 100644 index 0000000..9d45b32 --- /dev/null +++ b/cmake/README @@ -0,0 +1,10 @@ + Elementary CMake modules + +This is a set of CMake modules: Translations, GSettings, and Vala modules. + +For all the Vala related modules see README.Vala.rst: + - ParseArguments.cmake + - ValaPrecompile.cmake + - ValaVersion.cmake + - FindVala.cmake + diff --git a/cmake/README.Vala.rst b/cmake/README.Vala.rst new file mode 100644 index 0000000..bcc59b7 --- /dev/null +++ b/cmake/README.Vala.rst @@ -0,0 +1,173 @@ +========== +Vala CMake +========== +:Author: + Jakob Westhoff +:Version: + Draft + + +Overview +======== + +Vala CMake is a collection of macros for the CMake_ build system to allow the +creation and management of projects developed using the Vala_ programming +language or its "Genie" flavor (less tested). + + +Installation +============ + +To use the Vala macros in your own project you need to copy the macro files to +an arbitrary folder in your projects directory and reference them in your +``CMakeLists.txt`` file. + +Assuming the macros are stored under ``cmake/vala`` in your projects folder you +need to add the following information to your base ``CMakeLists.txt``:: + + list(APPEND CMAKE_MODULE_PATH + ${CMAKE_SOURCE_DIR}/cmake/vala + ) + +After the new module path as been added you can simply include the provided +modules or use the provided find routines. + + +Finding Vala +============ + +The find module for vala works like any other Find module in CMake. +You can use it by simply calling the usual ``find_package`` function. Default +parameters like ``REQUIRED`` and ``QUIETLY`` are supported. + +:: + + find_package(Vala REQUIRED) + +After a successful call to the find_package function the following variables +will be set: + +VALA_FOUND + Whether the vala compiler has been found or not + +VALA_EXECUTABLE + Full path to the valac executable if it has been found + +VALA_VERSION + Version number of the available valac + + +Precompiling Vala sources +========================= + +CMake is mainly supposed to handle c or c++ based projects. Luckily every vala +program is translated into plain c code using the vala compiler, followed by +normal compilation of the generated c program using gcc. + +The macro ``vala_precompile`` uses that fact to create c files from your .vala +sources for further CMake processing. + +The first parameter provided is a variable, which will be filled with a list of +c files outputted by the vala compiler. This list can than be used in +conjunction with functions like ``add_executable`` or others to create the +necessary compile rules with CMake. + +The initial variable is followed by a list of .vala files to be compiled. +Please take care to add every vala file belonging to the currently compiled +project or library as Vala will otherwise not be able to resolve all +dependencies. + +The following sections may be specified afterwards to provide certain options +to the vala compiler: + +PACKAGES + A list of vala packages/libraries to be used during the compile cycle. The + package names are exactly the same, as they would be passed to the valac + "--pkg=" option. + +OPTIONS + A list of optional options to be passed to the valac executable. This can be + used to pass "--thread" for example to enable multi-threading support. + +DIRECTORY + Specify the directory where the output source files will be stored. If + ommitted, the source files will be stored in CMAKE_CURRENT_BINARY_DIR. + +CUSTOM_VAPIS + A list of custom vapi files to be included for compilation. This can be + useful to include freshly created vala libraries without having to install + them in the system. + +GENERATE_VAPI + Pass all the needed flags to the compiler to create an internal vapi for + the compiled library. The provided name will be used for this and a + .vapi file will be created. + +GENERATE_HEADER + Let the compiler generate a header file for the compiled code. There will + be a header file as well as an internal header file being generated called + .h and _internal.h + +The following call is a simple example to the vala_precompile macro showing an +example to every of the optional sections:: + + vala_precompile(VALA_C + source1.vala + source2.vala + source3.vala + PACKAGES + gtk+-2.0 + gio-1.0 + posix + OPTIONS + --thread + CUSTOM_VAPIS + some_vapi.vapi + GENERATE_VAPI + myvapi + GENERATE_HEADER + myheader + ) + +Most important is the variable VALA_C which will contain all the generated c +file names after the call. The easiest way to use this information is to tell +CMake to create an executable out of it. + +:: + + add_executable(myexecutable ${VALA_C}) + + +Further reading +=============== + +The `Pdf Presenter Console`__ , which is a vala based project of mine, makes +heavy usage of the here described macros. To look at a real world example of +these macros the mentioned project is the right place to take a look. The svn +trunk of it can be found at:: + + svn://pureenergy.cc/pdf_presenter_console/trunk + + +__ http://westhoffswelt.de/projects/pdf_presenter_console.html + + +Acknowledgments +=============== + +Thanks go out to Florian Sowade, a fellow local PHP-Usergroupie, who helped me +a lot with the initial version of this macros and always answered my mostly +dumb CMake questions. + +.. _CMake: http://cmake.org +.. _Vala: http://live.gnome.org/Vala +.. _Genie: http://live.gnome.org/Genie + + + +.. + Local Variables: + mode: rst + fill-column: 79 + End: + vim: et syn=rst tw=79 diff --git a/cmake/Translations.cmake b/cmake/Translations.cmake new file mode 100644 index 0000000..be53b74 --- /dev/null +++ b/cmake/Translations.cmake @@ -0,0 +1,41 @@ +# Translations.cmake, CMake macros written for Marlin, feel free to re-use them + +macro(add_translations_directory NLS_PACKAGE) + add_custom_target (i18n ALL COMMENT “Building i18n messages.”) + find_program (MSGFMT_EXECUTABLE msgfmt) + file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po) + foreach (PO_INPUT ${PO_FILES}) + get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME_WE) + set (MO_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PO_INPUT_BASE}.mo) + add_custom_command (TARGET i18n COMMAND ${MSGFMT_EXECUTABLE} -o ${MO_OUTPUT} ${PO_INPUT}) + + install (FILES ${MO_OUTPUT} DESTINATION + share/locale/${PO_INPUT_BASE}/LC_MESSAGES + RENAME ${NLS_PACKAGE}.mo) + endforeach (PO_INPUT ${PO_FILES}) +endmacro(add_translations_directory) + + +macro(add_translations_catalog NLS_PACKAGE) + add_custom_target (pot COMMENT “Building translation catalog.”) + find_program (XGETTEXT_EXECUTABLE xgettext) + + + set(C_SOURCE "") + + foreach(FILES_INPUT ${ARGN}) + file (GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT}/*.c) + foreach(C_FILE ${SOURCE_FILES}) + set(C_SOURCE ${C_SOURCE} ${C_FILE}) + endforeach() + file (GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT}/*.vala) + foreach(C_FILE ${SOURCE_FILES}) + set(C_SOURCE ${C_SOURCE} ${C_FILE}) + endforeach() + endforeach() + + add_custom_command (TARGET pot COMMAND + ${XGETTEXT_EXECUTABLE} -d ${NLS_PACKAGE} -o ${CMAKE_CURRENT_SOURCE_DIR}/${NLS_PACKAGE}.pot + ${VALA_SOURCE} ${C_SOURCE} --keyword="_" --from-code=UTF-8 + ) +endmacro() diff --git a/cmake/uninstall.cmake b/cmake/uninstall.cmake new file mode 100644 index 0000000..0785ac8 --- /dev/null +++ b/cmake/uninstall.cmake @@ -0,0 +1,21 @@ +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +endif() + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + if(EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + endif() + else(EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + endif() +endforeach() diff --git a/cmake/vala/FindVala.cmake b/cmake/vala/FindVala.cmake new file mode 100644 index 0000000..aa3a6e7 --- /dev/null +++ b/cmake/vala/FindVala.cmake @@ -0,0 +1,65 @@ +## +# Copyright 2009-2010 Jakob Westhoff. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of Jakob Westhoff +## + +## +# Find module for the Vala compiler (valac) +# +# This module determines wheter a Vala compiler is installed on the current +# system and where its executable is. +# +# Call the module using "find_package(Vala) from within your CMakeLists.txt. +# +# The following variables will be set after an invocation: +# +# VALA_FOUND Whether the vala compiler has been found or not +# VALA_EXECUTABLE Full path to the valac executable if it has been found +# VALA_VERSION Version number of the available valac +## + + +# Search for the valac executable in the usual system paths. +find_program(VALA_EXECUTABLE + NAMES valac) + +# Handle the QUIETLY and REQUIRED arguments, which may be given to the find call. +# Furthermore set VALA_FOUND to TRUE if Vala has been found (aka. +# VALA_EXECUTABLE is set) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Vala DEFAULT_MSG VALA_EXECUTABLE) + +mark_as_advanced(VALA_EXECUTABLE) + +# Determine the valac version +if(VALA_FOUND) + execute_process(COMMAND ${VALA_EXECUTABLE} "--version" + OUTPUT_VARIABLE "VALA_VERSION") + string(REPLACE "Vala" "" "VALA_VERSION" ${VALA_VERSION}) + string(STRIP ${VALA_VERSION} "VALA_VERSION") +endif(VALA_FOUND) diff --git a/cmake/vala/ParseArguments.cmake b/cmake/vala/ParseArguments.cmake new file mode 100644 index 0000000..717c0f5 --- /dev/null +++ b/cmake/vala/ParseArguments.cmake @@ -0,0 +1,36 @@ +## +# This is a helper Macro to parse optional arguments in Macros/Functions +# It has been taken from the public CMake wiki. +# See http://www.cmake.org/Wiki/CMakeMacroParseArguments for documentation and +# licensing. +## +macro(parse_arguments prefix arg_names option_names) + set(DEFAULT_ARGS) + foreach(arg_name ${arg_names}) + set(${prefix}_${arg_name}) + endforeach(arg_name) + foreach(option ${option_names}) + set(${prefix}_${option} FALSE) + endforeach(option) + + set(current_arg_name DEFAULT_ARGS) + set(current_arg_list) + foreach(arg ${ARGN}) + set(larg_names ${arg_names}) + list(FIND larg_names "${arg}" is_arg_name) + if(is_arg_name GREATER -1) + set(${prefix}_${current_arg_name} ${current_arg_list}) + set(current_arg_name ${arg}) + set(current_arg_list) + else(is_arg_name GREATER -1) + set(loption_names ${option_names}) + list(FIND loption_names "${arg}" is_option) + if(is_option GREATER -1) + set(${prefix}_${arg} TRUE) + else(is_option GREATER -1) + set(current_arg_list ${current_arg_list} ${arg}) + endif(is_option GREATER -1) + endif(is_arg_name GREATER -1) + endforeach(arg) + set(${prefix}_${current_arg_name} ${current_arg_list}) +endmacro(parse_arguments) diff --git a/cmake/vala/ValaPrecompile.cmake b/cmake/vala/ValaPrecompile.cmake new file mode 100644 index 0000000..19c4739 --- /dev/null +++ b/cmake/vala/ValaPrecompile.cmake @@ -0,0 +1,175 @@ +## +# Copyright 2009-2010 Jakob Westhoff. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of Jakob Westhoff +## + +include(ParseArguments) +find_package(Vala REQUIRED) + +## +# Compile vala files to their c equivalents for further processing. +# +# The "vala_precompile" macro takes care of calling the valac executable on the +# given source to produce c files which can then be processed further using +# default cmake functions. +# +# The first parameter provided is a variable, which will be filled with a list +# of c files outputted by the vala compiler. This list can than be used in +# conjuction with functions like "add_executable" or others to create the +# neccessary compile rules with CMake. +# +# The initial variable is followed by a list of .vala files to be compiled. +# Please take care to add every vala file belonging to the currently compiled +# project or library as Vala will otherwise not be able to resolve all +# dependencies. +# +# The following sections may be specified afterwards to provide certain options +# to the vala compiler: +# +# PACKAGES +# A list of vala packages/libraries to be used during the compile cycle. The +# package names are exactly the same, as they would be passed to the valac +# "--pkg=" option. +# +# OPTIONS +# A list of optional options to be passed to the valac executable. This can be +# used to pass "--thread" for example to enable multi-threading support. +# +# CUSTOM_VAPIS +# A list of custom vapi files to be included for compilation. This can be +# useful to include freshly created vala libraries without having to install +# them in the system. +# +# GENERATE_VAPI +# Pass all the needed flags to the compiler to create an internal vapi for +# the compiled library. The provided name will be used for this and a +# .vapi file will be created. +# +# GENERATE_HEADER +# Let the compiler generate a header file for the compiled code. There will +# be a header file as well as an internal header file being generated called +# .h and _internal.h +# +# The following call is a simple example to the vala_precompile macro showing +# an example to every of the optional sections: +# +# vala_precompile(VALA_C +# source1.vala +# source2.vala +# source3.vala +# PACKAGES +# gtk+-2.0 +# gio-1.0 +# posix +# DIRECTORY +# gen +# OPTIONS +# --thread +# CUSTOM_VAPIS +# some_vapi.vapi +# GENERATE_VAPI +# myvapi +# GENERATE_HEADER +# myheader +# ) +# +# Most important is the variable VALA_C which will contain all the generated c +# file names after the call. +## + +macro(vala_precompile output) + parse_arguments(ARGS "PACKAGES;OPTIONS;DIRECTORY;GENERATE_HEADER;GENERATE_VAPI;CUSTOM_VAPIS" "" ${ARGN}) + if(ARGS_DIRECTORY) + set(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_DIRECTORY}) + else(ARGS_DIRECTORY) + set(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif(ARGS_DIRECTORY) + include_directories(${DIRECTORY}) + set(vala_pkg_opts "") + foreach(pkg ${ARGS_PACKAGES}) + list(APPEND vala_pkg_opts "--pkg=${pkg}") + endforeach(pkg ${ARGS_PACKAGES}) + set(in_files "") + set(out_files "") + set(${output} "") + foreach(src ${ARGS_DEFAULT_ARGS}) + list(APPEND in_files "${CMAKE_CURRENT_SOURCE_DIR}/${src}") + string(REPLACE ".vala" ".c" src ${src}) + string(REPLACE ".gs" ".c" src ${src}) + set(out_file "${DIRECTORY}/${src}") + list(APPEND out_files "${DIRECTORY}/${src}") + list(APPEND ${output} ${out_file}) + endforeach(src ${ARGS_DEFAULT_ARGS}) + + set(custom_vapi_arguments "") + if(ARGS_CUSTOM_VAPIS) + foreach(vapi ${ARGS_CUSTOM_VAPIS}) + if(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR}) + list(APPEND custom_vapi_arguments ${vapi}) + else (${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR}) + list(APPEND custom_vapi_arguments ${CMAKE_CURRENT_SOURCE_DIR}/${vapi}) + endif(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR}) + endforeach(vapi ${ARGS_CUSTOM_VAPIS}) + endif(ARGS_CUSTOM_VAPIS) + + set(vapi_arguments "") + if(ARGS_GENERATE_VAPI) + list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi") + set(vapi_arguments "--internal-vapi=${ARGS_GENERATE_VAPI}.vapi") + + # Header and internal header is needed to generate internal vapi + if (NOT ARGS_GENERATE_HEADER) + set(ARGS_GENERATE_HEADER ${ARGS_GENERATE_VAPI}) + endif(NOT ARGS_GENERATE_HEADER) + endif(ARGS_GENERATE_VAPI) + + set(header_arguments "") + if(ARGS_GENERATE_HEADER) + list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}.h") + list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h") + list(APPEND header_arguments "--header=${DIRECTORY}/${ARGS_GENERATE_HEADER}.h") + list(APPEND header_arguments "--internal-header=${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h") + endif(ARGS_GENERATE_HEADER) + + add_custom_command(OUTPUT ${out_files} + COMMAND + ${VALA_EXECUTABLE} + ARGS + "-C" + ${header_arguments} + ${vapi_arguments} + "-b" ${CMAKE_CURRENT_SOURCE_DIR} + "-d" ${DIRECTORY} + ${vala_pkg_opts} + ${ARGS_OPTIONS} + ${in_files} + ${custom_vapi_arguments} + DEPENDS + ${in_files} + ${ARGS_CUSTOM_VAPIS} + ) +endmacro(vala_precompile) diff --git a/cmake/vala/ValaVersion.cmake b/cmake/vala/ValaVersion.cmake new file mode 100644 index 0000000..3fff193 --- /dev/null +++ b/cmake/vala/ValaVersion.cmake @@ -0,0 +1,96 @@ +## +# Copyright 2009-2010 Jakob Westhoff. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of Jakob Westhoff +## + +include(ParseArguments) +find_package(Vala REQUIRED) + +## +# Ensure a certain valac version is available +# +# The initial argument is the version to check for +# +# It may be followed by a optional parameter to specifiy a version range. The +# following options are valid: +# +# EXACT +# Vala needs to be available in the exact version given +# +# MINIMUM +# The provided version is the minimum version. Therefore Vala needs to be +# available in the given version or any higher version +# +# MAXIMUM +# The provided version is the maximum. Therefore Vala needs to be available +# in the given version or any version older than this +# +# If no option is specified the version will be treated as a minimal version. +## +macro(ensure_vala_version version) + parse_arguments(ARGS "" "MINIMUM;MAXIMUM;EXACT" ${ARGN}) + set(compare_message "") + set(error_message "") + if(ARGS_MINIMUM) + set(compare_message "a minimum ") + set(error_message "or greater ") + elseif(ARGS_MAXIMUM) + set(compare_message "a maximum ") + set(error_message "or less ") + endif(ARGS_MINIMUM) + + message(STATUS + "checking for ${compare_message}Vala version of ${version}" + ) + + unset(version_accepted) + + # MINIMUM is the default if no option is specified + if(ARGS_EXACT) + if(${VALA_VERSION} VERSION_EQUAL ${version} ) + set(version_accepted TRUE) + endif(${VALA_VERSION} VERSION_EQUAL ${version}) + elseif(ARGS_MAXIMUM) + if(${VALA_VERSION} VERSION_LESS ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + set(version_accepted TRUE) + endif(${VALA_VERSION} VERSION_LESS ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + else(ARGS_MAXIMUM) + if(${VALA_VERSION} VERSION_GREATER ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + set(version_accepted TRUE) + endif(${VALA_VERSION} VERSION_GREATER ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + endif(ARGS_EXACT) + + if (NOT version_accepted) + message(FATAL_ERROR + "Vala version ${version} ${error_message}is required." + ) + endif(NOT version_accepted) + + message(STATUS + " found Vala, version ${VALA_VERSION}" + ) +endmacro(ensure_vala_version) diff --git a/config.h.cmake b/config.h.cmake new file mode 100644 index 0000000..57cd41d --- /dev/null +++ b/config.h.cmake @@ -0,0 +1,11 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#cmakedefine DATADIR "@DATADIR@" +#cmakedefine PKGDATADIR "@PKGDATADIR@" +#cmakedefine GETTEXT_PACKAGE "@GETTEXT_PACKAGE@" +#cmakedefine RELEASE_NAME "@RELEASE_NAME@" +#cmakedefine VERSION "@VERSION@" +#cmakedefine VERSION_INFO "@VERSION_INFO@" + +#endif // CONFIG_H diff --git a/data/icons/webby.svg b/data/icons/webby.svg new file mode 100644 index 0000000..647f10a --- /dev/null +++ b/data/icons/webby.svg @@ -0,0 +1,759 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + W + W + + diff --git a/data/webby.desktop b/data/webby.desktop new file mode 100644 index 0000000..82b9c38 --- /dev/null +++ b/data/webby.desktop @@ -0,0 +1,20 @@ +[Desktop Entry] +Version=1.0 +Name=Webby +GenericName=Webby +Comment=Create your apps +Keywords=internet;webapp; +Exec=webby %u +Icon=webby +Terminal=false +Type=Application +Categories=Network;GNOME;GTK; +X-GIO-NoFuse=true +X-GNOME-Gettext-Domain=webby +X-GNOME-FullName=Webby +StartupWMClass=Webby +Actions=AboutDialog; + +[Desktop Action AboutDialog] +Exec=webby --about +Name=About Webby diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 0000000..d645dcb --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,6 @@ +include (Translations) +add_translations_directory ("webby") +add_translations_catalog ("webby" + ../src + ../data +) diff --git a/po/de.po b/po/de.po new file mode 100644 index 0000000..1355732 --- /dev/null +++ b/po/de.po @@ -0,0 +1,75 @@ +# German translation for webby-browser +# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 +# This file is distributed under the same license as the webby-browser package. +# FIRST AUTHOR , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: webby-browser\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2015-02-26 23:57-0300\n" +"PO-Revision-Date: 2015-03-08 14:47+0000\n" +"Last-Translator: Tobias Bannert \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2015-03-24 00:16+0000\n" +"X-Generator: Launchpad (build 17413)\n" + +msgid "Remove Application" +msgstr "Anwendung entfernen" + +msgid "Accept" +msgstr "Bestätigen" + +msgid "Create a new web app with webby" +msgstr "Erstelle eine neue Webanwendung mit Webby" + +msgid "Application name" +msgstr "Anwendungsname" + +msgid "http://myapp.domain" +msgstr "http://myapp.domain" + +msgid "theme icon name" +msgstr "Themasymbolname" + +msgid "or" +msgstr "oder" + +msgid "Set from file..." +msgstr "Datei auswählen …" + +msgid "Save cookies" +msgstr "Cookies speichern" + +msgid "Save login information" +msgstr "Anmeldeinformation speichern" + +msgid "Create app" +msgstr "Anwendung erstellen" + +msgid "url must start with http:// or https://" +msgstr "Adresse muss mit http:// oder https:// beginnen" + +msgid "App already exist" +msgstr "Anwendung ist bereits vorhanden" + +msgid "Images" +msgstr "Bilder" + +msgid "Cancel" +msgstr "Abbrechen" + +msgid "Open" +msgstr "Öffnen" + +msgid "App created" +msgstr "Anwendung wurde erstellt" + +msgid "The application shortcut was successfully created" +msgstr "Tastenkürzel für die Anwendung wurde erfolgreich erstellt" + +msgid "Applications" +msgstr "Anwendungen" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..77c4d2f --- /dev/null +++ b/po/es.po @@ -0,0 +1,75 @@ +# Spanish translation for webby-browser +# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 +# This file is distributed under the same license as the webby-browser package. +# FIRST AUTHOR , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: webby-browser\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2015-02-26 23:57-0300\n" +"PO-Revision-Date: 2015-02-27 03:18+0000\n" +"Last-Translator: Erasmo Marín \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2015-03-24 00:16+0000\n" +"X-Generator: Launchpad (build 17413)\n" + +msgid "Remove Application" +msgstr "Quitar aplicación" + +msgid "Accept" +msgstr "Aceptar" + +msgid "Create a new web app with webby" +msgstr "Crear una nueva aplicación web con webby" + +msgid "Application name" +msgstr "Nombre de la aplicación" + +msgid "http://myapp.domain" +msgstr "http://miapp.dominio" + +msgid "theme icon name" +msgstr "nombre de ícono del tema" + +msgid "or" +msgstr "o" + +msgid "Set from file..." +msgstr "Establecer desde archivo..." + +msgid "Save cookies" +msgstr "Guardar cookies" + +msgid "Save login information" +msgstr "Guardar información de sesión" + +msgid "Create app" +msgstr "Crear aplicación" + +msgid "url must start with http:// or https://" +msgstr "La url debe comenzar con http:// o https://" + +msgid "App already exist" +msgstr "La aplicación ya existe" + +msgid "Images" +msgstr "Imágenes" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "Open" +msgstr "Abrir" + +msgid "App created" +msgstr "Aplicación creada" + +msgid "The application shortcut was successfully created" +msgstr "El atajo a la aplicación fue creado exitosamente" + +msgid "Applications" +msgstr "Aplicaciones" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..f20f839 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,75 @@ +# Galician translation for webby-browser +# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 +# This file is distributed under the same license as the webby-browser package. +# FIRST AUTHOR , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: webby-browser\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2015-02-26 23:57-0300\n" +"PO-Revision-Date: 2015-03-11 07:29+0000\n" +"Last-Translator: Miguel Anxo Bouzada \n" +"Language-Team: Galician \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2015-03-24 00:16+0000\n" +"X-Generator: Launchpad (build 17413)\n" + +msgid "Remove Application" +msgstr "Retirar a aplicación" + +msgid "Accept" +msgstr "Aceptar" + +msgid "Create a new web app with webby" +msgstr "Crear unha nova aplicación web con Webby" + +msgid "Application name" +msgstr "Nome da aplicación" + +msgid "http://myapp.domain" +msgstr "http://amiñapp.dominio" + +msgid "theme icon name" +msgstr "Nome da icona do tema" + +msgid "or" +msgstr "ou" + +msgid "Set from file..." +msgstr "Estabelecer desde un ficheiro..." + +msgid "Save cookies" +msgstr "Gardar as cookies" + +msgid "Save login information" +msgstr "Gardar a información da sesión" + +msgid "Create app" +msgstr "Crear a aplicación" + +msgid "url must start with http:// or https://" +msgstr "O URL debe comezar con http:// ou https://" + +msgid "App already exist" +msgstr "Xa existe a aplicación" + +msgid "Images" +msgstr "Imaxes" + +msgid "Cancel" +msgstr "Carcelar" + +msgid "Open" +msgstr "Abrir" + +msgid "App created" +msgstr "Creouse a aplicación" + +msgid "The application shortcut was successfully created" +msgstr "Creouse satisfactoriamente o atallo á aplicación" + +msgid "Applications" +msgstr "Aplicacións" diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..0e1e00b --- /dev/null +++ b/po/ru.po @@ -0,0 +1,75 @@ +# Russian translation for webby-browser +# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 +# This file is distributed under the same license as the webby-browser package. +# FIRST AUTHOR , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: webby-browser\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2015-02-26 23:57-0300\n" +"PO-Revision-Date: 2015-02-27 20:39+0000\n" +"Last-Translator: Artem Anufrij \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2015-03-24 00:16+0000\n" +"X-Generator: Launchpad (build 17413)\n" + +msgid "Remove Application" +msgstr "Удалить приложение" + +msgid "Accept" +msgstr "" + +msgid "Create a new web app with webby" +msgstr "" + +msgid "Application name" +msgstr "Имя приложения" + +msgid "http://myapp.domain" +msgstr "http://myapp.domain" + +msgid "theme icon name" +msgstr "" + +msgid "or" +msgstr "или" + +msgid "Set from file..." +msgstr "" + +msgid "Save cookies" +msgstr "" + +msgid "Save login information" +msgstr "" + +msgid "Create app" +msgstr "" + +msgid "url must start with http:// or https://" +msgstr "" + +msgid "App already exist" +msgstr "" + +msgid "Images" +msgstr "" + +msgid "Cancel" +msgstr "Отменить" + +msgid "Open" +msgstr "Открыть" + +msgid "App created" +msgstr "" + +msgid "The application shortcut was successfully created" +msgstr "" + +msgid "Applications" +msgstr "Приложения" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..24bd031 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,75 @@ +# Vietnamese translation for webby-browser +# Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 +# This file is distributed under the same license as the webby-browser package. +# FIRST AUTHOR , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: webby-browser\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2015-02-26 23:57-0300\n" +"PO-Revision-Date: 2015-03-15 13:06+0000\n" +"Last-Translator: Nguyễn Thanh Tài \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2015-03-24 00:16+0000\n" +"X-Generator: Launchpad (build 17413)\n" + +msgid "Remove Application" +msgstr "Gỡ ứng dụng" + +msgid "Accept" +msgstr "Đồng ý" + +msgid "Create a new web app with webby" +msgstr "Tạo ứng dụng web mới với webby" + +msgid "Application name" +msgstr "Tên ứng dụng" + +msgid "http://myapp.domain" +msgstr "http://ungdung.tenmien" + +msgid "theme icon name" +msgstr "tên biểu tượng chủ dụng" + +msgid "or" +msgstr "hoặc" + +msgid "Set from file..." +msgstr "Đặt từ tập tin..." + +msgid "Save cookies" +msgstr "Lưu cookie" + +msgid "Save login information" +msgstr "Lưu thông tin đăng nhập" + +msgid "Create app" +msgstr "Tạo ứng dụng" + +msgid "url must start with http:// or https://" +msgstr "url phải bắt đầu với http:// hoặc https://" + +msgid "App already exist" +msgstr "Ứng dụng đã tồn tại" + +msgid "Images" +msgstr "Hình ảnh" + +msgid "Cancel" +msgstr "Huỷ" + +msgid "Open" +msgstr "Mở" + +msgid "App created" +msgstr "Đã tạo ứng dụng" + +msgid "The application shortcut was successfully created" +msgstr "Đã tạo lối tắt ứng dụng thành công" + +msgid "Applications" +msgstr "Ứng dụng" diff --git a/po/webby.pot b/po/webby.pot new file mode 100644 index 0000000..c8cf1d9 --- /dev/null +++ b/po/webby.pot @@ -0,0 +1,102 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-16 23:42+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: /home/artem/Launchpad/webby-browser/po/../src/InfoDialog.vala:16 +msgid "Accept" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/AppWindow.vala:70 +msgid "Applications" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/AppWindow.vala:76 +msgid "Add a new Web App" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/AppWindow.vala:79 +msgid "No Web Apps Availible" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/AppWindow.vala:79 +msgid "Create a new Webby Web App." +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/AppWindow.vala:80 +msgid "Create App" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/AppWindow.vala:80 +msgid "Create a new Webby web app." +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:45 +msgid "Create a new web app with webby" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:53 +msgid "Application name" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:56 +msgid "http://myapp.domain" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:66 +msgid "theme icon name" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:68 +msgid "or" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:69 +msgid "Set from file..." +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:85 +msgid "Save cookies" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:87 +msgid "Save login information" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:110 +msgid "Save app" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:132 +msgid "url must start with http:// or https://" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:145 +msgid "App already exist" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:198 +msgid "Images" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:210 +msgid "Cancel" +msgstr "" + +#: /home/artem/Launchpad/webby-browser/po/../src/Assistant.vala:211 +msgid "Open" +msgstr "" diff --git a/schemas/CMakeLists.txt b/schemas/CMakeLists.txt new file mode 100644 index 0000000..19ef923 --- /dev/null +++ b/schemas/CMakeLists.txt @@ -0,0 +1,5 @@ +# +# GSettings Schema +# +include(GSettings) +add_schema(org.pantheon.Webby.gschema.xml) diff --git a/schemas/org.pantheon.Webby.gschema.xml b/schemas/org.pantheon.Webby.gschema.xml new file mode 100644 index 0000000..3557bc9 --- /dev/null +++ b/schemas/org.pantheon.Webby.gschema.xml @@ -0,0 +1,24 @@ + + + + + + + + + 800 + The saved width of the window. + The saved width of the window. + + + 650 + The saved height of the window. + The saved height of the window. + + + "Normal" + The saved state of the window. + The saved state of the window. + + + diff --git a/src/AppWindow.vala b/src/AppWindow.vala new file mode 100644 index 0000000..97e59ec --- /dev/null +++ b/src/AppWindow.vala @@ -0,0 +1,200 @@ +public class AppWindow : Granite.Application { + + private Settings settings; + + public Gtk.Window mainwindow; + + private Gtk.Stack stack; + private Gtk.HeaderBar headerbar; + private Gtk.Button back_button; + private Gtk.Button add_button; + + private WebbyAssistant assistant; + private ApplicationsView apps_view; + + construct { + program_name = "Webby"; + exec_name = "webby"; + + app_years = "2015"; + app_icon = "webby"; + app_launcher = "webby.desktop"; + application_id = "net.launchpad.webby-browser"; + + main_url = "https://code.launchpad.net/webby-browser"; + bug_url = "https://bugs.launchpad.net/webby-browser"; + help_url = "https://code.launchpad.net/webby-browser"; + translate_url = "https://translations.launchpad.net/webby-browser"; + + about_authors = {"Erasmo Marín ", + "Artem Anufrij "}; + about_documenters = {"Erasmo Marín", + "Artem Anufrij "}; + about_artists = {"Erasmo Marín ", + "Artem Anufrij "}; + about_comments = "Development release, not all features implemented"; + about_translators = ""; + about_license_type = Gtk.License.GPL_3_0; + } + + public static AppWindow _instance = null; + + public static AppWindow instance { + get { + if (_instance == null) + _instance = new AppWindow (); + return _instance; + } + } + + protected override void activate () { + + if (mainwindow != null) { + mainwindow.present (); // present window if app is already running + return; + } + + settings = Settings.get_default (); + + mainwindow = new Gtk.Window (); + + mainwindow.set_default_size (700, 500); + mainwindow.set_wmclass ("Webby", "Webby"); + + //headerbar + headerbar = new Gtk.HeaderBar (); + headerbar.show_close_button = true; + headerbar.title = "Webby"; + mainwindow.set_titlebar (headerbar); + + back_button = new Gtk.Button.with_label (_("Applications")); + back_button.get_style_context ().add_class ("back-button"); + headerbar.pack_start (back_button); + + add_button = new Gtk.Button (); + add_button.image = new Gtk.Image.from_icon_name ("add", Gtk.IconSize.LARGE_TOOLBAR); + add_button.tooltip_text = _("Add a new Web App"); + headerbar.pack_start (add_button); + + var welcome = new Granite.Widgets.Welcome (_("No Web Apps Availible"), _("Create a new Webby Web App.")); + welcome.append ("add", _("Create App"), _("Create a new Webby web app.")); + welcome.activated.connect ((index) => { + switch (index) { + case 0: + show_assistant (); + break; + } + }); + + apps_view = new ApplicationsView(); + assistant = new WebbyAssistant(); + stack = new Gtk.Stack (); + stack.set_transition_duration (500); + + stack.add_named (welcome, "welcome"); + stack.add_named (apps_view, "apps_view"); + stack.add_named (assistant, "assistant"); + + mainwindow.add (stack); + + apps_view.add_request.connect (() => { + show_assistant (); + }); + + apps_view.edit_request.connect ((desktop_file) => { + show_assistant (desktop_file); + }); + + apps_view.app_deleted.connect (() => { + if (!apps_view.has_items) { + show_welcome_view (Gtk.StackTransitionType.NONE); + } + }); + + assistant.application_created.connect ((new_file) => { + apps_view.add_button (new_file); + apps_view.select_last_item (); + show_apps_view (); + }); + + assistant.application_edited.connect ((edited_file) => { + apps_view.update_button (edited_file); + show_apps_view (); + }); + + back_button.clicked.connect (() => { + if (apps_view.has_items) + show_apps_view (); + else + show_welcome_view (); + }); + + add_button.clicked.connect (() => { + show_assistant (); + }); + + mainwindow.delete_event.connect (() => { + this.store_settings (); + return false; + }); + + mainwindow.destroy.connect (Gtk.main_quit); + + this.restore_settings (); + mainwindow.show_all (); + + if (apps_view.has_items) + show_apps_view (Gtk.StackTransitionType.NONE); + else + show_welcome_view (Gtk.StackTransitionType.NONE); + + Gtk.main (); + } + + private void show_assistant (DesktopFile? desktop_file = null) { + stack.set_transition_type (Gtk.StackTransitionType.SLIDE_LEFT); + stack.set_visible_child_name("assistant"); + back_button.show_all (); + add_button.hide (); + //fix ugly border at the bottom of headerbar + mainwindow.queue_draw (); + + if (desktop_file != null) + assistant.edit_desktop_file (desktop_file); + } + + private void show_apps_view (Gtk.StackTransitionType slide = Gtk.StackTransitionType.SLIDE_RIGHT) { + stack.set_transition_type (slide); + stack.set_visible_child_name ("apps_view"); + back_button.hide (); + add_button.show_all (); + assistant.reset_fields (); + //fix ugly border at the bottom of headerbar + mainwindow.queue_draw (); + } + + private void show_welcome_view (Gtk.StackTransitionType slide = Gtk.StackTransitionType.SLIDE_RIGHT) { + stack.set_transition_type (slide); + stack.set_visible_child_name ("welcome"); + back_button.hide (); + add_button.hide (); + assistant.reset_fields (); + //fix ugly border at the bottom of headerbar + mainwindow.queue_draw (); + } + + private void restore_settings () { + this.mainwindow.set_default_size (settings.window_width, settings.window_height); + + if (settings.window_state == Settings.WindowState.MAXIMIZED) + this.mainwindow.maximize (); + } + + private void store_settings () { + settings.window_state = (this.mainwindow.is_maximized ? Settings.WindowState.MAXIMIZED: Settings.WindowState.NORMAL); + if (settings.window_state == Settings.WindowState.NORMAL) { + settings.window_height = this.mainwindow.get_allocated_height (); + settings.window_width = this.mainwindow.get_allocated_width (); + } + } +} diff --git a/src/Assistant.vala b/src/Assistant.vala new file mode 100644 index 0000000..f1c2a81 --- /dev/null +++ b/src/Assistant.vala @@ -0,0 +1,299 @@ +public class WebbyAssistant : Gtk.Box { + + public enum assistant_mode { new_app, edit_app } + + public signal void application_created (GLib.DesktopAppInfo? new_file); + public signal void application_edited (GLib.DesktopAppInfo? new_file); + + private Gtk.Label message; + private Gtk.Button icon_button; + private Gtk.Entry app_name_entry; + private Gtk.Entry app_url_entry; + private Gtk.Entry icon_name_entry; + private Gtk.ComboBox app_category_combo; + private Gtk.CheckButton save_cookies_check; + private Gtk.CheckButton save_password_check; + private Gtk.Popover icon_selector_popover; + private Gtk.FileChooserDialog file_chooser; + private Gtk.Button accept_button; + private GLib.Regex protocol_regex; + private Gee.HashMap apps; + + private string default_app_icon = "application-default-icon"; + + private bool app_name_valid = false; + private bool app_url_valid = false; + private bool app_icon_valid = true; + + private assistant_mode mode { get; set; default = assistant_mode.new_app; } + + public WebbyAssistant () { + + GLib.Object (orientation: Gtk.Orientation.VERTICAL); + apps = DesktopFile.get_applications (); + + this.margin = 15; + + try { + //http(s)://(words or numbers)(port and numbers) + this.protocol_regex = new Regex ("""https?\:\/\/[\w+\d+]((\:\d+)?\/\S*)?"""); + } catch (RegexError e) { + critical ("%s", e.message); + } + + //welcome message + message = new Gtk.Label (_("Create a new web app with webby")); + + //app information + icon_button = new Gtk.Button (); + icon_button.set_image (new Gtk.Image.from_icon_name (default_app_icon, Gtk.IconSize.DIALOG) ); + icon_button.halign = Gtk.Align.END; + + app_name_entry = new Gtk.Entry (); + app_name_entry.set_placeholder_text (_("Application name")); + + app_url_entry = new Gtk.Entry (); + app_url_entry.set_placeholder_text (_("http://myapp.domain")); + + //icon selector popover + icon_selector_popover = new Gtk.Popover (icon_button); + icon_selector_popover.modal = true; + icon_selector_popover.position = Gtk.PositionType.BOTTOM; + + var popover_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 5); + + icon_name_entry = new Gtk.Entry (); + icon_name_entry.set_placeholder_text (_("theme icon name")); + + var or_label = new Gtk.Label (_("or")); + var icon_chooser_button = new Gtk.Button.with_label(_("Set from file...")); + icon_chooser_button.get_style_context ().add_class ("suggested-action"); + + popover_box.margin = 10; + popover_box.pack_start (icon_name_entry, true, false, 0); + popover_box.pack_start (or_label, true, false, 0); + popover_box.pack_end (icon_chooser_button, true, false, 0); + + icon_chooser_button.grab_focus (); + + icon_selector_popover.add (popover_box); + + //TODO: categories + //combobox + + //checkbuttons + save_cookies_check = new Gtk.CheckButton.with_label (_("Save cookies")); + save_cookies_check.active = true; + save_password_check = new Gtk.CheckButton.with_label (_("Save login information")); + save_password_check.active = false; + + //app information section + var app_input_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 5); + app_input_box.halign = Gtk.Align.START; + app_input_box.pack_start (app_name_entry, false, false, 0); + app_input_box.pack_start (app_url_entry, false, false, 0); + //app_input_box.pack_start (app_category_combo, true, false, 0); + + var app_info_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 5); + app_info_box.pack_start (icon_button, false, false, 3); + app_info_box.pack_start (app_input_box, false, false, 3); + app_info_box.halign = Gtk.Align.CENTER; + + //app options + var app_options_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 5); + app_options_box.pack_start (save_cookies_check, true, false, 0); + app_options_box.pack_start (save_password_check, true, false, 0); + app_options_box.halign = Gtk.Align.CENTER; + + + //create button + accept_button = new Gtk.Button.with_label(_("Save app")); + accept_button.halign = Gtk.Align.END; + accept_button.get_style_context ().add_class ("suggested-action"); + accept_button.set_sensitive (false); + accept_button.activate.connect (on_accept); + accept_button.clicked.connect (on_accept); + + //all sections together + pack_start (message, true, false, 0); + pack_start (app_info_box, true, false, 0); + pack_start (app_options_box, true, false, 0); + pack_end (accept_button, false, false, 0); + + //signals and handlers + icon_button.clicked.connect(() => { + icon_selector_popover.show_all(); + }); + + app_url_entry.changed.connect (()=>{ + if (!this.protocol_regex.match (app_url_entry.get_text())) { + app_url_entry.get_style_context ().add_class ("error"); + app_url_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "dialog-information"); + app_url_entry.set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, _("url must start with http:// or https://")); + app_url_valid = false; + } else { + app_url_entry.get_style_context ().remove_class ("error"); + app_url_valid = true; + } + validate (); + }); + + app_name_entry.changed.connect (()=>{ + if (mode == assistant_mode.new_app && DesktopFile.get_applications().has_key (app_name_entry.get_text()) ) { + app_name_entry.get_style_context ().add_class ("error"); + app_name_entry.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "dialog-information"); + app_name_entry.set_icon_tooltip_text (Gtk.EntryIconPosition.SECONDARY, _("App already exist")); + app_name_valid = false; + } else { + app_name_entry.get_style_context ().remove_class ("error"); + app_name_valid = true; + } + validate (); + }); + + icon_chooser_button.activate.connect (on_icon_chooser_activate); + icon_chooser_button.clicked.connect (on_icon_chooser_activate); + + icon_name_entry.changed.connect (update_app_icon); + } + + + private void update_app_icon () { + string icon = icon_name_entry.get_text (); + + if (icon == "") { + app_icon_valid = true; + validate (); + return; + } + + //if is a file uri + if (icon.contains("/")) { + Gdk.Pixbuf pix = null; + try { + pix = new Gdk.Pixbuf.from_file_at_size (icon, 48, 48); + app_icon_valid = true; + } catch (GLib.Error error) { + app_icon_valid = false; + try { + Gtk.IconTheme icon_theme = Gtk.IconTheme.get_default (); + pix = icon_theme.load_icon ("image-missing", 48, Gtk.IconLookupFlags.FORCE_SIZE); + } catch (GLib.Error err) { + warning ("Getting selection-checked icon from theme failed"); + } + } finally { + if (pix != null) + icon_button.set_image (new Gtk.Image.from_pixbuf (pix)); + } + } else { + icon_button.set_image (new Gtk.Image.from_icon_name (icon, Gtk.IconSize.DIALOG) ); + } + + validate (); + } + + private void on_icon_chooser_activate () { + var filter = new Gtk.FileFilter (); + + filter.set_filter_name (_("Images")); + filter.add_pattern ("*.png"); + filter.add_pattern ("*.svg"); + filter.add_pattern ("*.jpg"); + filter.add_pattern ("*.jpeg"); + filter.add_pattern ("*.PNG"); + filter.add_pattern ("*.SVG"); + filter.add_pattern ("*.JPG"); + filter.add_pattern ("*.JPEG"); + + file_chooser = new Gtk.FileChooserDialog ("", null, + Gtk.FileChooserAction.OPEN, + _("Cancel"), Gtk.ResponseType.CANCEL, + _("Open"), Gtk.ResponseType.ACCEPT); + file_chooser.set_select_multiple(false); + file_chooser.add_filter (filter); + + var preview = new Gtk.Image(); + preview.valign = Gtk.Align.START; + + file_chooser.update_preview.connect ( ()=> { + + string filename = file_chooser.get_preview_filename(); + Gdk.Pixbuf pix = null; + + if (filename != null) { + try { + pix = new Gdk.Pixbuf.from_file_at_size (filename, 128, 128); + } catch (GLib.Error error) { + warning ("There was a problem loading preview."); + } + } + + if (pix!=null){ + preview.set_from_pixbuf (pix); + file_chooser.set_preview_widget_active (true); + file_chooser.set_preview_widget (preview); + } else { + file_chooser.set_preview_widget (null); + } + }); + + if (file_chooser.run () == Gtk.ResponseType.ACCEPT) { + + icon_name_entry.set_text(file_chooser.get_filename ()); + file_chooser.destroy (); + } + file_chooser.destroy (); + } + + + private void validate () { + if (app_icon_valid && app_name_valid && app_url_valid) { + accept_button.set_sensitive (true); + return; + } + accept_button.set_sensitive (false); + } + + + public void reset_fields () { + icon_name_entry.set_text (""); + app_name_entry.set_text (""); + app_name_entry.set_sensitive (true); + app_url_entry.set_text (""); + app_name_entry.get_style_context ().remove_class ("error"); + app_url_entry.get_style_context ().remove_class ("error"); + icon_button.set_image (new Gtk.Image.from_icon_name (default_app_icon, Gtk.IconSize.DIALOG) ); + mode = assistant_mode.new_app; + } + + private void on_accept () { + + string icon = icon_name_entry.get_text (); + string name = app_name_entry.get_text (); + string url = app_url_entry.get_text (); + + if (icon == "") + icon = default_app_icon; + + if (app_icon_valid && app_name_valid && app_url_valid) { + var desktop_file = new DesktopFile (name, url, icon); + switch (mode) { + case assistant_mode.new_app: + application_created (desktop_file.save_to_file ()); + break; + case assistant_mode.edit_app: + application_edited (desktop_file.save_to_file ()); + break; + } + } + } + + public void edit_desktop_file (DesktopFile desktop_file) { + mode = assistant_mode.edit_app; + app_name_entry.text = desktop_file.name; + app_name_entry.set_sensitive (false); + app_url_entry.text = desktop_file.url; + icon_name_entry.text = desktop_file.icon; + update_app_icon (); + } +} diff --git a/src/DesktopFile.vala b/src/DesktopFile.vala new file mode 100644 index 0000000..72d3525 --- /dev/null +++ b/src/DesktopFile.vala @@ -0,0 +1,121 @@ +public class DesktopFile : GLib.Object { + + private string template = """ + [Desktop Entry] + Version=1.0 + Name=Webby + GenericName=Web app + Comment=Webby web app + Exec=webby + Keywords=webby;webapp;internet; + Icon=application-default-icon + Terminal=false + Type=Application + Categories=Network; + X-GNOME-FullName=Webby + StartupWMClass=Webby + WebbyThemeColor=none"""; + + + private GLib.KeyFile file; + + public string name { get; private set; } + public string url { get; private set; } + public string icon { get; private set; } + + public DesktopFile (string name, string url, string icon) { + this.name = name; + this.url = url; + this.icon = icon; + + file = new GLib.KeyFile(); + file.load_from_data (template, -1, GLib.KeyFileFlags.NONE); + //TODO: Category + file.set_string ("Desktop Entry", "Name", name); + file.set_string ("Desktop Entry", "GenericName", name); + file.set_string ("Desktop Entry", "X-GNOME-FullName", name); + file.set_string ("Desktop Entry", "Exec", "webby " + url); + file.set_string ("Desktop Entry", "Icon", icon); + file.set_string ("Desktop Entry", "StartupWMClass", url); + } + + public DesktopFile.from_desktopappinfo(GLib.DesktopAppInfo info) { + file = new GLib.KeyFile(); + file.load_from_file (info.filename, KeyFileFlags.NONE); + this.name = info.get_display_name (); + this.icon = info.get_icon ().to_string (); + this.url = file.get_string ("Desktop Entry", "Exec").substring (6); + } + + public bool edit_propertie (string propertie, string val) { + string filename = GLib.Environment.get_user_data_dir () + "/applications/" +file.get_string("Desktop Entry", "Name") + "-webby.desktop"; + file = new GLib.KeyFile(); + file.load_from_file (filename, KeyFileFlags.NONE); + file.set_string ("Desktop Entry", propertie, val); + return file.save_to_file (filename); + } + + public GLib.DesktopAppInfo save_to_file () { + string filename = GLib.Environment.get_user_data_dir () + "/applications/" +file.get_string("Desktop Entry", "Name") + "-webby.desktop"; + print("Desktop file created: " + filename); + file.save_to_file (filename); + return new GLib.DesktopAppInfo.from_filename (filename); + } + + public bool delete_file () { + string filename = GLib.Environment.get_user_data_dir () + "/applications/" +file.get_string("Desktop Entry", "Name") + "-webby.desktop"; + File file = File.new_for_path (filename); + try { + file.delete (); + } catch (Error e) { + print(e.message + "\n"); + return false; + } + return true; + } + + public static Gee.HashMap get_webby_applications () { + + var list = new Gee.HashMap(); + + foreach (GLib.AppInfo app in GLib.AppInfo.get_all()) { + + var desktop_app = new GLib.DesktopAppInfo(app.get_id ()); + + //FIXME: This is not working, vala problem? + //var keywords = desktop_app.get_keywords (); + + string keywords = desktop_app.get_string ("Keywords"); + + if (keywords != null && keywords.contains ("webby")) { + list.set(desktop_app.get_name(), desktop_app); + } + } + return list; + } + + public static GLib.DesktopAppInfo? get_app_by_url (string url) { + foreach (GLib.AppInfo app in GLib.AppInfo.get_all()) { + + var desktop_app = new GLib.DesktopAppInfo(app.get_id ()); + + var exec = desktop_app.get_string ("Exec"); + + if (exec != null && exec.contains (url)) { + return desktop_app; + } + } + return null; + } + + public static Gee.HashMap get_applications() { + + var list = new Gee.HashMap(); + + foreach (GLib.AppInfo app in GLib.AppInfo.get_all()) { + list.set(app.get_name(), app); + } + + return list; + } +} diff --git a/src/InfoDialog.vala b/src/InfoDialog.vala new file mode 100644 index 0000000..905d52d --- /dev/null +++ b/src/InfoDialog.vala @@ -0,0 +1,18 @@ +public class InfoDialog : Gtk.Dialog { + + public InfoDialog (string title, string label, string icon_name) { + + this.title = title; + set_default_size (350, 100); + + var box = new Gtk.Box(Gtk.Orientation.HORIZONTAL, 5); + box.pack_start (new Gtk.Image.from_icon_name(icon_name, Gtk.IconSize.DIALOG), false, false, 0); + box.pack_start (new Gtk.Label (label), true, false, 0); + box.margin = 15; + + Gtk.Box content = get_content_area () as Gtk.Box; + content.pack_start (box, true, true, 0); + + add_button (_("Accept"), Gtk.ResponseType.ACCEPT); + } +} diff --git a/src/Launcher.vala b/src/Launcher.vala new file mode 100644 index 0000000..e69de29 diff --git a/src/Settings.vala b/src/Settings.vala new file mode 100644 index 0000000..c1a4874 --- /dev/null +++ b/src/Settings.vala @@ -0,0 +1,23 @@ +public class Settings : Granite.Services.Settings { + + private static Settings settings; + public static Settings get_default () { + if (settings == null) + settings = new Settings (); + + return settings; + } + public int window_width { get; set; } + public int window_height { get; set; } + public WindowState window_state { get; set; } + + private Settings () { + base ("org.pantheon.webby.SavedState"); + } + + public enum WindowState { + NORMAL, + MAXIMIZED, + FULLSCREEN + } +} diff --git a/src/UrlEntry.vala b/src/UrlEntry.vala new file mode 100644 index 0000000..f60e59c --- /dev/null +++ b/src/UrlEntry.vala @@ -0,0 +1,15 @@ +public class UrlEntry : Gtk.Entry { + + + public UrlEntry () { + editable = false; + set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "view-refresh-symbolic"); + set_icon_from_icon_name (Gtk.EntryIconPosition.PRIMARY, "text-html-symbolic"); + } + + public override void get_preferred_width (out int minimum_width, out int natural_width) { + minimum_width = -1; + natural_width = 3000; + } + +} diff --git a/src/WebApp.vala b/src/WebApp.vala new file mode 100644 index 0000000..7a7bb62 --- /dev/null +++ b/src/WebApp.vala @@ -0,0 +1,152 @@ +public class WebApp : Gtk.Stack { + + public WebKit.WebView app_view; + public WebKit.WebView external_view; + public string ui_color = "none"; + private string app_url; + private GLib.DesktopAppInfo info; + private DesktopFile file; + private WebKit.CookieManager cookie_manager; + private Gtk.Box container; //the spinner container + + public signal void external_request (); + public signal void theme_color_changed(string color); + + public WebApp (string webapp_name, string app_url) { + + this.app_url = app_url; + set_transition_duration (1000); + + //configure cookies settings + cookie_manager = WebKit.WebContext.get_default ().get_cookie_manager (); + cookie_manager.set_accept_policy (WebKit.CookieAcceptPolicy.ALWAYS); + + string cookie_db = Environment.get_user_cache_dir () + "/webby/cookies/"; + + var dir = GLib.File.new_for_path (cookie_db); + + if (!dir.query_exists (null)) { + try { + dir.make_directory_with_parents (null); + GLib.debug ("Directory '%s' created", dir.get_path ()); + } catch (Error e) { + GLib.error ("Could not create caching directory."); + } + } + + cookie_manager.set_persistent_storage (cookie_db + "cookies.db", WebKit.CookiePersistentStorage.SQLITE); + + //load app viewer + app_view = new WebKit.WebView.with_context (WebKit.WebContext.get_default ()); + app_view.load_uri (app_url); + + //create external viewer + this.external_view = new WebKit.WebView (); + + //loading view + var spinner = new Gtk.Spinner(); + spinner.active = true; + spinner.halign = Gtk.Align.CENTER; + spinner.valign = Gtk.Align.CENTER; + spinner.set_size_request (24, 24); + container = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); + container.halign = Gtk.Align.FILL; + container.valign = Gtk.Align.FILL; + container.pack_start(spinner, true, true, 0); + + //overlay trick to make snapshot work even with the spinner + var overlay = new Gtk.Overlay (); + overlay.add(app_view); + overlay.add_overlay(container); + + add_titled(overlay, "app", "app"); + add_titled(external_view, "external", "external"); + set_visible_child_name ("app"); + + app_view.create.connect ( () => { + print("external request"); + external_request (); + return external_view; + }); + external_view.create.connect ( () => { + print("external request"); + set_visible_child_name ("external"); + return external_view; + }); + + info = DesktopFile.get_app_by_url(app_url); + file = new DesktopFile.from_desktopappinfo(info); + //load theme color saved in desktop file + if (info != null && info.has_key("WebbyThemeColor")) { + var color = info.get_string("WebbyThemeColor"); + print("COLOR: " + color+"\n"); + if(color != "none") { + ui_color = color; + } + } + + + Gdk.RGBA background = {}; + if (!background.parse (ui_color)){ + background = {1,1,1,1}; + } + container.override_background_color (Gtk.StateFlags.NORMAL, background); + + //update theme color if changed + app_view.load_changed.connect ( (load_event) => { + if (load_event == WebKit.LoadEvent.FINISHED) { + print("determine color"); + determine_theme_color.begin(); + } else { + container.set_visible(true); + } + }); + } + + public DesktopFile get_desktop_file () { + return this.file; + } + + /**Taken from WebView.vala in lp:midori + * Check for the theme-color meta tag in the page and if that one can't be + * found grabs the color from the current page and uses the first 3 rows + * of pixels to get a good representative color of the page + */ + public async void determine_theme_color () { + + //FIXME: This is useless without JSCore + /*string script = "var t = document.getElementsByTagName('meta').filter(function(e){return e.name == 'theme-color';)[0]; t ? t.value : null;"; + app_view.run_javascript.begin (script, null, (obj, res)=> { + + });*/ + + var snap = (Cairo.ImageSurface) yield app_view.get_snapshot (WebKit.SnapshotRegion.VISIBLE, + WebKit.SnapshotOptions.NONE, null); + + // data ist in BGRA apparently (according to testing). Docs said ARGB, but that + // appears not to be the case + unowned uint8[] data = snap.get_data (); + uint8 r = data[2]; + uint8 g = data[1]; + uint8 b = data[0]; + + for (var i = 4; i < snap.get_width () * 3 * 4; i += 4) { + r = (r + data[i + 2]) / 2; + g = (g + data[i + 1]) / 2; + b = (b + data[i + 0]) / 2; + } + + var color = "#%02x%02x%02x".printf (r, g, b); + + if (color != ui_color) { + ui_color = color; + Gdk.RGBA background = {}; + background.parse (ui_color); + container.override_background_color (Gtk.StateFlags.NORMAL, background); + theme_color_changed(ui_color); + if (file != null) + file.edit_propertie ("WebbyThemeColor", ui_color); + } + container.set_visible(false); + } +} diff --git a/src/WebAppWindow.vala b/src/WebAppWindow.vala new file mode 100644 index 0000000..5538c6a --- /dev/null +++ b/src/WebAppWindow.vala @@ -0,0 +1,142 @@ +public class WebAppWindow : Gtk.ApplicationWindow { + + private bool is_full_screen = false; + + private string style_str = """@define-color titlebar_color @titlebar_color;"""; + + //widgets + private WebApp web_app; + private WebBar headerbar; + + public WebAppWindow (string webapp_name, string webapp_uri) { + + set_wmclass(webapp_uri, webapp_uri); + web_app = new WebApp(webapp_name, webapp_uri); + + headerbar = new WebBar(web_app.external_view); + headerbar.show_close_button = true; + headerbar.title = webapp_name; + headerbar.set_title_mode (WebBar.title_mode.TITLE); + + //style + if (web_app.ui_color != "none") { + try { + print("set color"); + var style_cp = style_str.replace ("@titlebar_color", web_app.ui_color); + var style_provider = new Gtk.CssProvider (); + style_provider.load_from_data (style_cp, -1); + headerbar.get_style_context ().add_provider (style_provider, -1); + Gtk.Settings.get_default ().set ("gtk-application-prefer-dark-theme", should_use_dark_theme (web_app.ui_color)); + } catch (GLib.Error err) { + warning("Loading style failed"); + } + } + + web_app.theme_color_changed.connect( (color)=> { + try { + print("set color"); + var style_cp = style_str.replace ("@titlebar_color", color); + var style_provider = new Gtk.CssProvider (); + style_provider.load_from_data (style_cp, -1); + headerbar.get_style_context ().add_provider (style_provider, -1); + Gtk.Settings.get_default ().set ("gtk-application-prefer-dark-theme", should_use_dark_theme (color)); + } catch (GLib.Error err) { + warning("Loading style failed"); + } + }); + + this.set_titlebar (headerbar); + + var info = DesktopFile.get_app_by_url(webapp_uri); + var width = info.get_string("WebbyWindowWidth"); + var height = info.get_string("WebbyWindowHeight"); + + if(width !=null && height != null) + set_default_size (int.parse(width), int.parse(height)); + else + set_default_size (1000, 600); + this.delete_event.connect (() => { + update_window_state(this.get_allocated_width (), this.get_allocated_height () ); + return false; + }); + + this.destroy.connect(Gtk.main_quit); + + web_app.external_request.connect ( () => { + print("Web app external request\n"); + web_app.set_transition_type (Gtk.StackTransitionType.SLIDE_LEFT); + headerbar.set_title_mode (WebBar.title_mode.BROWSER); + web_app.set_visible_child_name ("external"); + }); + + headerbar.back_event.connect ( () => { + print ("back"); + headerbar.set_title_mode (WebBar.title_mode.TITLE); + web_app.set_transition_type (Gtk.StackTransitionType.SLIDE_RIGHT); + web_app.set_visible_child_name ("app"); + //wait the animation to end before "cleaning" the web view + GLib.Timeout.add(web_app.get_transition_duration(), () => { + web_app.external_view.load_uri ("about:blank"); + return false; + }); + }); + + add(web_app); + show_all(); + } + + public new void fullscreen () { + is_full_screen = true; + base.fullscreen(); + } + + public new void unfullscreen () { + is_full_screen = false; + base.unfullscreen(); + } + + public void toggle_fullscreen() { + if(is_full_screen) + unfullscreen(); + else + fullscreen(); + is_full_screen = !is_full_screen; + } + + public void update_window_state (int width, int height) { + var file = web_app.get_desktop_file(); + file.edit_propertie ("WebbyWindowWidth", width.to_string()); + file.edit_propertie ("WebbyWindowHeight", height.to_string()); + } + + public override bool key_press_event (Gdk.EventKey event) { + bool handled = true; + switch (event.keyval) { + case Gdk.Key.Escape: + unfullscreen(); + break; + case Gdk.Key.F11: + toggle_fullscreen(); + break; + default: + handled = false; + break; + } + + if (handled) + return true; + + return (base.key_press_event != null) ? base.key_press_event (event) : true; + } + + private bool should_use_dark_theme (string theme_color) { + Gdk.RGBA color = {}; + color.parse (theme_color); + + double prom = (color.red + color.blue + color.green)/3; + + if (prom < 0.5) + return true; + return false; + } +} diff --git a/src/WebBar.vala b/src/WebBar.vala new file mode 100644 index 0000000..7de58a2 --- /dev/null +++ b/src/WebBar.vala @@ -0,0 +1,72 @@ +public class WebBar : Gtk.HeaderBar { + + + public enum title_mode { + TITLE, + BROWSER; + } + + UrlEntry url_entry; + Gtk.Button share_button; + Gtk.Button back_button; + WebKit.WebView webview; + + public signal void back_event(); + + public WebBar (WebKit.WebView webview) { + + + this.get_style_context ().remove_class ("header-bar"); + this.webview = webview; + + url_entry = new UrlEntry(); + url_entry.show_all(); + + share_button = new Gtk.Button.from_icon_name ("application-menu-symbolic", Gtk.IconSize.SMALL_TOOLBAR); + share_button.margin_left = 15; + share_button.show_all (); + + back_button = new Gtk.Button.from_icon_name ("go-next-symbolic-rtl", Gtk.IconSize.SMALL_TOOLBAR); + back_button.margin_right = 15; + back_button.show_all (); + + pack_start (back_button); + pack_start (url_entry); + pack_end (share_button); + + custom_title = new Gtk.Label(null); + connect_signals (); + show(); + } + + + private void connect_signals () { + webview.load_changed.connect ( (event) => { + if (event == WebKit.LoadEvent.STARTED) + url_entry.set_text (webview.uri); + }); + + back_button.clicked.connect( () => { back_event(); }); + back_button.activate.connect( () => { back_event(); }); + + } + + public void set_title_mode (title_mode mode) { + + if (mode == title_mode.TITLE) { + custom_title = null; + remove (share_button); + remove (back_button); + remove (url_entry); + this.get_style_context ().remove_class ("header-bar"); + } else { + pack_start (back_button); + pack_start (url_entry); + pack_end (share_button); + custom_title = new Gtk.Label(null); + this.get_style_context ().add_class ("header-bar"); + } + } + + +} diff --git a/src/Webby.vala b/src/Webby.vala new file mode 100644 index 0000000..1cb3975 --- /dev/null +++ b/src/Webby.vala @@ -0,0 +1,15 @@ +static int main (string[] args) { + + Gtk.init (ref args); + + if (args.length < 2 || args[1] == "--about" || args[1] == "-d") { + return AppWindow.instance.run (args); + } else { + var app_info = DesktopFile.get_app_by_url (args[1]); + var app = new WebAppWindow(app_info.get_display_name (), args[1]); + app.show_all (); + } + + Gtk.main (); + return 0; +} diff --git a/src/Widgets/ApplicationIcon.vala b/src/Widgets/ApplicationIcon.vala new file mode 100644 index 0000000..c29ab2a --- /dev/null +++ b/src/Widgets/ApplicationIcon.vala @@ -0,0 +1,129 @@ +public class ApplicationIcon : Gtk.Overlay { + + Gtk.Image image; + Gtk.Label label; + Gtk.MenuButton conf_btn; + Gtk.Box box; + Gtk.ActionGroup action_group; + + internal DesktopFile desktop_file { get; private set; } + + public signal void deleted (Gtk.Container? parent); + public signal void edit_request (DesktopFile desktop_file); + + public ApplicationIcon (GLib.DesktopAppInfo app) { + this.desktop_file = new DesktopFile.from_desktopappinfo (app); + + hexpand = false; + vexpand = false; + + label = new Gtk.Label (this.desktop_file.name); + + set_icon (this.desktop_file.icon); + + this.margin = 6; + this.margin_start = 20; + this.margin_end = 20; + + var menu = new ActionMenu (); + menu.halign = Gtk.Align.CENTER; + menu.delete_clicked.connect (() => { remove_application (); }); + menu.edit_clicked.connect (() => { edit_request (desktop_file); }); + + box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); + box.pack_start (image, false, false, 0); + box.pack_start (label, false, false, 0); + box.pack_start (menu, false, false, 0); + + box.hexpand = false; + box.vexpand = false; + + var event_box = new Gtk.EventBox (); + event_box.add (box); + event_box.events |= Gdk.EventMask.ENTER_NOTIFY_MASK|Gdk.EventMask.LEAVE_NOTIFY_MASK; + + event_box.enter_notify_event.connect ((event) => { + menu.set_reveal_child (true); + return false; + }); + + event_box.leave_notify_event.connect ((event) => { + if (event.detail == Gdk.NotifyType.INFERIOR) + return false; + menu.set_reveal_child (false); + return false; + }); + + this.add (event_box); + } + + public void set_new_desktopfile (DesktopFile desktop_file) { + this.desktop_file = desktop_file; + set_icon (this.desktop_file.icon); + } + + private void set_icon (string icon) { + if (File.new_for_path (icon).query_exists ()) { + var pix = new Gdk.Pixbuf.from_file (icon); + + int new_height = 64; + int new_width = 64; + int margin_vertical = 0; + int margin_horizontal = 0; + + if (pix.height > pix.width) { + new_width = new_width * pix.width / pix.height; + margin_horizontal = (new_height - new_width) / 2; + } else if (pix.height < pix.width) { + new_height = new_height * pix.height / pix.width; + margin_vertical = (new_width - new_height) / 2; + } + if (image == null) + image = new Gtk.Image.from_pixbuf (pix.scale_simple (new_width, new_height, Gdk.InterpType.BILINEAR)); + else + image.set_from_pixbuf (pix.scale_simple (new_width, new_height, Gdk.InterpType.BILINEAR)); + + image.margin_top = margin_vertical; + image.margin_bottom = margin_vertical; + image.margin_right = margin_horizontal; + image.margin_left = margin_horizontal; + } else { + image = new Gtk.Image (); + image.icon_name = icon; + image.pixel_size = 64; + } + } + + private void remove_application () { + desktop_file.delete_file (); + deleted (this.get_parent()); + this.destroy (); + } +} + +public class ActionMenu : Gtk.Revealer { + + public signal void delete_clicked (); + public signal void edit_clicked (); + + public ActionMenu () { + var delete_button = new Gtk.Button.from_icon_name ("edit-delete-symbolic", Gtk.IconSize.BUTTON); + delete_button.tooltip_text = _("Delete Webapp"); + delete_button.relief = Gtk.ReliefStyle.NONE; + delete_button.clicked.connect (() => { delete_clicked (); }); + + var edit_button = new Gtk.Button.from_icon_name ("edit-symbolic", Gtk.IconSize.BUTTON); + edit_button.tooltip_text = _("Edit Webapp Properties"); + edit_button.relief = Gtk.ReliefStyle.NONE; + edit_button.clicked.connect (() => { edit_clicked (); }); + + var buttons = new Gtk.Grid (); + buttons.orientation = Gtk.Orientation.HORIZONTAL; + buttons.add (edit_button); + buttons.add (delete_button); + buttons.opacity = 0.5; + + this.transition_type = Gtk.RevealerTransitionType.CROSSFADE; + this.add (buttons); + } +} diff --git a/src/Widgets/ApplicationsView.vala b/src/Widgets/ApplicationsView.vala new file mode 100644 index 0000000..c28246a --- /dev/null +++ b/src/Widgets/ApplicationsView.vala @@ -0,0 +1,86 @@ +public class ApplicationsView : Gtk.Box { + + public signal void add_request(); + public signal void edit_request(DesktopFile desktop_file); + public signal void app_deleted (); + + private Gtk.FlowBox icon_view; + private Gee.HashMap applications; + + public bool has_items { get { return icon_view.get_children ().length () > 0; } } + + public ApplicationsView () { + + GLib.Object (orientation: Gtk.Orientation.VERTICAL); + var scrolled = new Gtk.ScrolledWindow (null, null); + scrolled.hscrollbar_policy = Gtk.PolicyType.NEVER; + + icon_view = new Gtk.FlowBox(); + icon_view.valign = Gtk.Align.START; + icon_view.vexpand = false; + icon_view.homogeneous = true; + icon_view.column_spacing = 15; + icon_view.row_spacing = 15; + icon_view.margin = 15; + icon_view.activate_on_single_click = false; + icon_view.child_activated.connect ((child) => { + if ((child as Gtk.FlowBoxChild).get_child () is ApplicationIcon) { + var app_icon = (child as Gtk.FlowBoxChild).get_child () as ApplicationIcon; + try { + Process.spawn_command_line_async ("webby " + app_icon.desktop_file.url); + } catch (SpawnError e) { + debug ("Error: %s\n", e.message); + } + } + }); + load_applications (); + + scrolled.add(icon_view); + this.pack_start(scrolled, true, true, 0); + + } + + public void load_applications () { + applications = DesktopFile.get_webby_applications(); + + foreach (GLib.DesktopAppInfo app in applications.values) { + this.add_button (app); + } + } + + public void add_button (GLib.DesktopAppInfo app) { + var image = new ApplicationIcon (app); + image.edit_request.connect ((desktop_file) => { + edit_request (desktop_file); + icon_view.unselect_all (); + }); + image.deleted.connect ((parent) => { + this.icon_view.remove (parent); + app_deleted (); + }); + icon_view.add (image); + icon_view.show_all (); + } + + public void select_last_item () { + icon_view.select_child (icon_view.get_child_at_index ((int)icon_view.get_children ().length () - 1)); + } + + public void select_first_item () { + icon_view.select_child (icon_view.get_child_at_index (0)); + } + + public void update_button (GLib.DesktopAppInfo app) { + foreach (var item in icon_view.get_children ()) { + if ((item as Gtk.FlowBoxChild).get_child () is ApplicationIcon) { + var app_icon = (item as Gtk.FlowBoxChild).get_child () as ApplicationIcon; + + if (app_icon.desktop_file.name == app.get_display_name ()) { + app_icon.set_new_desktopfile (new DesktopFile.from_desktopappinfo (app)); + icon_view.select_child (item as Gtk.FlowBoxChild); + break; + } + } + } + } +} diff --git a/vapi/CMakeLists.txt b/vapi/CMakeLists.txt new file mode 100644 index 0000000..a9469da --- /dev/null +++ b/vapi/CMakeLists.txt @@ -0,0 +1,2 @@ +install(FILES webkit2gtk-3.0.deps webkit2gtk-3.0.vapi DESTINATION share/vala-0.26/vapi) + diff --git a/vapi/cmake/GSettings.cmake b/vapi/cmake/GSettings.cmake new file mode 100644 index 0000000..8fd745c --- /dev/null +++ b/vapi/cmake/GSettings.cmake @@ -0,0 +1,42 @@ +# GSettings.cmake, CMake macros written for Marlin, feel free to re-use them. + +option (GSETTINGS_LOCALINSTALL "Install GSettings Schemas locally instead of to the GLib prefix" ON) + +option (GSETTINGS_COMPILE "Compile GSettings Schemas after installation" ${GSETTINGS_LOCALINSTALL}) + +if(GSETTINGS_LOCALINSTALL) + message(STATUS "GSettings schemas will be installed locally.") +endif() + +if(GSETTINGS_COMPILE) + message(STATUS "GSettings shemas will be compiled.") +endif() + +macro(add_schema SCHEMA_NAME) + + set(PKG_CONFIG_EXECUTABLE pkg-config) + # Have an option to not install the schema into where GLib is + if (GSETTINGS_LOCALINSTALL) + SET (GSETTINGS_DIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/") + else (GSETTINGS_LOCALINSTALL) + execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} glib-2.0 --variable prefix OUTPUT_VARIABLE _glib_prefix OUTPUT_STRIP_TRAILING_WHITESPACE) + SET (GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/") + endif (GSETTINGS_LOCALINSTALL) + + # Run the validator and error if it fails + execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE _glib_comple_schemas OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process (COMMAND ${_glib_comple_schemas} --dry-run --schema-file=${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} ERROR_VARIABLE _schemas_invalid OUTPUT_STRIP_TRAILING_WHITESPACE) + + if (_schemas_invalid) + message (SEND_ERROR "Schema validation error: ${_schemas_invalid}") + endif (_schemas_invalid) + + # Actually install and recomple schemas + message (STATUS "GSettings schemas will be installed into ${GSETTINGS_DIR}") + install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} DESTINATION ${GSETTINGS_DIR} OPTIONAL) + + if (GSETTINGS_COMPILE) + install (CODE "message (STATUS \"Compiling GSettings schemas\")") + install (CODE "execute_process (COMMAND ${_glib_comple_schemas} ${GSETTINGS_DIR})") + endif () +endmacro() diff --git a/vapi/cmake/Makefile b/vapi/cmake/Makefile new file mode 100644 index 0000000..aee34c9 --- /dev/null +++ b/vapi/cmake/Makefile @@ -0,0 +1,286 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canoncical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/mefrio/Scrivania/cmake + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/mefrio/Scrivania/cmake/cmake + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/mefrio/Scrivania/cmake/cmake/CMakeFiles /home/mefrio/Scrivania/cmake/cmake/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/mefrio/Scrivania/cmake/cmake/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named scratch + +# Build rule for target. +scratch: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 scratch +.PHONY : scratch + +# fast build rule for target. +scratch/fast: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/build +.PHONY : scratch/fast + +src/entry.o: src/entry.c.o +.PHONY : src/entry.o + +# target to build an object file +src/entry.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/entry.c.o +.PHONY : src/entry.c.o + +src/entry.i: src/entry.c.i +.PHONY : src/entry.i + +# target to preprocess a source file +src/entry.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/entry.c.i +.PHONY : src/entry.c.i + +src/entry.s: src/entry.c.s +.PHONY : src/entry.s + +# target to generate assembly for a file +src/entry.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/entry.c.s +.PHONY : src/entry.c.s + +src/main_window.o: src/main_window.c.o +.PHONY : src/main_window.o + +# target to build an object file +src/main_window.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/main_window.c.o +.PHONY : src/main_window.c.o + +src/main_window.i: src/main_window.c.i +.PHONY : src/main_window.i + +# target to preprocess a source file +src/main_window.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/main_window.c.i +.PHONY : src/main_window.c.i + +src/main_window.s: src/main_window.c.s +.PHONY : src/main_window.s + +# target to generate assembly for a file +src/main_window.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/main_window.c.s +.PHONY : src/main_window.c.s + +src/menu.o: src/menu.c.o +.PHONY : src/menu.o + +# target to build an object file +src/menu.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/menu.c.o +.PHONY : src/menu.c.o + +src/menu.i: src/menu.c.i +.PHONY : src/menu.i + +# target to preprocess a source file +src/menu.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/menu.c.i +.PHONY : src/menu.c.i + +src/menu.s: src/menu.c.s +.PHONY : src/menu.s + +# target to generate assembly for a file +src/menu.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/menu.c.s +.PHONY : src/menu.c.s + +src/notebook.o: src/notebook.c.o +.PHONY : src/notebook.o + +# target to build an object file +src/notebook.c.o: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/notebook.c.o +.PHONY : src/notebook.c.o + +src/notebook.i: src/notebook.c.i +.PHONY : src/notebook.i + +# target to preprocess a source file +src/notebook.c.i: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/notebook.c.i +.PHONY : src/notebook.c.i + +src/notebook.s: src/notebook.c.s +.PHONY : src/notebook.s + +# target to generate assembly for a file +src/notebook.c.s: + $(MAKE) -f CMakeFiles/scratch.dir/build.make CMakeFiles/scratch.dir/src/notebook.c.s +.PHONY : src/notebook.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... scratch" + @echo "... src/entry.o" + @echo "... src/entry.i" + @echo "... src/entry.s" + @echo "... src/main_window.o" + @echo "... src/main_window.i" + @echo "... src/main_window.s" + @echo "... src/menu.o" + @echo "... src/menu.i" + @echo "... src/menu.s" + @echo "... src/notebook.o" + @echo "... src/notebook.i" + @echo "... src/notebook.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/vapi/cmake/README b/vapi/cmake/README new file mode 100644 index 0000000..9d45b32 --- /dev/null +++ b/vapi/cmake/README @@ -0,0 +1,10 @@ + Elementary CMake modules + +This is a set of CMake modules: Translations, GSettings, and Vala modules. + +For all the Vala related modules see README.Vala.rst: + - ParseArguments.cmake + - ValaPrecompile.cmake + - ValaVersion.cmake + - FindVala.cmake + diff --git a/vapi/cmake/README.Vala.rst b/vapi/cmake/README.Vala.rst new file mode 100644 index 0000000..bcc59b7 --- /dev/null +++ b/vapi/cmake/README.Vala.rst @@ -0,0 +1,173 @@ +========== +Vala CMake +========== +:Author: + Jakob Westhoff +:Version: + Draft + + +Overview +======== + +Vala CMake is a collection of macros for the CMake_ build system to allow the +creation and management of projects developed using the Vala_ programming +language or its "Genie" flavor (less tested). + + +Installation +============ + +To use the Vala macros in your own project you need to copy the macro files to +an arbitrary folder in your projects directory and reference them in your +``CMakeLists.txt`` file. + +Assuming the macros are stored under ``cmake/vala`` in your projects folder you +need to add the following information to your base ``CMakeLists.txt``:: + + list(APPEND CMAKE_MODULE_PATH + ${CMAKE_SOURCE_DIR}/cmake/vala + ) + +After the new module path as been added you can simply include the provided +modules or use the provided find routines. + + +Finding Vala +============ + +The find module for vala works like any other Find module in CMake. +You can use it by simply calling the usual ``find_package`` function. Default +parameters like ``REQUIRED`` and ``QUIETLY`` are supported. + +:: + + find_package(Vala REQUIRED) + +After a successful call to the find_package function the following variables +will be set: + +VALA_FOUND + Whether the vala compiler has been found or not + +VALA_EXECUTABLE + Full path to the valac executable if it has been found + +VALA_VERSION + Version number of the available valac + + +Precompiling Vala sources +========================= + +CMake is mainly supposed to handle c or c++ based projects. Luckily every vala +program is translated into plain c code using the vala compiler, followed by +normal compilation of the generated c program using gcc. + +The macro ``vala_precompile`` uses that fact to create c files from your .vala +sources for further CMake processing. + +The first parameter provided is a variable, which will be filled with a list of +c files outputted by the vala compiler. This list can than be used in +conjunction with functions like ``add_executable`` or others to create the +necessary compile rules with CMake. + +The initial variable is followed by a list of .vala files to be compiled. +Please take care to add every vala file belonging to the currently compiled +project or library as Vala will otherwise not be able to resolve all +dependencies. + +The following sections may be specified afterwards to provide certain options +to the vala compiler: + +PACKAGES + A list of vala packages/libraries to be used during the compile cycle. The + package names are exactly the same, as they would be passed to the valac + "--pkg=" option. + +OPTIONS + A list of optional options to be passed to the valac executable. This can be + used to pass "--thread" for example to enable multi-threading support. + +DIRECTORY + Specify the directory where the output source files will be stored. If + ommitted, the source files will be stored in CMAKE_CURRENT_BINARY_DIR. + +CUSTOM_VAPIS + A list of custom vapi files to be included for compilation. This can be + useful to include freshly created vala libraries without having to install + them in the system. + +GENERATE_VAPI + Pass all the needed flags to the compiler to create an internal vapi for + the compiled library. The provided name will be used for this and a + .vapi file will be created. + +GENERATE_HEADER + Let the compiler generate a header file for the compiled code. There will + be a header file as well as an internal header file being generated called + .h and _internal.h + +The following call is a simple example to the vala_precompile macro showing an +example to every of the optional sections:: + + vala_precompile(VALA_C + source1.vala + source2.vala + source3.vala + PACKAGES + gtk+-2.0 + gio-1.0 + posix + OPTIONS + --thread + CUSTOM_VAPIS + some_vapi.vapi + GENERATE_VAPI + myvapi + GENERATE_HEADER + myheader + ) + +Most important is the variable VALA_C which will contain all the generated c +file names after the call. The easiest way to use this information is to tell +CMake to create an executable out of it. + +:: + + add_executable(myexecutable ${VALA_C}) + + +Further reading +=============== + +The `Pdf Presenter Console`__ , which is a vala based project of mine, makes +heavy usage of the here described macros. To look at a real world example of +these macros the mentioned project is the right place to take a look. The svn +trunk of it can be found at:: + + svn://pureenergy.cc/pdf_presenter_console/trunk + + +__ http://westhoffswelt.de/projects/pdf_presenter_console.html + + +Acknowledgments +=============== + +Thanks go out to Florian Sowade, a fellow local PHP-Usergroupie, who helped me +a lot with the initial version of this macros and always answered my mostly +dumb CMake questions. + +.. _CMake: http://cmake.org +.. _Vala: http://live.gnome.org/Vala +.. _Genie: http://live.gnome.org/Genie + + + +.. + Local Variables: + mode: rst + fill-column: 79 + End: + vim: et syn=rst tw=79 diff --git a/vapi/cmake/Translations.cmake b/vapi/cmake/Translations.cmake new file mode 100644 index 0000000..be53b74 --- /dev/null +++ b/vapi/cmake/Translations.cmake @@ -0,0 +1,41 @@ +# Translations.cmake, CMake macros written for Marlin, feel free to re-use them + +macro(add_translations_directory NLS_PACKAGE) + add_custom_target (i18n ALL COMMENT “Building i18n messages.”) + find_program (MSGFMT_EXECUTABLE msgfmt) + file (GLOB PO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.po) + foreach (PO_INPUT ${PO_FILES}) + get_filename_component (PO_INPUT_BASE ${PO_INPUT} NAME_WE) + set (MO_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PO_INPUT_BASE}.mo) + add_custom_command (TARGET i18n COMMAND ${MSGFMT_EXECUTABLE} -o ${MO_OUTPUT} ${PO_INPUT}) + + install (FILES ${MO_OUTPUT} DESTINATION + share/locale/${PO_INPUT_BASE}/LC_MESSAGES + RENAME ${NLS_PACKAGE}.mo) + endforeach (PO_INPUT ${PO_FILES}) +endmacro(add_translations_directory) + + +macro(add_translations_catalog NLS_PACKAGE) + add_custom_target (pot COMMENT “Building translation catalog.”) + find_program (XGETTEXT_EXECUTABLE xgettext) + + + set(C_SOURCE "") + + foreach(FILES_INPUT ${ARGN}) + file (GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT}/*.c) + foreach(C_FILE ${SOURCE_FILES}) + set(C_SOURCE ${C_SOURCE} ${C_FILE}) + endforeach() + file (GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${FILES_INPUT}/*.vala) + foreach(C_FILE ${SOURCE_FILES}) + set(C_SOURCE ${C_SOURCE} ${C_FILE}) + endforeach() + endforeach() + + add_custom_command (TARGET pot COMMAND + ${XGETTEXT_EXECUTABLE} -d ${NLS_PACKAGE} -o ${CMAKE_CURRENT_SOURCE_DIR}/${NLS_PACKAGE}.pot + ${VALA_SOURCE} ${C_SOURCE} --keyword="_" --from-code=UTF-8 + ) +endmacro() diff --git a/vapi/cmake/uninstall.cmake b/vapi/cmake/uninstall.cmake new file mode 100644 index 0000000..0785ac8 --- /dev/null +++ b/vapi/cmake/uninstall.cmake @@ -0,0 +1,21 @@ +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +endif() + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + if(EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + endif() + else(EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + endif() +endforeach() diff --git a/vapi/cmake/vala/FindVala.cmake b/vapi/cmake/vala/FindVala.cmake new file mode 100644 index 0000000..aa3a6e7 --- /dev/null +++ b/vapi/cmake/vala/FindVala.cmake @@ -0,0 +1,65 @@ +## +# Copyright 2009-2010 Jakob Westhoff. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of Jakob Westhoff +## + +## +# Find module for the Vala compiler (valac) +# +# This module determines wheter a Vala compiler is installed on the current +# system and where its executable is. +# +# Call the module using "find_package(Vala) from within your CMakeLists.txt. +# +# The following variables will be set after an invocation: +# +# VALA_FOUND Whether the vala compiler has been found or not +# VALA_EXECUTABLE Full path to the valac executable if it has been found +# VALA_VERSION Version number of the available valac +## + + +# Search for the valac executable in the usual system paths. +find_program(VALA_EXECUTABLE + NAMES valac) + +# Handle the QUIETLY and REQUIRED arguments, which may be given to the find call. +# Furthermore set VALA_FOUND to TRUE if Vala has been found (aka. +# VALA_EXECUTABLE is set) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Vala DEFAULT_MSG VALA_EXECUTABLE) + +mark_as_advanced(VALA_EXECUTABLE) + +# Determine the valac version +if(VALA_FOUND) + execute_process(COMMAND ${VALA_EXECUTABLE} "--version" + OUTPUT_VARIABLE "VALA_VERSION") + string(REPLACE "Vala" "" "VALA_VERSION" ${VALA_VERSION}) + string(STRIP ${VALA_VERSION} "VALA_VERSION") +endif(VALA_FOUND) diff --git a/vapi/cmake/vala/ParseArguments.cmake b/vapi/cmake/vala/ParseArguments.cmake new file mode 100644 index 0000000..717c0f5 --- /dev/null +++ b/vapi/cmake/vala/ParseArguments.cmake @@ -0,0 +1,36 @@ +## +# This is a helper Macro to parse optional arguments in Macros/Functions +# It has been taken from the public CMake wiki. +# See http://www.cmake.org/Wiki/CMakeMacroParseArguments for documentation and +# licensing. +## +macro(parse_arguments prefix arg_names option_names) + set(DEFAULT_ARGS) + foreach(arg_name ${arg_names}) + set(${prefix}_${arg_name}) + endforeach(arg_name) + foreach(option ${option_names}) + set(${prefix}_${option} FALSE) + endforeach(option) + + set(current_arg_name DEFAULT_ARGS) + set(current_arg_list) + foreach(arg ${ARGN}) + set(larg_names ${arg_names}) + list(FIND larg_names "${arg}" is_arg_name) + if(is_arg_name GREATER -1) + set(${prefix}_${current_arg_name} ${current_arg_list}) + set(current_arg_name ${arg}) + set(current_arg_list) + else(is_arg_name GREATER -1) + set(loption_names ${option_names}) + list(FIND loption_names "${arg}" is_option) + if(is_option GREATER -1) + set(${prefix}_${arg} TRUE) + else(is_option GREATER -1) + set(current_arg_list ${current_arg_list} ${arg}) + endif(is_option GREATER -1) + endif(is_arg_name GREATER -1) + endforeach(arg) + set(${prefix}_${current_arg_name} ${current_arg_list}) +endmacro(parse_arguments) diff --git a/vapi/cmake/vala/ValaPrecompile.cmake b/vapi/cmake/vala/ValaPrecompile.cmake new file mode 100644 index 0000000..19c4739 --- /dev/null +++ b/vapi/cmake/vala/ValaPrecompile.cmake @@ -0,0 +1,175 @@ +## +# Copyright 2009-2010 Jakob Westhoff. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of Jakob Westhoff +## + +include(ParseArguments) +find_package(Vala REQUIRED) + +## +# Compile vala files to their c equivalents for further processing. +# +# The "vala_precompile" macro takes care of calling the valac executable on the +# given source to produce c files which can then be processed further using +# default cmake functions. +# +# The first parameter provided is a variable, which will be filled with a list +# of c files outputted by the vala compiler. This list can than be used in +# conjuction with functions like "add_executable" or others to create the +# neccessary compile rules with CMake. +# +# The initial variable is followed by a list of .vala files to be compiled. +# Please take care to add every vala file belonging to the currently compiled +# project or library as Vala will otherwise not be able to resolve all +# dependencies. +# +# The following sections may be specified afterwards to provide certain options +# to the vala compiler: +# +# PACKAGES +# A list of vala packages/libraries to be used during the compile cycle. The +# package names are exactly the same, as they would be passed to the valac +# "--pkg=" option. +# +# OPTIONS +# A list of optional options to be passed to the valac executable. This can be +# used to pass "--thread" for example to enable multi-threading support. +# +# CUSTOM_VAPIS +# A list of custom vapi files to be included for compilation. This can be +# useful to include freshly created vala libraries without having to install +# them in the system. +# +# GENERATE_VAPI +# Pass all the needed flags to the compiler to create an internal vapi for +# the compiled library. The provided name will be used for this and a +# .vapi file will be created. +# +# GENERATE_HEADER +# Let the compiler generate a header file for the compiled code. There will +# be a header file as well as an internal header file being generated called +# .h and _internal.h +# +# The following call is a simple example to the vala_precompile macro showing +# an example to every of the optional sections: +# +# vala_precompile(VALA_C +# source1.vala +# source2.vala +# source3.vala +# PACKAGES +# gtk+-2.0 +# gio-1.0 +# posix +# DIRECTORY +# gen +# OPTIONS +# --thread +# CUSTOM_VAPIS +# some_vapi.vapi +# GENERATE_VAPI +# myvapi +# GENERATE_HEADER +# myheader +# ) +# +# Most important is the variable VALA_C which will contain all the generated c +# file names after the call. +## + +macro(vala_precompile output) + parse_arguments(ARGS "PACKAGES;OPTIONS;DIRECTORY;GENERATE_HEADER;GENERATE_VAPI;CUSTOM_VAPIS" "" ${ARGN}) + if(ARGS_DIRECTORY) + set(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_DIRECTORY}) + else(ARGS_DIRECTORY) + set(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif(ARGS_DIRECTORY) + include_directories(${DIRECTORY}) + set(vala_pkg_opts "") + foreach(pkg ${ARGS_PACKAGES}) + list(APPEND vala_pkg_opts "--pkg=${pkg}") + endforeach(pkg ${ARGS_PACKAGES}) + set(in_files "") + set(out_files "") + set(${output} "") + foreach(src ${ARGS_DEFAULT_ARGS}) + list(APPEND in_files "${CMAKE_CURRENT_SOURCE_DIR}/${src}") + string(REPLACE ".vala" ".c" src ${src}) + string(REPLACE ".gs" ".c" src ${src}) + set(out_file "${DIRECTORY}/${src}") + list(APPEND out_files "${DIRECTORY}/${src}") + list(APPEND ${output} ${out_file}) + endforeach(src ${ARGS_DEFAULT_ARGS}) + + set(custom_vapi_arguments "") + if(ARGS_CUSTOM_VAPIS) + foreach(vapi ${ARGS_CUSTOM_VAPIS}) + if(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR}) + list(APPEND custom_vapi_arguments ${vapi}) + else (${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR}) + list(APPEND custom_vapi_arguments ${CMAKE_CURRENT_SOURCE_DIR}/${vapi}) + endif(${vapi} MATCHES ${CMAKE_SOURCE_DIR} OR ${vapi} MATCHES ${CMAKE_BINARY_DIR}) + endforeach(vapi ${ARGS_CUSTOM_VAPIS}) + endif(ARGS_CUSTOM_VAPIS) + + set(vapi_arguments "") + if(ARGS_GENERATE_VAPI) + list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_VAPI}.vapi") + set(vapi_arguments "--internal-vapi=${ARGS_GENERATE_VAPI}.vapi") + + # Header and internal header is needed to generate internal vapi + if (NOT ARGS_GENERATE_HEADER) + set(ARGS_GENERATE_HEADER ${ARGS_GENERATE_VAPI}) + endif(NOT ARGS_GENERATE_HEADER) + endif(ARGS_GENERATE_VAPI) + + set(header_arguments "") + if(ARGS_GENERATE_HEADER) + list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}.h") + list(APPEND out_files "${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h") + list(APPEND header_arguments "--header=${DIRECTORY}/${ARGS_GENERATE_HEADER}.h") + list(APPEND header_arguments "--internal-header=${DIRECTORY}/${ARGS_GENERATE_HEADER}_internal.h") + endif(ARGS_GENERATE_HEADER) + + add_custom_command(OUTPUT ${out_files} + COMMAND + ${VALA_EXECUTABLE} + ARGS + "-C" + ${header_arguments} + ${vapi_arguments} + "-b" ${CMAKE_CURRENT_SOURCE_DIR} + "-d" ${DIRECTORY} + ${vala_pkg_opts} + ${ARGS_OPTIONS} + ${in_files} + ${custom_vapi_arguments} + DEPENDS + ${in_files} + ${ARGS_CUSTOM_VAPIS} + ) +endmacro(vala_precompile) diff --git a/vapi/cmake/vala/ValaVersion.cmake b/vapi/cmake/vala/ValaVersion.cmake new file mode 100644 index 0000000..3fff193 --- /dev/null +++ b/vapi/cmake/vala/ValaVersion.cmake @@ -0,0 +1,96 @@ +## +# Copyright 2009-2010 Jakob Westhoff. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY JAKOB WESTHOFF ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL JAKOB WESTHOFF OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are those +# of the authors and should not be interpreted as representing official policies, +# either expressed or implied, of Jakob Westhoff +## + +include(ParseArguments) +find_package(Vala REQUIRED) + +## +# Ensure a certain valac version is available +# +# The initial argument is the version to check for +# +# It may be followed by a optional parameter to specifiy a version range. The +# following options are valid: +# +# EXACT +# Vala needs to be available in the exact version given +# +# MINIMUM +# The provided version is the minimum version. Therefore Vala needs to be +# available in the given version or any higher version +# +# MAXIMUM +# The provided version is the maximum. Therefore Vala needs to be available +# in the given version or any version older than this +# +# If no option is specified the version will be treated as a minimal version. +## +macro(ensure_vala_version version) + parse_arguments(ARGS "" "MINIMUM;MAXIMUM;EXACT" ${ARGN}) + set(compare_message "") + set(error_message "") + if(ARGS_MINIMUM) + set(compare_message "a minimum ") + set(error_message "or greater ") + elseif(ARGS_MAXIMUM) + set(compare_message "a maximum ") + set(error_message "or less ") + endif(ARGS_MINIMUM) + + message(STATUS + "checking for ${compare_message}Vala version of ${version}" + ) + + unset(version_accepted) + + # MINIMUM is the default if no option is specified + if(ARGS_EXACT) + if(${VALA_VERSION} VERSION_EQUAL ${version} ) + set(version_accepted TRUE) + endif(${VALA_VERSION} VERSION_EQUAL ${version}) + elseif(ARGS_MAXIMUM) + if(${VALA_VERSION} VERSION_LESS ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + set(version_accepted TRUE) + endif(${VALA_VERSION} VERSION_LESS ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + else(ARGS_MAXIMUM) + if(${VALA_VERSION} VERSION_GREATER ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + set(version_accepted TRUE) + endif(${VALA_VERSION} VERSION_GREATER ${version} OR ${VALA_VERSION} VERSION_EQUAL ${version}) + endif(ARGS_EXACT) + + if (NOT version_accepted) + message(FATAL_ERROR + "Vala version ${version} ${error_message}is required." + ) + endif(NOT version_accepted) + + message(STATUS + " found Vala, version ${VALA_VERSION}" + ) +endmacro(ensure_vala_version) diff --git a/vapi/config.vapi b/vapi/config.vapi new file mode 100644 index 0000000..1f03a0b --- /dev/null +++ b/vapi/config.vapi @@ -0,0 +1,9 @@ +[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")] +namespace Build { + public const string DATADIR; + public const string PKGDATADIR; + public const string GETTEXT_PACKAGE; + public const string RELEASE_NAME; + public const string VERSION; + public const string VERSION_INFO; +} diff --git a/vapi/webkit2gtk-3.0.deps b/vapi/webkit2gtk-3.0.deps new file mode 100644 index 0000000..dd7efb1 --- /dev/null +++ b/vapi/webkit2gtk-3.0.deps @@ -0,0 +1,7 @@ +atk +gio-2.0 +cairo +pango +gdk-pixbuf-2.0 +libsoup-2.4 +gtk+-3.0 diff --git a/vapi/webkit2gtk-3.0.vapi b/vapi/webkit2gtk-3.0.vapi new file mode 100644 index 0000000..a1bc5cb --- /dev/null +++ b/vapi/webkit2gtk-3.0.vapi @@ -0,0 +1,1003 @@ +/* webkit2gtk-4.0.vapi generated by vapigen, do not modify. */ + +[CCode (cprefix = "WebKit", gir_namespace = "WebKit2", gir_version = "4.0", lower_case_cprefix = "webkit_")] +namespace WebKit { + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_authentication_request_get_type ()")] + public class AuthenticationRequest : GLib.Object { + [CCode (has_construct_function = false)] + protected AuthenticationRequest (); + public void authenticate (WebKit.Credential? credential); + public bool can_save_credentials (); + public void cancel (); + public unowned string get_host (); + public uint get_port (); + public WebKit.Credential get_proposed_credential (); + public unowned string get_realm (); + public WebKit.AuthenticationScheme get_scheme (); + public bool is_for_proxy (); + public bool is_retry (); + public signal void cancelled (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_back_forward_list_get_type ()")] + public class BackForwardList : GLib.Object { + [CCode (has_construct_function = false)] + protected BackForwardList (); + public unowned WebKit.BackForwardListItem get_back_item (); + public GLib.List get_back_list (); + public GLib.List get_back_list_with_limit (uint limit); + public unowned WebKit.BackForwardListItem get_current_item (); + public unowned WebKit.BackForwardListItem get_forward_item (); + public GLib.List get_forward_list (); + public GLib.List get_forward_list_with_limit (uint limit); + public uint get_length (); + public unowned WebKit.BackForwardListItem get_nth_item (int index); + public signal void changed (WebKit.BackForwardListItem? item_added, void* items_removed); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_back_forward_list_item_get_type ()")] + public class BackForwardListItem : GLib.InitiallyUnowned { + [CCode (has_construct_function = false)] + protected BackForwardListItem (); + public unowned string get_original_uri (); + public unowned string get_title (); + public unowned string get_uri (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_context_menu_get_type ()")] + public class ContextMenu : GLib.Object { + [CCode (has_construct_function = false)] + public ContextMenu (); + public void append (WebKit.ContextMenuItem item); + public unowned WebKit.ContextMenuItem first (); + public unowned WebKit.ContextMenuItem get_item_at_position (uint position); + public unowned GLib.List get_items (); + public uint get_n_items (); + public void insert (WebKit.ContextMenuItem item, int position); + public unowned WebKit.ContextMenuItem last (); + public void move_item (WebKit.ContextMenuItem item, int position); + public void prepend (WebKit.ContextMenuItem item); + public void remove (WebKit.ContextMenuItem item); + public void remove_all (); + [CCode (has_construct_function = false)] + public ContextMenu.with_items (GLib.List items); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_context_menu_item_get_type ()")] + public class ContextMenuItem : GLib.InitiallyUnowned { + [CCode (has_construct_function = false)] + public ContextMenuItem (Gtk.Action action); + [CCode (has_construct_function = false)] + public ContextMenuItem.from_stock_action (WebKit.ContextMenuAction action); + [CCode (has_construct_function = false)] + public ContextMenuItem.from_stock_action_with_label (WebKit.ContextMenuAction action, string label); + public unowned Gtk.Action get_action (); + public WebKit.ContextMenuAction get_stock_action (); + public unowned WebKit.ContextMenu get_submenu (); + public bool is_separator (); + [CCode (has_construct_function = false)] + public ContextMenuItem.separator (); + public void set_submenu (WebKit.ContextMenu? submenu); + [CCode (has_construct_function = false)] + public ContextMenuItem.with_submenu (string label, WebKit.ContextMenu submenu); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_cookie_manager_get_type ()")] + public class CookieManager : GLib.Object { + [CCode (has_construct_function = false)] + protected CookieManager (); + public void delete_all_cookies (); + public void delete_cookies_for_domain (string domain); + public async WebKit.CookieAcceptPolicy get_accept_policy (GLib.Cancellable? cancellable) throws GLib.Error; + [CCode (array_length = false, array_null_terminated = true)] + public async string[] get_domains_with_cookies (GLib.Cancellable? cancellable) throws GLib.Error; + public void set_accept_policy (WebKit.CookieAcceptPolicy policy); + public void set_persistent_storage (string filename, WebKit.CookiePersistentStorage storage); + public signal void changed (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "webkit_credential_get_type ()")] + [Compact] + public class Credential { + [CCode (has_construct_function = false)] + public Credential (string username, string password, WebKit.CredentialPersistence persistence); + public WebKit.Credential copy (); + public void free (); + public unowned string get_password (); + public WebKit.CredentialPersistence get_persistence (); + public unowned string get_username (); + public bool has_password (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_download_get_type ()")] + public class Download : GLib.Object { + [CCode (has_construct_function = false)] + protected Download (); + public void cancel (); + public bool get_allow_overwrite (); + public unowned string get_destination (); + public double get_elapsed_time (); + public double get_estimated_progress (); + public uint64 get_received_data_length (); + public unowned WebKit.URIRequest get_request (); + public unowned WebKit.URIResponse get_response (); + public unowned WebKit.WebView get_web_view (); + public void set_allow_overwrite (bool allowed); + public void set_destination (string uri); + public bool allow_overwrite { get; set; } + public string destination { get; } + public double estimated_progress { get; } + public WebKit.URIResponse response { get; } + public signal void created_destination (string destination); + public virtual signal bool decide_destination (string suggested_filename); + public signal void failed (void* error); + public signal void finished (); + public signal void received_data (uint64 data_length); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_favicon_database_get_type ()")] + public class FaviconDatabase : GLib.Object { + [CCode (has_construct_function = false)] + protected FaviconDatabase (); + public void clear (); + public async Cairo.Surface get_favicon (string page_uri, GLib.Cancellable? cancellable) throws GLib.Error; + public string get_favicon_uri (string page_uri); + public signal void favicon_changed (string page_uri, string favicon_uri); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_file_chooser_request_get_type ()")] + public class FileChooserRequest : GLib.Object { + [CCode (has_construct_function = false)] + protected FileChooserRequest (); + public void cancel (); + [CCode (array_length = false, array_null_terminated = true)] + public unowned string[] get_mime_types (); + public unowned Gtk.FileFilter get_mime_types_filter (); + public bool get_select_multiple (); + [CCode (array_length = false, array_null_terminated = true)] + public unowned string[] get_selected_files (); + public void select_files ([CCode (array_length = false, array_null_terminated = true)] string[] files); + [NoAccessorMethod] + public Gtk.FileFilter filter { owned get; } + [CCode (array_length = false, array_null_terminated = true)] + public string[] mime_types { get; } + public bool select_multiple { get; } + [CCode (array_length = false, array_null_terminated = true)] + public string[] selected_files { get; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_find_controller_get_type ()")] + public class FindController : GLib.Object { + [CCode (has_construct_function = false)] + protected FindController (); + public void count_matches (string search_text, uint32 find_options, uint max_match_count); + public uint get_max_match_count (); + public uint32 get_options (); + public unowned string get_search_text (); + public unowned WebKit.WebView get_web_view (); + public void search (string search_text, uint32 find_options, uint max_match_count); + public void search_finish (); + public void search_next (); + public void search_previous (); + public uint max_match_count { get; } + public WebKit.FindOptions options { get; } + [NoAccessorMethod] + public string text { owned get; } + public WebKit.WebView web_view { get; construct; } + public signal void counted_matches (uint match_count); + public signal void failed_to_find_text (); + public signal void found_text (uint match_count); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_form_submission_request_get_type ()")] + public class FormSubmissionRequest : GLib.Object { + [CCode (has_construct_function = false)] + protected FormSubmissionRequest (); + public unowned GLib.HashTable get_text_fields (); + public void submit (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_geolocation_permission_request_get_type ()")] + public class GeolocationPermissionRequest : GLib.Object, WebKit.PermissionRequest { + [CCode (has_construct_function = false)] + protected GeolocationPermissionRequest (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_hit_test_result_get_type ()")] + public class HitTestResult : GLib.Object { + [CCode (has_construct_function = false)] + protected HitTestResult (); + public bool context_is_editable (); + public bool context_is_image (); + public bool context_is_link (); + public bool context_is_media (); + public bool context_is_scrollbar (); + public uint get_context (); + public unowned string get_image_uri (); + public unowned string get_link_label (); + public unowned string get_link_title (); + public unowned string get_link_uri (); + public unowned string get_media_uri (); + public uint context { get; construct; } + public string image_uri { get; construct; } + public string link_label { get; construct; } + public string link_title { get; construct; } + public string link_uri { get; construct; } + public string media_uri { get; construct; } + } + [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")] + [Compact] + public class JavascriptResult { + public WebKit.JavascriptResult @ref (); + public void unref (); + } + [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")] + [Compact] + public class MimeInfo { + public unowned string get_description (); + [CCode (array_length = false, array_null_terminated = true)] + public unowned string[] get_extensions (); + public unowned string get_mime_type (); + public WebKit.MimeInfo @ref (); + public void unref (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "webkit_navigation_action_get_type ()")] + [Compact] + public class NavigationAction { + public WebKit.NavigationAction copy (); + public void free (); + public uint get_modifiers (); + public uint get_mouse_button (); + public WebKit.NavigationType get_navigation_type (); + public unowned WebKit.URIRequest get_request (); + public bool is_user_gesture (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_navigation_policy_decision_get_type ()")] + public class NavigationPolicyDecision : WebKit.PolicyDecision { + [CCode (has_construct_function = false)] + protected NavigationPolicyDecision (); + public unowned string get_frame_name (); + [Deprecated (since = "2.6")] + public uint get_modifiers (); + [Deprecated (since = "2.6")] + public uint get_mouse_button (); + public unowned WebKit.NavigationAction get_navigation_action (); + [Deprecated (since = "2.6")] + public WebKit.NavigationType get_navigation_type (); + [Deprecated (since = "2.6")] + public unowned WebKit.URIRequest get_request (); + public string frame_name { get; } + [Deprecated (since = "2.6")] + public uint modifiers { get; } + [Deprecated (since = "2.6")] + public uint mouse_button { get; } + public WebKit.NavigationAction navigation_action { get; } + [Deprecated (since = "2.6")] + public WebKit.NavigationType navigation_type { get; } + [Deprecated (since = "2.6")] + public WebKit.URIRequest request { get; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_plugin_get_type ()")] + public class Plugin : GLib.Object { + [CCode (has_construct_function = false)] + protected Plugin (); + public unowned string get_description (); + public unowned GLib.List get_mime_info_list (); + public unowned string get_name (); + public unowned string get_path (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_policy_decision_get_type ()")] + public abstract class PolicyDecision : GLib.Object { + [CCode (has_construct_function = false)] + protected PolicyDecision (); + public void download (); + public void ignore (); + public void use (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_print_operation_get_type ()")] + public class PrintOperation : GLib.Object { + [CCode (has_construct_function = false)] + public PrintOperation (WebKit.WebView web_view); + public unowned Gtk.PageSetup get_page_setup (); + public unowned Gtk.PrintSettings get_print_settings (); + public void print (); + public WebKit.PrintOperationResponse run_dialog (Gtk.Window? parent); + public void set_page_setup (Gtk.PageSetup page_setup); + public void set_print_settings (Gtk.PrintSettings print_settings); + public Gtk.PageSetup page_setup { get; set; } + public Gtk.PrintSettings print_settings { get; set; } + [NoAccessorMethod] + public WebKit.WebView web_view { owned get; construct; } + public signal void failed (void* error); + public signal void finished (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_response_policy_decision_get_type ()")] + public class ResponsePolicyDecision : WebKit.PolicyDecision { + [CCode (has_construct_function = false)] + protected ResponsePolicyDecision (); + public unowned WebKit.URIRequest get_request (); + public unowned WebKit.URIResponse get_response (); + public bool is_mime_type_supported (); + public WebKit.URIRequest request { get; } + public WebKit.URIResponse response { get; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "webkit_script_dialog_get_type ()")] + [Compact] + public class ScriptDialog { + public void confirm_set_confirmed (bool confirmed); + public WebKit.ScriptDialogType get_dialog_type (); + public unowned string get_message (); + public unowned string prompt_get_default_text (); + public void prompt_set_text (string text); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_security_manager_get_type ()")] + public class SecurityManager : GLib.Object { + [CCode (has_construct_function = false)] + protected SecurityManager (); + public void register_uri_scheme_as_cors_enabled (string scheme); + public void register_uri_scheme_as_display_isolated (string scheme); + public void register_uri_scheme_as_empty_document (string scheme); + public void register_uri_scheme_as_local (string scheme); + public void register_uri_scheme_as_no_access (string scheme); + public void register_uri_scheme_as_secure (string scheme); + public bool uri_scheme_is_cors_enabled (string scheme); + public bool uri_scheme_is_display_isolated (string scheme); + public bool uri_scheme_is_empty_document (string scheme); + public bool uri_scheme_is_local (string scheme); + public bool uri_scheme_is_no_access (string scheme); + public bool uri_scheme_is_secure (string scheme); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_settings_get_type ()")] + public class Settings : GLib.Object { + [CCode (has_construct_function = false)] + public Settings (); + public bool get_allow_modal_dialogs (); + public bool get_auto_load_images (); + public unowned string get_cursive_font_family (); + public unowned string get_default_charset (); + public unowned string get_default_font_family (); + public uint32 get_default_font_size (); + public uint32 get_default_monospace_font_size (); + public bool get_draw_compositing_indicators (); + public bool get_enable_accelerated_2d_canvas (); + public bool get_enable_caret_browsing (); + public bool get_enable_developer_extras (); + public bool get_enable_dns_prefetching (); + public bool get_enable_frame_flattening (); + public bool get_enable_fullscreen (); + public bool get_enable_html5_database (); + public bool get_enable_html5_local_storage (); + public bool get_enable_hyperlink_auditing (); + public bool get_enable_java (); + public bool get_enable_javascript (); + public bool get_enable_media_stream (); + public bool get_enable_mediasource (); + public bool get_enable_offline_web_application_cache (); + public bool get_enable_page_cache (); + public bool get_enable_plugins (); + public bool get_enable_private_browsing (); + public bool get_enable_resizable_text_areas (); + public bool get_enable_site_specific_quirks (); + public bool get_enable_smooth_scrolling (); + public bool get_enable_spatial_navigation (); + public bool get_enable_tabs_to_links (); + public bool get_enable_webaudio (); + public bool get_enable_webgl (); + public bool get_enable_write_console_messages_to_stdout (); + public bool get_enable_xss_auditor (); + public unowned string get_fantasy_font_family (); + public bool get_javascript_can_access_clipboard (); + public bool get_javascript_can_open_windows_automatically (); + public bool get_load_icons_ignoring_image_load_setting (); + public bool get_media_playback_allows_inline (); + public bool get_media_playback_requires_user_gesture (); + public uint32 get_minimum_font_size (); + public unowned string get_monospace_font_family (); + public unowned string get_pictograph_font_family (); + public bool get_print_backgrounds (); + public unowned string get_sans_serif_font_family (); + public unowned string get_serif_font_family (); + public unowned string get_user_agent (); + public bool get_zoom_text_only (); + public void set_allow_modal_dialogs (bool allowed); + public void set_auto_load_images (bool enabled); + public void set_cursive_font_family (string cursive_font_family); + public void set_default_charset (string default_charset); + public void set_default_font_family (string default_font_family); + public void set_default_font_size (uint32 font_size); + public void set_default_monospace_font_size (uint32 font_size); + public void set_draw_compositing_indicators (bool enabled); + public void set_enable_accelerated_2d_canvas (bool enabled); + public void set_enable_caret_browsing (bool enabled); + public void set_enable_developer_extras (bool enabled); + public void set_enable_dns_prefetching (bool enabled); + public void set_enable_frame_flattening (bool enabled); + public void set_enable_fullscreen (bool enabled); + public void set_enable_html5_database (bool enabled); + public void set_enable_html5_local_storage (bool enabled); + public void set_enable_hyperlink_auditing (bool enabled); + public void set_enable_java (bool enabled); + public void set_enable_javascript (bool enabled); + public void set_enable_media_stream (bool enabled); + public void set_enable_mediasource (bool enabled); + public void set_enable_offline_web_application_cache (bool enabled); + public void set_enable_page_cache (bool enabled); + public void set_enable_plugins (bool enabled); + public void set_enable_private_browsing (bool enabled); + public void set_enable_resizable_text_areas (bool enabled); + public void set_enable_site_specific_quirks (bool enabled); + public void set_enable_smooth_scrolling (bool enabled); + public void set_enable_spatial_navigation (bool enabled); + public void set_enable_tabs_to_links (bool enabled); + public void set_enable_webaudio (bool enabled); + public void set_enable_webgl (bool enabled); + public void set_enable_write_console_messages_to_stdout (bool enabled); + public void set_enable_xss_auditor (bool enabled); + public void set_fantasy_font_family (string fantasy_font_family); + public void set_javascript_can_access_clipboard (bool enabled); + public void set_javascript_can_open_windows_automatically (bool enabled); + public void set_load_icons_ignoring_image_load_setting (bool enabled); + public void set_media_playback_allows_inline (bool enabled); + public void set_media_playback_requires_user_gesture (bool enabled); + public void set_minimum_font_size (uint32 font_size); + public void set_monospace_font_family (string monospace_font_family); + public void set_pictograph_font_family (string pictograph_font_family); + public void set_print_backgrounds (bool print_backgrounds); + public void set_sans_serif_font_family (string sans_serif_font_family); + public void set_serif_font_family (string serif_font_family); + public void set_user_agent (string? user_agent); + public void set_user_agent_with_application_details (string? application_name, string? application_version); + public void set_zoom_text_only (bool zoom_text_only); + public bool allow_modal_dialogs { get; set construct; } + public bool auto_load_images { get; set construct; } + public string cursive_font_family { get; set construct; } + public string default_charset { get; set construct; } + public string default_font_family { get; set construct; } + public uint default_font_size { get; set construct; } + public uint default_monospace_font_size { get; set construct; } + public bool draw_compositing_indicators { get; set construct; } + public bool enable_accelerated_2d_canvas { get; set construct; } + public bool enable_caret_browsing { get; set construct; } + public bool enable_developer_extras { get; set construct; } + public bool enable_dns_prefetching { get; set construct; } + public bool enable_frame_flattening { get; set construct; } + public bool enable_fullscreen { get; set construct; } + public bool enable_html5_database { get; set construct; } + public bool enable_html5_local_storage { get; set construct; } + public bool enable_hyperlink_auditing { get; set construct; } + public bool enable_java { get; set construct; } + public bool enable_javascript { get; set construct; } + public bool enable_media_stream { get; set construct; } + public bool enable_mediasource { get; set construct; } + public bool enable_offline_web_application_cache { get; set construct; } + public bool enable_page_cache { get; set construct; } + public bool enable_plugins { get; set construct; } + public bool enable_private_browsing { get; set construct; } + public bool enable_resizable_text_areas { get; set construct; } + public bool enable_site_specific_quirks { get; set construct; } + public bool enable_smooth_scrolling { get; set construct; } + public bool enable_spatial_navigation { get; set construct; } + public bool enable_tabs_to_links { get; set construct; } + public bool enable_webaudio { get; set construct; } + public bool enable_webgl { get; set construct; } + public bool enable_write_console_messages_to_stdout { get; set construct; } + public bool enable_xss_auditor { get; set construct; } + public string fantasy_font_family { get; set construct; } + public bool javascript_can_access_clipboard { get; set construct; } + public bool javascript_can_open_windows_automatically { get; set construct; } + public bool load_icons_ignoring_image_load_setting { get; set construct; } + public bool media_playback_allows_inline { get; set construct; } + public bool media_playback_requires_user_gesture { get; set construct; } + public uint minimum_font_size { get; set construct; } + public string monospace_font_family { get; set construct; } + public string pictograph_font_family { get; set construct; } + public bool print_backgrounds { get; set construct; } + public string sans_serif_font_family { get; set construct; } + public string serif_font_family { get; set construct; } + public string user_agent { get; set construct; } + public bool zoom_text_only { get; set construct; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_uri_request_get_type ()")] + public class URIRequest : GLib.Object { + [CCode (has_construct_function = false)] + public URIRequest (string uri); + public unowned Soup.MessageHeaders get_http_headers (); + public unowned string get_uri (); + public void set_uri (string uri); + public string uri { get; set construct; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_uri_response_get_type ()")] + public class URIResponse : GLib.Object { + [CCode (has_construct_function = false)] + protected URIResponse (); + public uint64 get_content_length (); + public unowned Soup.MessageHeaders get_http_headers (); + public unowned string get_mime_type (); + public uint get_status_code (); + public unowned string get_suggested_filename (); + public unowned string get_uri (); + public uint64 content_length { get; } + public Soup.MessageHeaders http_headers { get; } + public string mime_type { get; } + public uint status_code { get; } + public string suggested_filename { get; } + public string uri { get; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_uri_scheme_request_get_type ()")] + public class URISchemeRequest : GLib.Object { + [CCode (has_construct_function = false)] + protected URISchemeRequest (); + public void finish (GLib.InputStream stream, int64 stream_length, string? mime_type); + public void finish_error (GLib.Error error); + public unowned string get_path (); + public unowned string get_scheme (); + public unowned string get_uri (); + public unowned WebKit.WebView get_web_view (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_user_content_manager_get_type ()")] + public class UserContentManager : GLib.Object { + [CCode (has_construct_function = false)] + public UserContentManager (); + public void add_script (WebKit.UserScript script); + public void add_style_sheet (WebKit.UserStyleSheet stylesheet); + public void remove_all_scripts (); + public void remove_all_style_sheets (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", ref_function = "webkit_user_script_ref", type_id = "webkit_user_script_get_type ()", unref_function = "webkit_user_script_unref")] + [Compact] + public class UserScript { + [CCode (has_construct_function = false)] + public UserScript (string source, WebKit.UserContentInjectedFrames injected_frames, WebKit.UserScriptInjectionTime injection_time, [CCode (array_length = false, array_null_terminated = true)] string[]? whitelist, [CCode (array_length = false, array_null_terminated = true)] string[]? blacklist); + public WebKit.UserScript @ref (); + public void unref (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", ref_function = "webkit_user_style_sheet_ref", type_id = "webkit_user_style_sheet_get_type ()", unref_function = "webkit_user_style_sheet_unref")] + [Compact] + public class UserStyleSheet { + [CCode (has_construct_function = false)] + public UserStyleSheet (string source, WebKit.UserContentInjectedFrames injected_frames, WebKit.UserStyleLevel level, [CCode (array_length = false, array_null_terminated = true)] string[]? whitelist, [CCode (array_length = false, array_null_terminated = true)] string[]? blacklist); + public WebKit.UserStyleSheet @ref (); + public void unref (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_web_context_get_type ()")] + public class WebContext : GLib.Object { + [CCode (has_construct_function = false)] + protected WebContext (); + public void allow_tls_certificate_for_host (GLib.TlsCertificate certificate, string host); + public void clear_cache (); + public WebKit.Download download_uri (string uri); + public WebKit.CacheModel get_cache_model (); + public unowned WebKit.CookieManager get_cookie_manager (); + public static unowned WebKit.WebContext get_default (); + public unowned WebKit.FaviconDatabase get_favicon_database (); + public unowned string get_favicon_database_directory (); + public async GLib.List get_plugins (GLib.Cancellable? cancellable) throws GLib.Error; + public WebKit.ProcessModel get_process_model (); + public unowned WebKit.SecurityManager get_security_manager (); + public bool get_spell_checking_enabled (); + [CCode (array_length = false, array_null_terminated = true)] + public unowned string[] get_spell_checking_languages (); + public WebKit.TLSErrorsPolicy get_tls_errors_policy (); + public void prefetch_dns (string hostname); + public void register_uri_scheme (string scheme, owned WebKit.URISchemeRequestCallback callback); + public void set_additional_plugins_directory (string directory); + public void set_cache_model (WebKit.CacheModel cache_model); + public void set_disk_cache_directory (string directory); + public void set_favicon_database_directory (string? path); + public void set_preferred_languages ([CCode (array_length = false, array_null_terminated = true)] string[]? languages); + public void set_process_model (WebKit.ProcessModel process_model); + public void set_spell_checking_enabled (bool enabled); + public void set_spell_checking_languages ([CCode (array_length = false, array_null_terminated = true)] string[] languages); + public void set_tls_errors_policy (WebKit.TLSErrorsPolicy policy); + public void set_web_extensions_directory (string directory); + public void set_web_extensions_initialization_user_data (GLib.Variant user_data); + public signal void download_started (WebKit.Download download); + public signal void initialize_web_extensions (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_web_inspector_get_type ()")] + public class WebInspector : GLib.Object { + [CCode (has_construct_function = false)] + protected WebInspector (); + public void close (); + public uint get_attached_height (); + public unowned string get_inspected_uri (); + public unowned WebKit.WebViewBase get_web_view (); + public bool is_attached (); + public void show (); + public uint attached_height { get; } + public string inspected_uri { get; } + [HasEmitter] + public signal bool attach (); + public signal bool bring_to_front (); + public signal void closed (); + [HasEmitter] + public signal bool detach (); + public signal bool open_window (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_web_resource_get_type ()")] + public class WebResource : GLib.Object { + [CCode (has_construct_function = false)] + protected WebResource (); + public async uint8[] get_data (GLib.Cancellable? cancellable) throws GLib.Error; + public unowned WebKit.URIResponse get_response (); + public unowned string get_uri (); + public WebKit.URIResponse response { get; } + public string uri { get; } + public signal void failed (void* error); + public signal void finished (); + public signal void received_data (uint64 data_length); + public signal void sent_request (WebKit.URIRequest request, WebKit.URIResponse redirected_response); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_web_view_get_type ()")] + public class WebView : WebKit.WebViewBase, Atk.Implementor, Gtk.Buildable { + [CCode (has_construct_function = false, type = "GtkWidget*")] + public WebView (); + public async bool can_execute_editing_command (string command, GLib.Cancellable? cancellable) throws GLib.Error; + public bool can_go_back (); + public bool can_go_forward (); + public bool can_show_mime_type (string mime_type); + public WebKit.Download download_uri (string uri); + public void execute_editing_command (string command); + public unowned WebKit.BackForwardList get_back_forward_list (); + public unowned WebKit.WebContext get_context (); + public unowned string get_custom_charset (); + public double get_estimated_load_progress (); + public unowned Cairo.Surface get_favicon (); + public unowned WebKit.FindController get_find_controller (); + public unowned WebKit.WebInspector get_inspector (); + public unowned WebKit.WebResource get_main_resource (); + public uint64 get_page_id (); + public unowned WebKit.Settings get_settings (); + public async Cairo.Surface get_snapshot (WebKit.SnapshotRegion region, WebKit.SnapshotOptions options, GLib.Cancellable? cancellable) throws GLib.Error; + public unowned string get_title (); + public bool get_tls_info (out unowned GLib.TlsCertificate certificate, out GLib.TlsCertificateFlags errors); + public unowned string get_uri (); + public unowned WebKit.UserContentManager get_user_content_manager (); + public unowned WebKit.WindowProperties get_window_properties (); + public double get_zoom_level (); + public void go_back (); + public void go_forward (); + public void go_to_back_forward_list_item (WebKit.BackForwardListItem list_item); + public void load_alternate_html (string content, string content_uri, string? base_uri); + public void load_bytes (GLib.Bytes bytes, string? mime_type, string? encoding, string? base_uri); + public void load_html (string content, string? base_uri); + public void load_plain_text (string plain_text); + public void load_request (WebKit.URIRequest request); + public void load_uri (string uri); + public Gtk.Widget new_with_related_view (); + public void reload (); + public void reload_bypass_cache (); + public async WebKit.JavascriptResult run_javascript (string script, GLib.Cancellable? cancellable) throws GLib.Error; + public async WebKit.JavascriptResult run_javascript_from_gresource (string resource, GLib.Cancellable? cancellable) throws GLib.Error; + public async GLib.InputStream save (WebKit.SaveMode save_mode, GLib.Cancellable? cancellable) throws GLib.Error; + public async bool save_to_file (GLib.File file, WebKit.SaveMode save_mode, GLib.Cancellable? cancellable) throws GLib.Error; + public void set_custom_charset (string? charset); + public void set_settings (WebKit.Settings settings); + public void set_zoom_level (double zoom_level); + public void stop_loading (); + [CCode (has_construct_function = false, type = "GtkWidget*")] + public WebView.with_context (WebKit.WebContext context); + [CCode (has_construct_function = false, type = "GtkWidget*")] + public WebView.with_settings (WebKit.Settings settings); + [CCode (has_construct_function = false, type = "GtkWidget*")] + public WebView.with_user_content_manager (WebKit.UserContentManager user_content_manager); + public double estimated_load_progress { get; } + public void* favicon { get; } + [NoAccessorMethod] + public bool is_loading { get; } + public WebKit.WebView related_view { construct; } + public WebKit.Settings settings { set construct; } + public string title { get; } + public string uri { get; } + public WebKit.UserContentManager user_content_manager { get; construct; } + [NoAccessorMethod] + public WebKit.WebContext web_context { owned get; construct; } + public double zoom_level { get; set; } + public virtual signal bool authenticate (WebKit.AuthenticationRequest request); + public virtual signal void close (); + public virtual signal bool context_menu (WebKit.ContextMenu context_menu, Gdk.Event event, WebKit.HitTestResult hit_test_result); + public virtual signal void context_menu_dismissed (); + public signal Gtk.Widget create (); + public virtual signal bool decide_policy (WebKit.PolicyDecision decision, WebKit.PolicyDecisionType type); + public virtual signal bool enter_fullscreen (); + public virtual signal void insecure_content_detected (WebKit.InsecureContentEvent event); + public virtual signal bool leave_fullscreen (); + public virtual signal void load_changed (WebKit.LoadEvent load_event); + public virtual signal bool load_failed (WebKit.LoadEvent load_event, string failing_uri, void* error); + public virtual signal bool load_failed_with_tls_errors (string failing_uri, GLib.TlsCertificate certificate, GLib.TlsCertificateFlags errors); + public virtual signal void mouse_target_changed (WebKit.HitTestResult hit_test_result, uint modifiers); + public virtual signal bool permission_request (WebKit.PermissionRequest permission_request); + public virtual signal bool print (WebKit.PrintOperation print_operation); + public virtual signal void ready_to_show (); + public virtual signal void resource_load_started (WebKit.WebResource resource, WebKit.URIRequest request); + public virtual signal void run_as_modal (); + public virtual signal bool run_file_chooser (WebKit.FileChooserRequest request); + public virtual signal bool script_dialog (WebKit.ScriptDialog dialog); + public virtual signal void submit_form (WebKit.FormSubmissionRequest request); + public virtual signal bool web_process_crashed (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_web_view_base_get_type ()")] + public class WebViewBase : Gtk.Container, Atk.Implementor, Gtk.Buildable { + [CCode (has_construct_function = false)] + protected WebViewBase (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_window_properties_get_type ()")] + public class WindowProperties : GLib.Object { + [CCode (has_construct_function = false)] + protected WindowProperties (); + public bool get_fullscreen (); + public Gdk.Rectangle get_geometry (); + public bool get_locationbar_visible (); + public bool get_menubar_visible (); + public bool get_resizable (); + public bool get_scrollbars_visible (); + public bool get_statusbar_visible (); + public bool get_toolbar_visible (); + public bool fullscreen { get; construct; } + public Cairo.RectangleInt geometry { get; construct; } + public bool locationbar_visible { get; construct; } + public bool menubar_visible { get; construct; } + public bool resizable { get; construct; } + public bool scrollbars_visible { get; construct; } + public bool statusbar_visible { get; construct; } + public bool toolbar_visible { get; construct; } + } + [CCode (cheader_filename = "webkit2/webkit2.h", type_id = "webkit_permission_request_get_type ()")] + public interface PermissionRequest : GLib.Object { + public abstract void allow (); + public abstract void deny (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_AUTHENTICATION_SCHEME_", type_id = "webkit_authentication_scheme_get_type ()")] + public enum AuthenticationScheme { + DEFAULT, + HTTP_BASIC, + HTTP_DIGEST, + HTML_FORM, + NTLM, + NEGOTIATE, + CLIENT_CERTIFICATE_REQUESTED, + SERVER_TRUST_EVALUATION_REQUESTED, + UNKNOWN + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_CACHE_MODEL_", type_id = "webkit_cache_model_get_type ()")] + public enum CacheModel { + DOCUMENT_VIEWER, + WEB_BROWSER, + DOCUMENT_BROWSER + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_CONTEXT_MENU_ACTION_", type_id = "webkit_context_menu_action_get_type ()")] + public enum ContextMenuAction { + NO_ACTION, + OPEN_LINK, + OPEN_LINK_IN_NEW_WINDOW, + DOWNLOAD_LINK_TO_DISK, + COPY_LINK_TO_CLIPBOARD, + OPEN_IMAGE_IN_NEW_WINDOW, + DOWNLOAD_IMAGE_TO_DISK, + COPY_IMAGE_TO_CLIPBOARD, + COPY_IMAGE_URL_TO_CLIPBOARD, + OPEN_FRAME_IN_NEW_WINDOW, + GO_BACK, + GO_FORWARD, + STOP, + RELOAD, + COPY, + CUT, + PASTE, + DELETE, + SELECT_ALL, + INPUT_METHODS, + UNICODE, + SPELLING_GUESS, + NO_GUESSES_FOUND, + IGNORE_SPELLING, + LEARN_SPELLING, + IGNORE_GRAMMAR, + FONT_MENU, + BOLD, + ITALIC, + UNDERLINE, + OUTLINE, + INSPECT_ELEMENT, + OPEN_VIDEO_IN_NEW_WINDOW, + OPEN_AUDIO_IN_NEW_WINDOW, + COPY_VIDEO_LINK_TO_CLIPBOARD, + COPY_AUDIO_LINK_TO_CLIPBOARD, + TOGGLE_MEDIA_CONTROLS, + TOGGLE_MEDIA_LOOP, + ENTER_VIDEO_FULLSCREEN, + MEDIA_PLAY, + MEDIA_PAUSE, + MEDIA_MUTE, + DOWNLOAD_VIDEO_TO_DISK, + DOWNLOAD_AUDIO_TO_DISK, + CUSTOM + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_COOKIE_POLICY_ACCEPT_", type_id = "webkit_cookie_accept_policy_get_type ()")] + public enum CookieAcceptPolicy { + ALWAYS, + NEVER, + NO_THIRD_PARTY + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_COOKIE_PERSISTENT_STORAGE_", type_id = "webkit_cookie_persistent_storage_get_type ()")] + public enum CookiePersistentStorage { + TEXT, + SQLITE + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_CREDENTIAL_PERSISTENCE_", type_id = "webkit_credential_persistence_get_type ()")] + public enum CredentialPersistence { + NONE, + FOR_SESSION, + PERMANENT + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_FIND_OPTIONS_", type_id = "webkit_find_options_get_type ()")] + [Flags] + public enum FindOptions { + NONE, + CASE_INSENSITIVE, + AT_WORD_STARTS, + TREAT_MEDIAL_CAPITAL_AS_WORD_START, + BACKWARDS, + WRAP_AROUND + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_HIT_TEST_RESULT_CONTEXT_", type_id = "webkit_hit_test_result_context_get_type ()")] + [Flags] + public enum HitTestResultContext { + DOCUMENT, + LINK, + IMAGE, + MEDIA, + EDITABLE, + SCROLLBAR + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_INSECURE_CONTENT_", type_id = "webkit_insecure_content_event_get_type ()")] + public enum InsecureContentEvent { + RUN, + DISPLAYED + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_LOAD_", type_id = "webkit_load_event_get_type ()")] + public enum LoadEvent { + STARTED, + REDIRECTED, + COMMITTED, + FINISHED + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_NAVIGATION_TYPE_", type_id = "webkit_navigation_type_get_type ()")] + public enum NavigationType { + LINK_CLICKED, + FORM_SUBMITTED, + BACK_FORWARD, + RELOAD, + FORM_RESUBMITTED, + OTHER + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_POLICY_DECISION_TYPE_", type_id = "webkit_policy_decision_type_get_type ()")] + public enum PolicyDecisionType { + NAVIGATION_ACTION, + NEW_WINDOW_ACTION, + RESPONSE + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_PRINT_OPERATION_RESPONSE_", type_id = "webkit_print_operation_response_get_type ()")] + public enum PrintOperationResponse { + PRINT, + CANCEL + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_PROCESS_MODEL_", type_id = "webkit_process_model_get_type ()")] + public enum ProcessModel { + SHARED_SECONDARY_PROCESS, + MULTIPLE_SECONDARY_PROCESSES + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_SAVE_MODE_", type_id = "webkit_save_mode_get_type ()")] + public enum SaveMode { + MHTML + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_SCRIPT_DIALOG_", type_id = "webkit_script_dialog_type_get_type ()")] + public enum ScriptDialogType { + ALERT, + CONFIRM, + PROMPT + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_SNAPSHOT_OPTIONS_", type_id = "webkit_snapshot_options_get_type ()")] + [Flags] + public enum SnapshotOptions { + NONE, + INCLUDE_SELECTION_HIGHLIGHTING + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_SNAPSHOT_REGION_", type_id = "webkit_snapshot_region_get_type ()")] + public enum SnapshotRegion { + VISIBLE, + FULL_DOCUMENT + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_TLS_ERRORS_POLICY_", type_id = "webkit_tls_errors_policy_get_type ()")] + public enum TLSErrorsPolicy { + IGNORE, + FAIL + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_USER_CONTENT_INJECT_", type_id = "webkit_user_content_injected_frames_get_type ()")] + public enum UserContentInjectedFrames { + ALL_FRAMES, + TOP_FRAME + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_", type_id = "webkit_user_script_injection_time_get_type ()")] + public enum UserScriptInjectionTime { + START, + END + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_USER_STYLE_LEVEL_", type_id = "webkit_user_style_level_get_type ()")] + public enum UserStyleLevel { + USER, + AUTHOR + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_DOWNLOAD_ERROR_")] + public errordomain DownloadError { + NETWORK, + CANCELLED_BY_USER, + DESTINATION; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_FAVICON_DATABASE_ERROR_")] + public errordomain FaviconDatabaseError { + NOT_INITIALIZED, + FAVICON_NOT_FOUND, + FAVICON_UNKNOWN; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_JAVASCRIPT_ERROR_SCRIPT_")] + public errordomain JavascriptError { + FAILED; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_NETWORK_ERROR_")] + public errordomain NetworkError { + FAILED, + TRANSPORT, + UNKNOWN_PROTOCOL, + CANCELLED, + FILE_DOES_NOT_EXIST; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_PLUGIN_ERROR_")] + public errordomain PluginError { + FAILED, + CANNOT_FIND_PLUGIN, + CANNOT_LOAD_PLUGIN, + JAVA_UNAVAILABLE, + CONNECTION_CANCELLED, + WILL_HANDLE_LOAD; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_POLICY_ERROR_")] + public errordomain PolicyError { + FAILED, + CANNOT_SHOW_MIME_TYPE, + CANNOT_SHOW_URI, + FRAME_LOAD_INTERRUPTED_BY_POLICY_CHANGE, + CANNOT_USE_RESTRICTED_PORT; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_PRINT_ERROR_")] + public errordomain PrintError { + GENERAL, + PRINTER_NOT_FOUND, + INVALID_PAGE_RANGE; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", cprefix = "WEBKIT_SNAPSHOT_ERROR_FAILED_TO_")] + public errordomain SnapshotError { + CREATE; + public static GLib.Quark quark (); + } + [CCode (cheader_filename = "webkit2/webkit2.h", instance_pos = 1.9)] + public delegate void URISchemeRequestCallback (WebKit.URISchemeRequest request); + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_EDITING_COMMAND_COPY")] + public const string EDITING_COMMAND_COPY; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_EDITING_COMMAND_CUT")] + public const string EDITING_COMMAND_CUT; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_EDITING_COMMAND_PASTE")] + public const string EDITING_COMMAND_PASTE; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_EDITING_COMMAND_REDO")] + public const string EDITING_COMMAND_REDO; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_EDITING_COMMAND_SELECT_ALL")] + public const string EDITING_COMMAND_SELECT_ALL; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_EDITING_COMMAND_UNDO")] + public const string EDITING_COMMAND_UNDO; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_MAJOR_VERSION")] + public const int MAJOR_VERSION; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_MICRO_VERSION")] + public const int MICRO_VERSION; + [CCode (cheader_filename = "webkit2/webkit2.h", cname = "WEBKIT_MINOR_VERSION")] + public const int MINOR_VERSION; + [CCode (cheader_filename = "webkit2/webkit2.h")] + public static uint get_major_version (); + [CCode (cheader_filename = "webkit2/webkit2.h")] + public static uint get_micro_version (); + [CCode (cheader_filename = "webkit2/webkit2.h")] + public static uint get_minor_version (); +}