diff options
author | André Auzi <aauzi@free.fr> | 2014-01-25 00:04:05 +0100 |
---|---|---|
committer | André Auzi <aauzi@free.fr> | 2014-01-25 00:04:05 +0100 |
commit | d94ebfc020c02e3314d5d6795128b010ab0cb9fb (patch) | |
tree | 466a5d08a54bea6a1b92b852b397d60e76f55be5 | |
parent | 7f0e57b539065f6f4c1c8ba159cd846528a7c7b1 (diff) | |
parent | b62a32b5474d0446320fe675d02086bab1462e5a (diff) | |
download | midori-d94ebfc020c02e3314d5d6795128b010ab0cb9fb.tar.gz |
merge lp:midori
160 files changed, 3732 insertions, 5496 deletions
@@ -11,3 +11,4 @@ po/stamp-it po/*.gmo packages.version +GNUmakefile diff --git a/CMakeLists.txt b/CMakeLists.txt index cfad7e38..6d8de304 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,11 +2,16 @@ cmake_minimum_required(VERSION 2.6) cmake_policy(VERSION 2.6) +# Work-around a bug in the included FindGettext fixed with 2.8.8 +# See http://www.cmake.org/pipermail/cmake-commits/2012-February/012117.html +if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.8") + cmake_policy(SET CMP0002 OLD) +endif () project(midori C) add_definitions("-DPACKAGE_NAME=\"${CMAKE_PROJECT_NAME}\"") add_definitions("-DPACKAGE_BUGREPORT=\"https://bugs.launchpad.net/midori\"") -set(VERSION 0.5.5) +set(VERSION 0.5.7) add_definitions("-DMIDORI_VERSION_SUFFIX=\"${VERSION}\"") string(REPLACE "." ";" VERSION_LIST ${VERSION}) @@ -23,6 +28,9 @@ execute_process(COMMAND "bzr" "revno" OUTPUT_STRIP_TRAILING_WHITESPACE) if (REVISION) set(VERSION "${VERSION}~r${REVISION}") + # All warnings are errors in development builds + set(VALAFLAGS ${VALAFLAGS} --fatal-warnings) + set(CFLAGS "${CFLAGS}") endif () add_definitions("-DPACKAGE_VERSION=\"${VERSION}\"") @@ -30,6 +38,13 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) # Disallow building during install to avoid permission problems set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY 1) +find_package(Vala REQUIRED) +vala_require("0.16.0") +set(VALAFLAGS ${VALAFLAGS} + --enable-deprecated + --debug + ) + include(GNUInstallDirs) set(DATADIR ${CMAKE_INSTALL_FULL_DATADIR}) add_definitions("-DMDATADIR=\"${DATADIR}\"") @@ -115,8 +130,12 @@ if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.37.1") add_definitions("-DHAVE_LIBSOUP_2_37_1") endif () if (${DEPS_libsoup-gnome-2.4_VERSION} VERSION_GREATER "2.40.0") - add_definitions("-DHAVE_LIBSOUP_2_40_0") - set(VALAFLAGS ${VALAFLAGS} -D HAVE_LIBSOUP_2_40_0) + # valac 0.16 didn't have the bindings yet + # For consistency we need to ensure C code makes the same assumptions + if (${VALA_VERSION} VERSION_GREATER "0.17.0") + add_definitions("-DHAVE_LIBSOUP_2_40_0") + set(VALAFLAGS ${VALAFLAGS} -D HAVE_LIBSOUP_2_40_0) + endif () endif () if (WIN32) @@ -135,12 +154,14 @@ option(HALF_BRO_INCOM_WEBKIT2 "Serve as a guniea pig" OFF) option(USE_ZEITGEIST "Zeitgeist history integration" ON) option(USE_GRANITE "Fancy notebook and pop-overs" OFF) option(USE_APIDOCS "API documentation" OFF) +option(EXTRA_WARNINGS "Additional compiler warnings" OFF) -if (USE_GRANITE) - if (NOT USE_GTK3 AND NOT HALF_BRO_INCOM_WEBKIT2) - set(USE_GTK3 ON) - endif () +# GTK+3 is implied here, whether set or not +if (USE_GRANITE OR HALF_BRO_INCOM_WEBKIT2) + set(USE_GTK3 ON) +endif () +if (USE_GRANITE) pkg_check_modules(GRANITE granite>=0.2) set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${GRANITE_INCLUDE_DIRS}") set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${GRANITE_LIBRARIES}") @@ -160,7 +181,7 @@ if (USE_ZEITGEIST) set(PKGS ${PKGS} zeitgeist-1.0) endif() -if (USE_GTK3 OR HALF_BRO_INCOM_WEBKIT2) +if (USE_GTK3) pkg_check_modules(GCR gcr-3>=2.32) if (GCR_VERSION) set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${GCR_INCLUDE_DIRS}") @@ -175,35 +196,35 @@ else () add_definitions("-DGCR_VERSION=\"No\"") endif () -if (USE_GTK3) +if (HALF_BRO_INCOM_WEBKIT2) + # Note: WebKitGTK+ 2.0.0 matches 1.11.91; 1.11.92 > 2.0.0 pkg_check_modules(DEPS_GTK REQUIRED gtk+-3.0>=3.0.0 - webkitgtk-3.0>=1.8.3 + webkit2gtk-3.0>=1.11.91 javascriptcoregtk-3.0 ) + add_definitions("-DHAVE_WEBKIT2") add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-3.0_VERSION}\"") - add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkitgtk-3.0_VERSION}\"") + add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit2gtk-3.0_VERSION}\"") set(PKGS ${PKGS} gtk+-3.0) - set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi") + set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkit2gtk-3.0.vapi") set(VALAFLAGS ${VALAFLAGS} -D HAVE_GTK3) -elseif (HALF_BRO_INCOM_WEBKIT2) - # Note: WebKitGTK+ 2.0.0 matches 1.11.91; 1.11.92 > 2.0.0 + set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2) +elseif (USE_GTK3) pkg_check_modules(DEPS_GTK REQUIRED gtk+-3.0>=3.0.0 - webkit2gtk-3.0>=1.11.91 + webkitgtk-3.0>=1.8.1 javascriptcoregtk-3.0 ) - add_definitions("-DHAVE_WEBKIT2") add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-3.0_VERSION}\"") - add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkit2gtk-3.0_VERSION}\"") + add_definitions("-DWEBKIT_VERSION=\"${DEPS_GTK_webkitgtk-3.0_VERSION}\"") set(PKGS ${PKGS} gtk+-3.0) - set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkit2gtk-3.0.vapi") + set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi") set(VALAFLAGS ${VALAFLAGS} -D HAVE_GTK3) - set(VALAFLAGS ${VALAFLAGS} -D HAVE_WEBKIT2) else () pkg_check_modules(DEPS_GTK REQUIRED gtk+-2.0>=2.24.0 - webkit-1.0>=1.8.3 + webkit-1.0>=1.8.1 javascriptcoregtk-1.0 ) add_definitions("-DGTK_VERSION=\"${DEPS_GTK_gtk+-2.0_VERSION}\"") @@ -212,19 +233,36 @@ else () set(EXTRA_VAPIS ${EXTRA_VAPIS} "${CMAKE_SOURCE_DIR}/midori/webkitgtk-3.0.vapi") endif () -find_package(Vala REQUIRED) -vala_require("0.16.0") -set(VALAFLAGS ${VALAFLAGS} - --enable-deprecated - --debug - ) - # dh_translations detects this if there's no variable used set (GETTEXT_PACKAGE "midori") add_definitions("-DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\"") -set(CFLAGS "-Wall -Wundef -Wno-deprecated-declarations -g") -set(VALA_CFLAGS "-w -g") +set(CFLAGS "${CFLAGS} -Wall -Wundef -Wno-deprecated-declarations -g") + +if (EXTRA_WARNINGS) + LIST(APPEND EXTRA_CFLAGS_LIST + -Wextra + -Wno-unused-parameter + -Wno-missing-field-initializers + -Wno-comment + -Waggregate-return + -Wredundant-decls + -Wshadow -Wpointer-arith -Wcast-align + -Winline -Wformat-security -fno-common + -Winit-self -Wundef + -Wnested-externs + ) + string(REPLACE ";" " " EXTRA_CFLAGS "${EXTRA_CFLAGS_LIST}") + set(CFLAGS "${CFLAGS} ${EXTRA_CFLAGS}") +else () + if (REVISION) + set(CFLAGS "${CFLAGS} -Werror") + endif() +endif () + +# Explicitly add -fPIC for older toolchains +set(VALA_CFLAGS "-w -g -fPIC") + set(LIBMIDORI "${CMAKE_PROJECT_NAME}-core") # CMake provides no uninstall target by design @@ -1,5 +1,127 @@ This file is licensed under the terms of the expat license, see the file EXPAT. +v0.5.7: + Modify actions and internal items in browser without changing settings + Delay tab loading after Midori crashed + Uncomment failing assertions about view_source in tab test + Fallback to about:home if startup is anything but blank + Don't try to create formhistory database if config_dir is NULL + Handle url arguments for blank sessions + Execute commands given at start time + Introduce high-level prepare/ DatabaseStatement API + Drop unused GraniteClutter-based animation support + Drop uncommented contractor support + Drop deprecated StaticNotebook used in KatzePreferences + Introduce notebook class converging separate implementations + Work around symbol relocation issue old version of gcc present on Ubuntu LTS + NULL-check treeview in midori_search_action_get_editor + Adjust CMakeList .ico check to not skip nojs icons + Enable sidepanel in private mode + Move Preferences menu entry above About + Set minimum value of 0 on spin button for maximum cache size + Give NextForward its own label for toolbar editor + Correctly disable favicon database in app and private mode + Change preferences to refer to proxy address as a "URI" (not "hostname") + Add close tabs to right feature + Allow printing without confirmation dialog on kiosk setups + +v0.5.6: + instead of creating devpet status icon on extension load, create it only to show new messages + Open speed dial or homepage according to preference + handle tab duplication + Add copyright note to appdata file + Tweak searching for resources when running from build folder + Swap NULL-check with main frame check + Use correct signal when clearing the trash + Hide WEbGL preference if it is unavailable + Remove stored popup sessions from the database + Check all browsers for opened sessions and whether they're popups + removed unused preference dialog and related code + Fix check for found valac and mention VALAC variable + Fix autoscrolling if page contains a frame with our custom error page + Don't use context-menu signal in WebKitGTK+ < 1.10.0 + Fix building on Ubuntu 12.04 + Reset item ids when re-importing bookmarks + Check path being NULL in export before trying to inspect it + restore the last closed sessions if no session is opened + Cast WebKitDOMHtmlElement for getting source content + Use font-set signal and font family for GTK+ 3.2 font chooser + add function to view dom source + remove unused variable + Resolve compiler warnings in current trunk + Update win32-release script for cmake, move unused docs/scripts to old folder + Try to handle previous runs of cmake in configure wrapper + Correct view source assertions in tab unit test + Build fix: found undeclared in midori_bookmarks_db_remove_item_recursive + Cache bookmark items to avoid their recreation on database reads + allow "view source" on about pages + Enable old target policy on cmake < 2.8.8 + Re-arrange data file installing to be more explicit + option to modify the number of tabs which will be restored in each idle callback + Implement MidoriBookmarksDatabase class by inheritence from MidoriDatabase + Ensure tab spinners update as often as the menubar spinner to avoid desync + Use tabby sorting increment when importing session.xbel tabs + Only install config files to /etc if prefix equals /usr + handle urls as argument when starting midori + Make tabby compile with Webkit2 + Drop waf build system and provide cmake-based "configure" script + midori_panel_action_activate_cb forgot to update the action group + Fixes bug where certificate Security overlay failed to close + handle tab movement + add tab sorting + Untangle implicit GTK+3 for Granite and WebKit2 + Allow running test under debug tools with cmake + Install config files to /etc when install prefix is /usr + Add missing PO_FILES argument to GETTEXT_PROCESS_PO_FILES + Add USE_APIDOCS to build API docs with CMake + Rasterize SVG to PNG with rsvg-convert + fix bookmarks test regression after fix-1179200-4 + Add CMakeLists.txt for config directory + Install mo files in locale dir + don't change uri/title if the tab isn't loaded + use a separate signal to store the tab title + Check if execinfo.h header exists on BSD + fix endless loop in Midori.Database.init + Use destructive-action style class in ClearPrivateData + Initialize priv->element to avoid crash when freeing + Introduces KatzeArray::update-item to handle metadata changes + Refactor excuting schema from file into a function + Use stock as string in liststore + Drop needless (and wrong) HAVE_LIBNOTIFY in preferences + Flip horizontal position of the overlay when hit by the mouse + Add Midori.URI.get_base_domain and use it in NoJS + Introduce Midori.Database and use for history and tabby + ctrl+shift+w should trigger a delete-event + Implement dialog windows opened via javascript + Make get_res_filename work with different hierarchies + fix check for new database + Speed up session import + Import tab title from old sessions + Separate CFLAGS for C and add missing HAVE_ + Install top-level text files and FAQ html/ css to doc dir + Provide and install .appdata.xml file for app stores + Move bookmarks db handling to midori-bookmarks-db + Add XSS to OPTS_LIBRARIES + Update condition for UBUNTU_MENUPROXY to work on Saucy + Introduce tabby, the new session manager + Fix typo in katze_item_set_meta_integer call + Allow bookmark bar update on additions resulting from imports + Re-work midori_array_query_recursive to not include folder items twice + Fix syntax of icon sizes passed to foreach + Add bzr revision number to version if available + Unify nojs and cookie policy dialogs, make policy changeable within the list + Drop all G_ENABLE_DEBUG guards + Add -g to CFLAGS to enable debugging symbols + Adjust cmake build for Win32 + Implement CMake build setup + Port MidoriApp from Unique/ sockets to GApplication + New signal about-content to provide content for about uris + Check if browser is NULL in midori_view_get_tab_menu to prevent a crash. Fixes bug #1215652. + Ensure proxy setting widgets callbacks don't outlive the widgets themselves + Fix webkit2 build error + Show the bookmarks import location combobox. + Rename internal completion URLs to avoid confusion + v0.5.5: Fix name and text fields inversion in XBEL folder import Correct packing of cookie and nojs permission dialog. diff --git a/GNUmakefile.in b/GNUmakefile.in new file mode 100644 index 00000000..b1459a56 --- /dev/null +++ b/GNUmakefile.in @@ -0,0 +1,27 @@ +# Based on "http://iany.me/wiki/Makefile/" by "Ian Yang" licensed under "CC by 3.0" + +BUILD_FOLDER := _build + +CUSTOM_TARGETS := cmake + +# Do not try to use custom target when invoking external makefile +EXTERNAL_TARGETS := $(filter-out $(CUSTOM_TARGETS), $(MAKECMDGOALS)) + +# Call all targets using `Makefile` in build directory in one `make` command. +$(or $(lastword $(EXTERNAL_TARGETS)),all): + $(MAKE) -C $(BUILD_FOLDER) $(EXTERNAL_TARGETS) + +# If no targets are specified, use the dummy `all` target +.PHONY: $(EXTERNAL_TARGETS) all + +# Do nothing for all targets but last. Also quiet the message "Noting to be done on xxx" +$(filter-out $(lastword $(EXTERNAL_TARGETS)), $(EXTERNAL_TARGETS)): + @cd . + +cmake: $(BUILD_FOLDER) + cd $(BUILD_FOLDER) && cmake .. + +$(BUILD_FOLDER): + mkdir $(BUILD_FOLDER) + +.PHONY: cmake @@ -22,38 +22,45 @@ Join irc://irc.freenode.net/midori #midori on Freenode https://kiwiirc.com/clien * https://www.bountysource.com/#trackers/130181-midori Add a bounty for a feature or bug you'd like to support * https://translations.launchpad.net/midori/trunk/+pots/trunk Translate to your own language * https://github.com/eustasy/midori-browser.org/issues Report website bugs + * Write http://wiki.xfce.org/midori/tutorial your own extension - granted that's code, too, but maybe a little easier than hacking the core. ====== Build the code ====== -./waf configure --prefix=/usr -./waf build -sudo ./waf install +mkdir _build +cd _build +cmake -DCMAKE_INSTALL_PREFIX=/usr .. +make +sudo make install + +//Advanced Tip: Pass "-G Ninja" to cmake to use http://martine.github.io/ninja/ Ninja instead of make (usually packaged as ninja or ninja-build).// + +If using GTK+3 you'll want to add -DUSE_GTK3=1 to the cmake command line. Midori can be **run without being installed**. -_build/default/midori/midori +_build/midori/midori You can use a **temporary folder for testing** without affecting normal settings -_build/default/midori/midori -c /tmp/midoridev +_build/midori/midori -c /tmp/midoridev You'll want to **unit test** the code if you're testing a new version or contributed your own changes: -xvfb-run ./waf check +xvfb-run make check Automated daily builds in Launchpad (https://launchpad.net/~elementary-os/+archive/daily ppa:elementary-os/daily and https://launchpad.net/~midori/+archive/midori-dev ppa:midori/midori-dev) run these tests as well. ====== Debugging issues ====== Testing an installed release may reveal crashers or memory corruption which require investigating from a local build and obtaining a stacktrace (backtrace, crash log). -_build/default/midori/midori -g [OPTIONAL ARGUMENTS] +_build/midori/midori -g [OPTIONAL ARGUMENTS] If the problem is a warning, not a crash GLib has a handy feature -env G_DEBUG=all _build/default/midori/midori -g +env G_DEBUG=all _build/midori/midori -g For more specific debugging output, depending on the feature in question you may use -env MIDORI_DEBUG=help _build/default/midori/midori +env MIDORI_DEBUG=help _build/midori/midori To verify a regression you might need to revert a particular change: @@ -188,7 +195,7 @@ As of Midori 0.5.4 the formula is: | soup | 2.38.1 | 2.40 | | webkit | 1.8.3-1.fc17 | 1.10.0-0ubuntu1 | ====== Midori with(out) Granite ====== -When built with Granite (--enable-granite) there're a few key differences: +When built with Granite (-DUSE_GRANITE=1 or --enable-granite) there're a few key differences: * Preferences uses a http://valadoc.elementaryos.org/Granite/Granite.Widgets.StaticNotebook.html Granite.Widgets.StaticNotebook * URL completion styling is slightly different * Clear Private Data uses **Granite.Widgets.LightWindow** @@ -204,25 +211,26 @@ For a native build yum install libsoup-devel webkitgtk3-devel sqlite-devel For cross-compilation -yum install mingw{32,64}-webkitgtk3 mingw{32,64}-glib-networking mingw{32,64}-gdb +yum install mingw{32,64}-webkitgtk3 mingw{32,64}-glib-networking mingw{32,64}-gdb mingw{32,64}-gstreamer-plugins-good Packages needed when assembling the archive - yum install faenza-icon-theme p7zip mingw32-nsis + yum install faenza-icon-theme p7zip mingw32-nsis greybird-gtk3-theme Installing those should get you the packages needed to successfully build and develop Midori for Win32. - ===== Building ===== For 32-bit builds: -mingw32-env -./configure --enable-gtk3 --prefix=/usr/i686-w64-mingw32/sys-root/mingw/ +mkdir _mingw32 +cd _mingw32 +mingw32-cmake .. -DUSE_ZEITGEIST=0 -DUSE_GTK3=1 -DCMAKE_INSTALL_PREFIX=/usr/i686-w64-mingw32/sys-root/mingw -DCMAKE_VERBOSE_MAKEFILE=0 make sudo make install For 64-bit builds: -mingw64-env -./configure --enable-gtk3 --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw/ +mkdir _mingw64 +cd _mingw64 +mingw64-cmake .. -DUSE_ZEITGEIST=0 -DUSE_GTK3=1 -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32/sys-root/mingw -DCMAKE_VERBOSE_MAKEFILE=0 make sudo make install @@ -231,14 +239,13 @@ Once built and tested you can assemble the Midori archive with a helper script env MINGW_PREFIX="/usr/i686-w64-mingw32/sys-root/mingw" ./win32/makedist/makedist.midori 64-bit build: env MINGW_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw/" ./win32/makedist/makedist.midori x64 - ===== Testing ===== For testing your changes unfortuantely a real system is needed because Midori and WebKitGTK+ don't work properly under Wine. Even if it works some problems are not visible when using Wine, but are present when running under a real Windows system and vice versa. One way around it is to virtualize Windows on a Linux host and mount your MinGW directories as a network drive or shared folder. ====== Jargon ====== - * freeze: the 4th week of a 4 week release cycle, bug fixes only + * freeze: a period of bug fixes only eg. 4/2 cycle means 4 weeks of features and 2 weeks to focus on resolving existing problems * MR: merge request, a branch proposed for review * ninja: an internal tab, usually empty label, used for taking screenshots * fortress: user of an ancient release like 0.4.3 as found on Raspberry Pie, Debian, Ubuntu @@ -14,12 +14,12 @@ A number of extensions are included by default: * Managing cookies and scripts via NoJS and Cookie Security Manager. * Switching open tabs in a vertical panel or a popup window. -Requirements: GLib 2.32.3, GTK+ 2.24, WebkitGTK+ 1.8.3, libXML2, +Requirements: GLib 2.32.3, GTK+ 2.24, WebkitGTK+ 1.8.1, libXML2, libsoup 2.27.90, sqlite 3.0, Vala 0.16, libnotify Optional: GTK+ 3.0, gcr, Granite 0.2, WebKit2GTK+ 1.11.91/ 2.0.0 -For installation instructions read INSTALL. +For installation instructions read the file HACKING. Please report comments, suggestions and bugs to: https://bugs.launchpad.net/midori diff --git a/cmake/ContainTest.cmake b/cmake/ContainTest.cmake index 9f0c760b..5572b588 100644 --- a/cmake/ContainTest.cmake +++ b/cmake/ContainTest.cmake @@ -15,4 +15,27 @@ macro(contain_test test_name) TIMEOUT 42 ENVIRONMENT "${TEST_ENV}" ) + + add_custom_target("gdb-${test_name}" + COMMAND env ${TEST_ENV} gdb + --batch -ex 'set print thread-events off' + -ex 'run' -ex 'bt' + ${CMAKE_BINARY_DIR}/tests/${UNIT} + ) + + add_custom_target("valgrind-${test_name}" + COMMAND env ${TEST_ENV} valgrind + -q --leak-check=no --num-callers=4 + --show-possibly-lost=no + --undef-value-errors=yes + --track-origins=yes + ${CMAKE_BINARY_DIR}/tests/${UNIT} + ) + + add_custom_target("callgrind-${test_name}" + COMMAND env ${TEST_ENV} valgrind + --tool=callgrind + --callgrind-out-file=${UNIT}.callgrind + ${CMAKE_BINARY_DIR}/tests/${UNIT} + ) endmacro(contain_test) diff --git a/cmake/FindVala.cmake b/cmake/FindVala.cmake index 5af36f29..d6c9ca1c 100644 --- a/cmake/FindVala.cmake +++ b/cmake/FindVala.cmake @@ -1,12 +1,12 @@ # Copyright (C) 2013 Christian Dywan <christian@twotoasts.de> -find_program(VALA_EXECUTABLE NAMES valac) -if (NOT VALA_NOTFOUND) +find_program(VALA_EXECUTABLE NAMES $ENV{VALAC} valac) +if (VALA_EXECUTABLE) execute_process(COMMAND ${VALA_EXECUTABLE} "--version" OUTPUT_VARIABLE "VALA_VERSION") string(REPLACE "Vala " "" VALA_VERSION ${VALA_VERSION}) string(STRIP ${VALA_VERSION} VALA_VERSION) else () - message(FATAL_ERROR "valac not found") + message(FATAL_ERROR "valac not found - install Vala compiler or specify compiler name eg. VALAC=valac-0.20") endif () macro(vala_require VALA_REQUIRED) diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt index 028b9794..cf59514b 100644 --- a/config/CMakeLists.txt +++ b/config/CMakeLists.txt @@ -6,16 +6,18 @@ set (XDG_CONFIG_DIR "xdg/${CMAKE_PROJECT_NAME}") file (GLOB_RECURSE CONFIG_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *) list (REMOVE_ITEM CONFIG_FILES "CMakeLists.txt") +if (${CMAKE_INSTALL_PREFIX} STREQUAL "/usr") + set(CMAKE_INSTALL_SYSCONFDIR "/etc") +endif() + foreach (FILE ${CONFIG_FILES}) string (FIND ${FILE} "adblock" ADBLOCK_CONF) if (ADBLOCK_CONF GREATER -1) string (REPLACE "config" "" dirname ${FILE}) install (FILES ${FILE} DESTINATION "${CMAKE_INSTALL_SYSCONFDIR}/${XDG_CONFIG_DIR}/${dirname}") - message("${CMAKE_PROJECT_NAME}") else () install (FILES ${FILE} DESTINATION "${CMAKE_INSTALL_SYSCONFDIR}/${XDG_CONFIG_DIR}") - message("${FILE}") endif () endforeach () @@ -1,157 +1,83 @@ #! /bin/sh - -# waf configure wrapper - -# Fancy colors used to beautify the output a bit. # -if [ "$NOCOLOR" ] ; then - NORMAL="" - BOLD="" - RED="" - YELLOW="" - GREEN="" -else - NORMAL="\033[0m" - BOLD="\033[1m" - RED="\033[91m" - YELLOW="\033[01;93m" - GREEN="\033[92m" -fi - -EXIT_SUCCESS=0 -EXIT_FAILURE=1 -EXIT_ERROR=2 -EXIT_BUG=10 - -CUR_DIR=$PWD - -#possible relative path -WORKINGDIR=`dirname $0` -cd $WORKINGDIR -#abs path -WORKINGDIR=`pwd` -cd $CUR_DIR - -# Checks for Python interpreter. Honours $PYTHON if set. Stores path to -# interpreter in $PYTHON. +# Copyright (C) 2013 Christian Dywan <christian@twotoasts.de> # -checkPython() -{ - if [ -z "$PYTHON" ] ; then - PYTHON=`which python2 2>/dev/null` - fi - if [ -z "$PYTHON" ] ; then - PYTHON=`which python 2>/dev/null` - fi - printf "Checking for Python\t\t\t: " - if [ ! -x "$PYTHON" ] ; then - printf $RED"not found!"$NORMAL"\n" - echo "Please make sure that the Python interpreter is available in your PATH" - echo "or invoke configure using the PYTHON flag, e.g." - echo "$ PYTHON=/usr/local/bin/python configure" - exit $EXIT_FAILURE - fi - printf $GREEN"$PYTHON"$NORMAL"\n" -} - -# Checks for WAF. Honours $WAF if set. Stores path to 'waf' in $WAF. -# Requires that $PYTHON is set. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. # -checkWAF() -{ - printf "Checking for WAF\t\t\t: " - #installed miniwaf in sourcedir - if [ -z "$WAF" ] ; then - if [ -f "${WORKINGDIR}/waf" ] ; then - WAF="${WORKINGDIR}/waf" - if [ ! -x "$WAF" ] ; then - chmod +x $WAF - fi - fi - fi - if [ -z "$WAF" ] ; then - if [ -f "${WORKINGDIR}/waf-light" ] ; then - ${WORKINGDIR}/waf-light --make-waf - WAF="${WORKINGDIR}/waf" - fi - fi - #global installed waf with waf->waf.py link - if [ -z "$WAF" ] ; then - WAF=`which waf 2>/dev/null` - fi - # neither waf nor miniwaf could be found - if [ ! -x "$WAF" ] ; then - printf $RED"not found"$NORMAL"\n" - echo "Go to http://code.google.com/p/waf/" - echo "and download a waf version" - exit $EXIT_FAILURE - else - printf $GREEN"$WAF"$NORMAL"\n" - fi - WAF="$PYTHON $WAF" -} - -# Generates a Makefile. Requires that $WAF is set. +# See the file COPYING for the full license text. +# +#~ Usage: +#~ ./configure [OPTIONS] +#~ Options: +#~ --prefix=PREFIX Installation prefix +#~ --enable-gtk3 Use GTK+3 +#~ --disable-zeitgeist Disable Zeitgeist history integration +#~ --enable-granite Fancy notebook and pop-overs +#~ --enable-apidocs API documentation +#~ +#~ Environment: +#~ VALAC if defined the valac executable to use, for example valac-0.16 # -generateMakefile() -{ - cat > Makefile << EOF -#!/usr/bin/make -f -# Waf Makefile wrapper -WAF_HOME=$CUR_DIR - -all: - @$WAF build - -all-debug: - @$WAF -v build - -all-progress: - @$WAF -p build - -install: - @if test -n "\$(DESTDIR)"; then \\ - $WAF install --destdir="\$(DESTDIR)"; \\ - else \\ - $WAF install; \\ - fi; - -.PHONY: install - -uninstall: - @if test -n "\$(DESTDIR)"; then \\ - $WAF uninstall --destdir="\$(DESTDIR)"; \\ - else \\ - $WAF uninstall; \\ - fi; - -clean: - @$WAF clean - -distclean: - @$WAF distclean - @-rm -rf _build - @-rm -f Makefile - -check: - @$WAF check - -dist: - @$WAF dist - -EOF -} -checkPython -checkWAF +if [ -z `command -v cmake` ]; then + echo Fatal: cmake not installed + exit 1 +fi -echo "calling waf configure with parameters" -$WAF configure $* || exit $EXIT_ERROR +while [ $# != 0 ]; do + case $1 in + --enable-gtk3) + ARGS="$ARGS -DUSE_GTK3=1";; + --disable-zeitgeist) + ARGS="$ARGS -DUSE_ZEITGEIST=0";; + --enable-granite) + ARGS="$ARGS -DUSE_GRANITE=1";; + --enable-apidocs) + ARGS="$ARGS -DUSE_APIDOCS=1";; + --extra-warnings) + ARGS="$ARGS -DEXTRA_WARNINGS=1";; + --prefix=*) + ARGS="$ARGS -DCMAKE_INSTALL_PREFIX=${1#*=}";; + *) + grep -e '^#~' $0 | sed s/#~// + exit + esac + shift +done + +BUILD_DIR="_build" + +if [ ! -f GNUmakefile ]; then + cp -v GNUmakefile.in GNUmakefile || exit 1 +fi -if [ -f "Makefile" ] ; then - echo "" -else - generateMakefile +# cmake was invoked in toplevel folder before +# clean up cmake generated build files to prevent conflicts +if [ -f CMakeCache.txt ]; then + echo + echo '####################################################################################' + echo 'CMake build files detected in toplevel folder !!' + echo 'Please always run "cmake" command from distinct folder when you use cmake yourself.' + echo '####################################################################################' + echo + echo 'Cleaning up...' + echo + + rm -fr $BUILD_DIR + rm CMakeCache.txt config.h Makefile + find . -iname CMakeFiles -type d|xargs rm -fr + find . -iname cmake_install.cmake -exec rm {} \; + find . -iname CTestTestfile.cmake -exec rm {} \; + + find . -iname *-folders -type d|xargs rm -fr + rm -fr data/logo-shade fi -exit $EXIT_SUCCESS +mkdir -p $BUILD_DIR && cd $BUILD_DIR || exit 1 +cmake $ARGS .. || exit 1 + +echo +echo "Configuring done, run \"make\" to compile" diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index 0f9cc739..9cef85a5 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -16,24 +16,26 @@ file(GLOB_RECURSE DATA_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *) list(REMOVE_ITEM DATA_FILES "CMakeLists.txt") foreach(FILE ${DATA_FILES}) - string(FIND ${FILE} "faq." FAQ_FILE) - string(FIND ${FILE} "midori." MIDORI_FILE) - string(FIND ${FILE} ".desktop" DESKTOP_FILE) - string(FIND ${FILE} ".appdata.xml" APPDATA_FILE) - string(FIND ${FILE} ".svg" SVG_FILE) - if (FAQ_FILE GREATER -1) + if (${FILE} MATCHES "faq.") install(FILES ${FILE} DESTINATION ${CMAKE_INSTALL_DOCDIR}) - elseif (DESKTOP_FILE GREATER -1 AND NOT WIN32) - string(SUBSTRING ${FILE} 0 ${DESKTOP_FILE} DESKTOP_ID) - INTLTOOL_MERGE_DESKTOP (${DESKTOP_ID} po) - elseif (APPDATA_FILE GREATER -1 AND NOT WIN32) - string(SUBSTRING ${FILE} 0 ${APPDATA_FILE} DESKTOP_ID) - INTLTOOL_MERGE_APPDATA (${DESKTOP_ID} po) - # install(FILES ${FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/appdata/) - elseif (SVG_FILE GREATER -1) - string(SUBSTRING ${FILE} 0 ${SVG_FILE} IMG_ID) + elseif (${FILE} MATCHES ".desktop") + if (NOT WIN32) + string(REPLACE ".desktop.in" "" DESKTOP_ID ${FILE}) + INTLTOOL_MERGE_DESKTOP (${DESKTOP_ID} po) + endif () + elseif (${FILE} MATCHES ".appdata.xml") + if (NOT WIN32) + string(REPLACE ".appdata.xml.in" "" DESKTOP_ID ${FILE}) + INTLTOOL_MERGE_APPDATA (${DESKTOP_ID} po) + endif () + elseif (${FILE} MATCHES "\\.svg$") + string(REPLACE ".svg" "" IMG_ID ${FILE}) SVG2PNG (${IMG_ID} "${CMAKE_INSTALL_DATADIR}/midori/res/") - elseif(MIDORI_FILE GREATER -1) + # These are being handled in add_executable for the "midori" binary + elseif (${FILE} MATCHES "\\.ico$") + elseif (${FILE} MATCHES "\\.rc$") + # This is only meant for testing, and not used in production + elseif (${FILE} MATCHES "\\.swf$") else() string(FIND ${FILE} "/" IS_DIR) if (IS_DIR GREATER -1) diff --git a/data/bookmarks/Create.sql b/data/bookmarks/Create.sql new file mode 100644 index 00000000..7500fc2c --- /dev/null +++ b/data/bookmarks/Create.sql @@ -0,0 +1,91 @@ +CREATE TABLE IF NOT EXISTS bookmarks +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + parentid INTEGER DEFAULT NULL, + title TEXT, + uri TEXT, + desc TEXT, + app INTEGER, + toolbar INTEGER, + pos_panel INTEGER, + pos_bar INTEGER, + created DATE DEFAULT CURRENT_TIMESTAMP, + last_visit DATE, + visit_count INTEGER DEFAULT 0, + nick TEXT, + + FOREIGN KEY(parentid) REFERENCES bookmarks(id) ON DELETE CASCADE +); + +/* trigger: insert panel position */ +CREATE TRIGGER IF NOT EXISTS bookmarkInsertPosPanel +AFTER INSERT ON bookmarks FOR EACH ROW +BEGIN UPDATE bookmarks SET pos_panel = ( +SELECT ifnull(MAX(pos_panel),0)+1 FROM bookmarks WHERE +(NEW.parentid IS NOT NULL AND parentid = NEW.parentid) +OR (NEW.parentid IS NULL AND parentid IS NULL)) +WHERE id = NEW.id; END; + +/* trigger: insert Bookmarkbar position */ +CREATE TRIGGER IF NOT EXISTS bookmarkInsertPosBar +AFTER INSERT ON bookmarks FOR EACH ROW WHEN NEW.toolbar=1 +BEGIN UPDATE bookmarks SET pos_bar = ( +SELECT ifnull(MAX(pos_bar),0)+1 FROM bookmarks WHERE +((NEW.parentid IS NOT NULL AND parentid = NEW.parentid) +OR (NEW.parentid IS NULL AND parentid IS NULL)) AND toolbar=1) +WHERE id = NEW.id; END; + +/* trigger: update panel position */ +CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosPanel +BEFORE UPDATE OF parentid ON bookmarks FOR EACH ROW +WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL) +AND NEW.parentid IS NOT OLD.parentid) OR +((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL) +AND NEW.parentid!=OLD.parentid) +BEGIN UPDATE bookmarks SET pos_panel = pos_panel-1 +WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) +OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_panel > OLD.pos_panel; +UPDATE bookmarks SET pos_panel = ( +SELECT ifnull(MAX(pos_panel),0)+1 FROM bookmarks +WHERE (NEW.parentid IS NOT NULL AND parentid = NEW.parentid) +OR (NEW.parentid IS NULL AND parentid IS NULL)) +WHERE id = OLD.id; END; + +/* trigger: update Bookmarkbar position */ +CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosBar0 +AFTER UPDATE OF parentid, toolbar ON bookmarks FOR EACH ROW +WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL) +AND NEW.parentid IS NOT OLD.parentid) +OR ((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL) +AND NEW.parentid!=OLD.parentid) OR (OLD.toolbar=1 AND NEW.toolbar=0) +BEGIN UPDATE bookmarks SET pos_bar = NULL WHERE id = NEW.id; +UPDATE bookmarks SET pos_bar = pos_bar-1 +WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) +OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_bar > OLD.pos_bar; END; + +/* trigger: update Bookmarkbar position */ +CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosBar1 +BEFORE UPDATE OF parentid, toolbar ON bookmarks FOR EACH ROW +WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL) +AND NEW.parentid IS NOT OLD.parentid) OR +((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL) +AND NEW.parentid!=OLD.parentid) OR (OLD.toolbar=0 AND NEW.toolbar=1) +BEGIN UPDATE bookmarks SET pos_bar = ( +SELECT ifnull(MAX(pos_bar),0)+1 FROM bookmarks WHERE +(NEW.parentid IS NOT NULL AND parentid = NEW.parentid) +OR (NEW.parentid IS NULL AND parentid IS NULL)) +WHERE id = OLD.id; END; + +/* trigger: delete panel position */ +CREATE TRIGGER IF NOT EXISTS bookmarkDeletePosPanel +AFTER DELETE ON bookmarks FOR EACH ROW +BEGIN UPDATE bookmarks SET pos_panel = pos_panel-1 +WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) +OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_panel > OLD.pos_panel; END; + +/* trigger: delete Bookmarkbar position */ +CREATE TRIGGER IF NOT EXISTS bookmarkDeletePosBar +AFTER DELETE ON bookmarks FOR EACH ROW WHEN OLD.toolbar=1 +BEGIN UPDATE bookmarks SET pos_bar = pos_bar-1 +WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) +OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_bar > OLD.pos_bar; END; diff --git a/data/bookmarks/Import_old_db_bookmarks.sql b/data/bookmarks/Import_old_db_bookmarks.sql new file mode 100644 index 00000000..5e023cda --- /dev/null +++ b/data/bookmarks/Import_old_db_bookmarks.sql @@ -0,0 +1,6 @@ +INSERT INTO main.bookmarks (parentid, title, uri, desc, app, toolbar) +SELECT NULL AS parentid, title, uri, desc, app, toolbar +FROM old_db.bookmarks; +UPDATE main.bookmarks SET parentid = ( +SELECT id FROM main.bookmarks AS b1 WHERE b1.title = ( +SELECT folder FROM old_db.bookmarks WHERE title = main.bookmarks.title)); diff --git a/data/error.html b/data/error.html index 863d920a..73cae7a4 100644 --- a/data/error.html +++ b/data/error.html @@ -17,7 +17,7 @@ {suggestions} </div> <form method="GET" action="{uri}" id="button"> - <button type="submit" onclick="location.reload(); return false;" autofocus="true" > + <button type="submit" onclick="location.reload(); return false;" {autofocus}> <img style="{hide-button-images}" src="stock://gtk-refresh"/> <span>{tryagain}</span> </button> diff --git a/data/faq.html b/data/faq.html index 44a6479a..3f557a1e 100644 --- a/data/faq.html +++ b/data/faq.html @@ -4,21 +4,21 @@ <meta charset="utf-8" /> <title>midori:faq</title> <meta name="generator" content="DokuWiki"/> -<meta name="robots" content="noindex,nofollow"/> -<meta name="date" content="2013-08-13T17:48:26+0200"/> +<meta name="robots" content="index,follow"/> +<meta name="date" content="2013-12-20T22:56:39+0100"/> <meta name="keywords" content="midori,faq"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="Xfce Wiki"/> <link rel="start" href="/"/> <link rel="contents" href="/midori/faq?do=index" title="Sitemap"/> -<link rel="alternate" type="application/rss+xml" title="Recent Changes" href="/feed.php"/> -<link rel="alternate" type="application/rss+xml" title="Current Namespace" href="/feed.php?mode=list&ns=midori"/> +<link rel="alternate" type="application/rss+xml" title="Recent changes" href="/feed.php"/> +<link rel="alternate" type="application/rss+xml" title="Current namespace" href="/feed.php?mode=list&ns=midori"/> <link rel="alternate" type="text/html" title="Plain HTML" href="/_export/xhtml/midori/faq"/> <link rel="alternate" type="text/plain" title="Wiki Markup" href="/_export/raw/midori/faq"/> <link rel="canonical" href="http://wiki.xfce.org/midori/faq"/> <link rel="stylesheet" href="faq.css" /> <script type="text/javascript">/*<![CDATA[*/var NS='midori';var JSINFO = {"id":"midori:faq","namespace":"midori"}; /*!]]>*/</script> -<script type="text/javascript" charset="utf-8" src="/lib/exe/js.php?tseed=1371413028"></script> +<script type="text/javascript" charset="utf-8" src="/lib/exe/js.php?tseed=34912f2e1a4daa1bfa9afb3096df0197"></script> </head> <body> <div class="dokuwiki export"> @@ -169,6 +169,18 @@ Ideally Google would follow <a href="http://code.google.com/p/doctype/wiki/Artic The set of themed icons Midori can use is very limited. For instance icons for a new tab or the throbber are not guaranteed to be available. To fix this, install a Freedesktop.org <abbr title="specification">spec</abbr> compliant icon theme, such as Elementary, Faenza, Buuf or GNOME. </p> +<p> +if you need to set a custom path for these to be “searched in” (Kiosks and embedded devices for example): +</p> + +<p> +XDG_DATA_HOME=/path/to/location +</p> + +<p> +will add an extra path for the icons/.. directory +</p> + </div> <h4 id="tweaking_midori_on_the_gtk_level">Tweaking Midori on the Gtk level</h4> @@ -238,7 +250,7 @@ export XDG_CACHE_HOME=/dev/shm </p> </div> -<!-- EDIT3 SECTION "Common problems" [1189-3545] --> +<!-- EDIT3 SECTION "Common problems" [1189-3737] --> <h2 class="sectionedit4" id="security_features">Security features</h2> <div class="level2"> @@ -283,7 +295,7 @@ No key store is available or it's incorrectly setup. By default GNOME keyri </p> </div> -<!-- EDIT4 SECTION "Security features" [3546-4763] --> +<!-- EDIT4 SECTION "Security features" [3738-4955] --> <h2 class="sectionedit5" id="flash_doesn_t_work">Flash doesn't work</h2> <div class="level2"> @@ -322,9 +334,11 @@ You can either run that above line and run Midori in the same terminal afterward <p> nspluginwrapper is a program that runs Flash and other Netscape plugins in a separate process. So a crash can't crash the whole browser and Flash, which is GTK+2 can run in GTK+3. </p> -<pre class="code bash"><span class="kw2">sudo</span> <span class="kw2">apt-get install</span> flashplugin-installer nspluginwrapper -<span class="kw2">sudo</span> nspluginwrapper <span class="re5">-i</span> <span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>flashplugin-installer<span class="sy0">/</span>libflashplayer.so -nspluginwrapper <span class="re5">-v</span> <span class="re5">-a</span> <span class="re5">-n</span> <span class="re5">-i</span></pre> +<pre class="code bash"><span class="kw2">sudo</span> <span class="kw2">apt-get install</span> nspluginwrapper +<span class="co0"># On Debian/ Ubuntu - on other systems http://get.adobe.com/de/flashplayer/</span> +<span class="kw2">sudo</span> <span class="kw2">apt-get install</span> flashplugin-installer +<span class="co0"># cd into the folder where the plugin was installed</span> +nspluginwrapper <span class="re5">-v</span> <span class="re5">-a</span> <span class="re5">-n</span> <span class="re5">-i</span> libflashplayer.so</pre> <p> ~/.mozilla can also be used with Adobe's tarball if system-wide install is not an option. The approach is confirmed to work with x86-64 as well. @@ -612,12 +626,12 @@ Most settings listed at <a href="http://webkitgtk.org/reference/webkitgtk/stable </p> </div> -<!-- EDIT5 SECTION "Flash doesn't work" [4764-13226] --> +<!-- EDIT5 SECTION "Flash doesn't work" [4956-13512] --> <h1 class="sectionedit6" id="privacy">Privacy</h1> <div class="level1"> </div> -<!-- EDIT6 SECTION "Privacy" [13227-13249] --> +<!-- EDIT6 SECTION "Privacy" [13513-13535] --> <h2 class="sectionedit7" id="blacklist_cookies">Blacklist cookies</h2> <div class="level2"> @@ -643,7 +657,7 @@ The feature is currently experimental and will change in future versions. </p> </div> -<!-- EDIT7 SECTION "Blacklist cookies" [13250-13786] --> +<!-- EDIT7 SECTION "Blacklist cookies" [13536-14072] --> <h2 class="sectionedit8" id="adblock">Adblock</h2> <div class="level2"> @@ -652,12 +666,12 @@ The Advertisement Blocker can be activated under Extensions. It uses the same li </p> </div> -<!-- EDIT8 SECTION "Adblock" [13787-14042] --> +<!-- EDIT8 SECTION "Adblock" [14073-14328] --> <h1 class="sectionedit9" id="modes">Modes</h1> <div class="level1"> </div> -<!-- EDIT9 SECTION "Modes" [14043-14063] --> +<!-- EDIT9 SECTION "Modes" [14329-14349] --> <h2 class="sectionedit10" id="web_applications">Web Applications</h2> <div class="level2"> @@ -678,7 +692,7 @@ There are two closely related features to open websites as dedicated windows of </p> </div> -<!-- EDIT10 SECTION "Web Applications" [14064-14580] --> +<!-- EDIT10 SECTION "Web Applications" [14350-14866] --> <h2 class="sectionedit11" id="private_browsing">Private Browsing</h2> <div class="level2"> @@ -704,7 +718,7 @@ The same options available to -a/ –app can be used for private browsing mode. </p> </div> -<!-- EDIT11 SECTION "Private Browsing" [14581-15500] --> +<!-- EDIT11 SECTION "Private Browsing" [14867-15786] --> <h2 class="sectionedit12" id="portable_modewin32">Portable mode/ Win32</h2> <div class="level2"> @@ -713,7 +727,7 @@ On Windows builds, -P/ –portable causes all data to be written to the “profi </p> </div> -<!-- EDIT12 SECTION "Portable mode/ Win32" [15501-15814] --> +<!-- EDIT12 SECTION "Portable mode/ Win32" [15787-16100] --> <h2 class="sectionedit13" id="kiosk_mode">Kiosk mode</h2> <div class="level2"> @@ -745,7 +759,7 @@ Any links outside end up in an error page. All images and other files won't </p> </div> -<!-- EDIT13 SECTION "Kiosk mode" [15815-16852] --> +<!-- EDIT13 SECTION "Kiosk mode" [16101-17138] --> <h2 class="sectionedit14" id="always_open_midori_in_fullscreen">Always open Midori in Fullscreen</h2> <div class="level2"> @@ -778,7 +792,7 @@ If for whatever reason this isn't enough, <a href="https://live.gnome.org/D </p> </div> -<!-- EDIT14 SECTION "Always open Midori in Fullscreen" [16853-17380] --> +<!-- EDIT14 SECTION "Always open Midori in Fullscreen" [17139-17666] --> <h2 class="sectionedit15" id="overriding_settings_and_loading_extensions">Overriding settings and loading extensions</h2> <div class="level2"> @@ -795,7 +809,7 @@ As of Midori 0.5.0 the –execute command line switch got more powerful: </p> </div> -<!-- EDIT15 SECTION "Overriding settings and loading extensions" [17381-17588] --> +<!-- EDIT15 SECTION "Overriding settings and loading extensions" [17667-17874] --> <h1 class="sectionedit16" id="proxy_servers">Proxy servers</h1> <div class="level1"> @@ -879,7 +893,7 @@ server_port = 5555</pre> </ol> </div> -<!-- EDIT16 SECTION "Proxy servers" [17589-19410] --> +<!-- EDIT16 SECTION "Proxy servers" [17875-19696] --> <h1 class="sectionedit17" id="keyboard_hotkeys">Keyboard Hotkeys</h1> <div class="level1"> @@ -961,7 +975,7 @@ When using Ctrl+f to bring up Find, use Ctrl+f again or ESC. When using ”/” </p> </div> -<!-- EDIT17 SECTION "Keyboard Hotkeys" [19411-20743] --> +<!-- EDIT17 SECTION "Keyboard Hotkeys" [19697-21029] --> <h1 class="sectionedit18" id="mouse_gestures">Mouse Gestures</h1> <div class="level1"> @@ -995,7 +1009,7 @@ Additionally, there are programs allowing mouse gestures system-wide, for exampl </p> </div> -<!-- EDIT18 SECTION "Mouse Gestures" [20744-21676] --> +<!-- EDIT18 SECTION "Mouse Gestures" [21030-21962] --> <h1 class="sectionedit19" id="user_scripts_and_styles">User scripts and styles</h1> <div class="level1"> @@ -1056,7 +1070,7 @@ You can also use <a href="http://rightfootin.blogspot.com/2009/04/flashblock-wan </p> </div> -<!-- EDIT19 SECTION "User scripts and styles" [21677-24231] --> +<!-- EDIT19 SECTION "User scripts and styles" [21963-24517] --> <h2 class="sectionedit20" id="user_styles">User styles</h2> <div class="level2"> @@ -1102,23 +1116,41 @@ This user css is used to display the corresponding url when a link is hovered. T <p> Customize as needed: </p> -<pre class="code">a[href]:hover { - text-decoration: none !important; - } - a[href]:hover:after { - content: attr(href); - position: fixed; left: 4px; bottom: 4px; - padding: 0 6px !important; - max-width: 95%; overflow: hidden; - white-space: nowrap; text-overflow: ellipsis; - font:10pt sans-serif !important; text-shadow: 0 0 12px white; - background-color: ButtonFace !important; color: ButtonText !important; - opacity: 0.8; outline: ButtonFace solid thick; - z-index: 9999; - }</pre> - -</div> -<!-- EDIT20 SECTION "User styles" [24232-26469] --> +<pre class="code css">a<span class="br0">[</span>href<span class="br0">]</span><span class="re2">:hover </span><span class="br0">{</span> + <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span> !important<span class="sy0">;</span> + <span class="br0">}</span> + a<span class="br0">[</span>href<span class="br0">]</span><span class="re2">:hover</span><span class="re2">:after </span><span class="br0">{</span> + <span class="kw1">content</span><span class="sy0">:</span> attr<span class="br0">(</span>href<span class="br0">)</span><span class="sy0">;</span> + <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">fixed</span><span class="sy0">;</span> <span class="kw1">left</span><span class="sy0">:</span> <span class="re3">4px</span><span class="sy0">;</span> <span class="kw1">bottom</span><span class="sy0">:</span> <span class="re3">4px</span><span class="sy0">;</span> + <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span> <span class="re3">6px</span> !important<span class="sy0">;</span> + <span class="kw1">max-width</span><span class="sy0">:</span> <span class="re3">95%</span><span class="sy0">;</span> <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span> + <span class="kw1">white-space</span><span class="sy0">:</span> <span class="kw2">nowrap</span><span class="sy0">;</span> text-overflow<span class="sy0">:</span> ellipsis<span class="sy0">;</span> + <span class="kw1">font</span><span class="sy0">:</span><span class="re3">10pt</span> <span class="kw2">sans-serif</span> !important<span class="sy0">;</span> <span class="kw1">text-shadow</span><span class="sy0">:</span> <span class="nu0">0</span> <span class="nu0">0</span> <span class="re3">12px</span> <span class="kw2">white</span><span class="sy0">;</span> + <span class="kw1">background-color</span><span class="sy0">:</span> ButtonFace !important<span class="sy0">;</span> <span class="kw1">color</span><span class="sy0">:</span> ButtonText !important<span class="sy0">;</span> + opacity<span class="sy0">:</span> <span class="nu0">0.8</span><span class="sy0">;</span> <span class="kw1">outline</span><span class="sy0">:</span> ButtonFace <span class="kw2">solid</span> <span class="kw2">thick</span><span class="sy0">;</span> + <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">9999</span><span class="sy0">;</span> + <span class="br0">}</span></pre> + +</div> + +<h4 id="tweaking_fonts_via_css">Tweaking fonts via CSS</h4> +<div class="level4"> + +<p> +If changing system-wide font settings isn't bringing the desired results or rendering should be tweaked only for websites <abbr title="Cascading Style Sheets">CSS</abbr> can be an alternative. Add the following to <strong>~/.local/share/midori/styles</strong>, then restart Midori and make sure that it is enabled Tools → Userstyles. +</p> + +<p> +Customize as needed: +</p> +<pre class="code css"><span class="sy0">*</span> <span class="br0">{</span> + font-smooth<span class="sy0">:</span><span class="kw2">always</span><span class="sy0">;</span> + -webkit-font-smoothing<span class="sy0">:</span> antialiased<span class="sy0">;</span> + text-rendering<span class="sy0">:</span> optimizeLegibility +<span class="br0">}</span></pre> + +</div> +<!-- EDIT20 SECTION "User styles" [24518-27222] --> <h2 class="sectionedit21" id="understanding_webkit_version_numbers">Understanding WebKit Version Numbers</h2> <div class="level2"> @@ -1156,6 +1188,6 @@ Midori's support for WebKit2 is still provisional, and likely unsuitable fo </p> </div> -<!-- EDIT21 SECTION "Understanding WebKit Version Numbers" [26470-] --></div> +<!-- EDIT21 SECTION "Understanding WebKit Version Numbers" [27223-] --></div> </body> </html> diff --git a/data/flummi/Create.sql b/data/flummi/Create.sql new file mode 100644 index 00000000..e9efc421 --- /dev/null +++ b/data/flummi/Create.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS tasks +( + id INTEGER PRIMARY KEY, + once INTEGER DEFAULT 1, + command TEXT DEFAULT NULL +); diff --git a/data/gtk3.css b/data/gtk3.css index e6353665..9a95489c 100644 --- a/data/gtk3.css +++ b/data/gtk3.css @@ -5,6 +5,7 @@ -GtkWidget-focus-line-width: 0; -GtkWidget-focus-padding: 0; padding: 0; + border-width: 1px 1px 0 0; } GtkOverlay > * { diff --git a/data/midori.appdata.xml.in b/data/midori.appdata.xml.in index a30d9504..3c14a435 100644 --- a/data/midori.appdata.xml.in +++ b/data/midori.appdata.xml.in @@ -1,4 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright 2013 Christian Dywan --> <application> <id type="desktop">midori.desktop</id> <licence>CC0</licence> @@ -10,15 +11,14 @@ engines and open tabs out of the box. Web developers can use the powerful web inspector that is a part of WebKit. Individual pages can easily be turned into web apps and new profiles can be created on demand. </p> -<p>A number of extensions are included by default: +<p>A number of extensions are included by default:</p> <ul> - <li>Adblock with support for ABP filter lists and custom rules is built-in.</li> - <li>You can download files with Aria2 or SteadyFlow.</li> - <li>User scripts and styles support a la Greasemonkey.</li> - <li>Managing cookies and scripts via NoJS and Cookie Security Manager.</li> - <li>Switching open tabs in a vertical panel or a popup window.</li> + <li>Adblock with support for ABP filter lists and custom rules is built-in</li> + <li>You can download files with Aria2 or SteadyFlow</li> + <li>User scripts and styles support a la Greasemonkey</li> + <li>Managing cookies and scripts via NoJS and Cookie Security Manager</li> + <li>Switching open tabs in a vertical panel or a popup window</li> </ul> -</p> </description> <url type="homepage">http://www.midori-browser.org/</url> <screenshots> diff --git a/data/tabby/Update1.sql b/data/tabby/Update1.sql new file mode 100644 index 00000000..26b72103 --- /dev/null +++ b/data/tabby/Update1.sql @@ -0,0 +1,4 @@ +ALTER TABLE tabs ADD sorting REAL DEFAULT 0; + +CREATE INDEX sorting on tabs (sorting ASC); +CREATE INDEX tstamp on tabs (tstamp ASC); diff --git a/docs/api/wscript_build b/docs/api/wscript_build deleted file mode 100644 index df546b18..00000000 --- a/docs/api/wscript_build +++ /dev/null @@ -1,38 +0,0 @@ -#! /usr/bin/env python -# WAF build script for midori -# This file is licensed under the terms of the expat license, see the file EXPAT. - -import pproc as subprocess -import os -import Utils - -blddir = '_build' # recognized by ack - -for module in ('midori', 'katze'): - try: - if not os.access (blddir, os.F_OK): - Utils.check_dir (blddir) - if not os.access (blddir + '/docs', os.F_OK): - Utils.check_dir (blddir + '/docs') - if not os.access (blddir + '/docs/api', os.F_OK): - Utils.check_dir (blddir + '/docs/api') - subprocess.call (['gtkdoc-scan', '--module=' + module, - '--source-dir=' + module, '--output-dir=' + blddir + '/docs/api/' + module, - '--rebuild-sections', '--rebuild-types']) - os.chdir (blddir + '/docs/api/' + module) - subprocess.call (['gtkdoc-mktmpl', '--module=' + module, - '--output-dir=.' + module]) - subprocess.call (['gtkdoc-mkdb', '--module=' + module, - '--source-dir=.', '--output-dir=xml', - '--source-suffixes=c,h', '--output-format=xml', - '--default-includes=%s/%s.h' % (module, module), - '--sgml-mode', '--main-sgml-file=%s.sgml' % module]) - if not os.access ('html', os.F_OK): - Utils.check_dir ('html') - os.chdir ('html') - subprocess.call (['gtkdoc-mkhtml', module, '../%s.sgml' % module]) - Utils.pprint ('YELLOW', "Created documentation for %s." % module) - os.chdir ('../../../../..') - except Exception, msg: - print msg - Utils.pprint ('RED', "Failed to create documentation for %s." % module) diff --git a/extensions/adblock.c b/extensions/adblock.c index 71fd4f87..de5ec2bd 100644 --- a/extensions/adblock.c +++ b/extensions/adblock.c @@ -647,7 +647,7 @@ adblock_open_preferences_cb (MidoriExtension* extension) adblock_show_preferences_dialog (extension, NULL); } -static inline gint +static gint adblock_check_rule (GRegex* regex, const gchar* patt, const gchar* req_uri, @@ -670,7 +670,7 @@ adblock_check_rule (GRegex* regex, return TRUE; } -static inline gboolean +static gboolean adblock_is_matched_by_pattern (const gchar* req_uri, const gchar* page_uri) { @@ -689,7 +689,7 @@ adblock_is_matched_by_pattern (const gchar* req_uri, return FALSE; } -static inline gboolean +static gboolean adblock_is_matched_by_key (const gchar* req_uri, const gchar* page_uri) { @@ -1073,8 +1073,6 @@ adblock_app_add_browser_cb (MidoriApp* app, GtkWidget* statusbar; GtkWidget* image; GList* children; - GtkWidget* view; - gint i; statusbar = katze_object_get_object (browser, "statusbar"); image = NULL; @@ -1236,7 +1234,7 @@ adblock_compile_regexp (GString* gpatt, } } -static inline gchar* +static gchar* adblock_add_url_pattern (gchar* prefix, gchar* type, gchar* line) @@ -1295,7 +1293,7 @@ adblock_add_url_pattern (gchar* prefix, return g_string_free (format_patt, should_free); } -static inline void +static void adblock_frame_add (gchar* line) { const gchar* separator = " , "; @@ -1329,7 +1327,7 @@ adblock_update_css_hash (gchar* domain, g_hash_table_insert (blockcssprivate, g_strdup (domain), g_strdup (value)); } -static inline void +static void adblock_frame_add_private (const gchar* line, const gchar* sep) { @@ -1382,7 +1380,6 @@ adblock_parse_line (gchar* line) * Block URL: * http://example.com/ads/banner123.gif * http://example.com/ads/banner*.gif - * http://example.com/ads/* * Partial match for "ad": * *ad* * ad @@ -1544,7 +1541,9 @@ adblock_file_is_up_to_date (gchar* path) for (i = 0; i <= 15; i++) { - fgets (line, 2000, file); + if (!fgets (line, 2000, file)) + break; + if (strncmp ("! Expires", line, 9) == 0) { gchar** parts = g_strsplit (line, " ", 4); @@ -1714,7 +1713,6 @@ adblock_deactivate_cb (MidoriExtension* extension, MidoriBrowser* browser) { GList* children; - GtkWidget* view; MidoriApp* app = midori_extension_get_app (extension); MidoriWebSettings* settings = katze_object_get_object (app, "settings"); diff --git a/extensions/colorful-tabs.c b/extensions/colorful-tabs.c index 21a18ff3..a81950c4 100644 --- a/extensions/colorful-tabs.c +++ b/extensions/colorful-tabs.c @@ -12,15 +12,15 @@ #include <midori/midori.h> -static GdkColor -get_foreground_color_for_GdkColor (GdkColor color) +static void +get_foreground_color_for_GdkColor (GdkColor* color, + GdkColor* fgcolor) { - GdkColor fgcolor; gfloat brightness, r, g, b; - r = color.red / 255; - g = color.green / 255; - b = color.blue / 255; + r = color->red / 255; + g = color->green / 255; + b = color->blue / 255; /* For math used see algorithms for converting from rgb to yuv */ brightness = 0.299 * r + 0.587 * g + 0.114 * b; @@ -28,82 +28,75 @@ get_foreground_color_for_GdkColor (GdkColor color) /* Ensure high contrast by enforcing black/ white text colour. */ /* Brigthness (range 0-255) equals value of y from YUV color space. */ if (brightness < 128) - gdk_color_parse ("white", &fgcolor); + gdk_color_parse ("white", fgcolor); else - gdk_color_parse ("black", &fgcolor); - - return fgcolor; + gdk_color_parse ("black", fgcolor); } -static GdkColor adjust_brightness (GdkColor color) +static void +adjust_brightness (GdkColor* color) { guint dark_grey = 137 * 255; guint adjustment = 78 * 255; guint blue = 39 * 255; guint readjust = 19 * 255; - if ((color.red < dark_grey) - && (color.green < dark_grey) - && (color.blue < dark_grey)) + if ((color->red < dark_grey) + && (color->green < dark_grey) + && (color->blue < dark_grey)) { - color.red += adjustment; - color.green += adjustment; - color.blue += adjustment; + color->red += adjustment; + color->green += adjustment; + color->blue += adjustment; } - if (color.red < blue) - color.red = readjust; + if (color->red < blue) + color->red = readjust; else - color.red -= readjust; + color->red -= readjust; - if (color.blue < blue) - color.blue = readjust; + if (color->blue < blue) + color->blue = readjust; else - color.blue -= readjust; + color->blue -= readjust; - if (color.green < blue) - color.green = readjust; + if (color->green < blue) + color->green = readjust; else - color.green -= readjust; - - return color; + color->green -= readjust; } -static GdkColor -view_get_bgcolor_for_favicon (GdkPixbuf* icon) +static void +view_get_bgcolor_for_favicon (GdkPixbuf* icon, + GdkColor* color) { - GdkColor color; GdkPixbuf* newpix; guchar* pixels; newpix = gdk_pixbuf_scale_simple (icon, 1, 1, GDK_INTERP_BILINEAR); pixels = gdk_pixbuf_get_pixels (newpix); - color.red = pixels[0] * 255; - color.green = pixels[1] * 255; - color.blue = pixels[2] * 255; - - color = adjust_brightness (color); + color->red = pixels[0] * 255; + color->green = pixels[1] * 255; + color->blue = pixels[2] * 255; - return color; + adjust_brightness (color); } -static GdkColor -view_get_bgcolor_for_hostname (gchar* hostname) +static void +view_get_bgcolor_for_hostname (gchar* hostname, + GdkColor* color) { gchar* hash, *colorstr; - GdkColor color; hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, hostname, 1); colorstr = g_strndup (hash, 6 + 1); colorstr[0] = '#'; - gdk_color_parse (colorstr, &color); + gdk_color_parse (colorstr, color); g_free (hash); g_free (colorstr); - color = adjust_brightness (color); - - return color; + adjust_brightness (color); } static void @@ -124,11 +117,11 @@ colorful_tabs_view_notify_uri_cb (MidoriView* view, GdkPixbuf* icon = midori_view_get_icon (view); if (icon) - color = view_get_bgcolor_for_favicon (icon); + view_get_bgcolor_for_favicon (icon, &color); else - color = view_get_bgcolor_for_hostname (hostname); + view_get_bgcolor_for_hostname (hostname, &color); - fgcolor = get_foreground_color_for_GdkColor (color); + get_foreground_color_for_GdkColor (&color, &fgcolor); midori_view_set_colors (view, &fgcolor, &color); g_free (hostname); @@ -158,7 +151,6 @@ colorful_tabs_deactivate_cb (MidoriExtension* extension, MidoriBrowser* browser) { GList* children; - GtkWidget* view; MidoriApp* app = midori_extension_get_app (extension); g_signal_handlers_disconnect_by_func ( @@ -237,8 +229,8 @@ void test_colour_for_hostname (void) guint i; for (i = 0; i < G_N_ELEMENTS (items); i++) { - color = view_get_bgcolor_for_hostname ((gchar*)items[i].host); - fgcolor = get_foreground_color_for_GdkColor (color); + view_get_bgcolor_for_hostname ((gchar*)items[i].host, &color); + get_foreground_color_for_GdkColor (&color, &fgcolor); g_assert_cmpstr (items[i].color, ==, gdk_color_to_string (&color)); g_assert_cmpstr (items[i].fgcolor, ==, gdk_color_to_string (&fgcolor)); diff --git a/extensions/cookie-permissions/cookie-permission-manager-preferences-window.c b/extensions/cookie-permissions/cookie-permission-manager-preferences-window.c index a6163fa0..2546ab1b 100644 --- a/extensions/cookie-permissions/cookie-permission-manager-preferences-window.c +++ b/extensions/cookie-permissions/cookie-permission-manager-preferences-window.c @@ -46,14 +46,14 @@ struct _CookiePermissionManagerPreferencesWindowPrivate GtkWidget *editingCombo; GtkWidget *deleteButton; GtkWidget *deleteAllButton; - GtkWidget *askForUnknownPolicyCheckbox; + GtkWidget *unknownPolicyCombo; GtkWidget *addDomainEntry; GtkWidget *addDomainPolicyCombo; GtkWidget *addDomainButton; gint signalManagerChangedDatabaseID; - gint signalManagerAskForUnknownPolicyID; - gint signalAskForUnknownPolicyID; + gint signalManagerUnknownPolicyID; + gint signalUnknownPolicyID; }; enum @@ -315,35 +315,43 @@ static void _cookie_permission_manager_preferences_window_manager_database_chang return; } -/* Ask-for-unknown-policy in manager changed or check-box changed */ -static void _cookie_permission_manager_preferences_window_manager_ask_for_unknown_policy_changed(CookiePermissionManagerPreferencesWindow *self, - GParamSpec *inSpec, - gpointer inUserData) +/* unknown-policy in manager changed or drop-down changed */ +static void _cookie_permission_manager_preferences_window_manager_unknown_policy_changed(CookiePermissionManagerPreferencesWindow *self, + GParamSpec *inSpec, + gpointer inUserData) { CookiePermissionManagerPreferencesWindowPrivate *priv=self->priv; CookiePermissionManager *manager=COOKIE_PERMISSION_MANAGER(inUserData); - gboolean doAsk; + CookiePermissionManagerPolicy policy; - /* Get new ask-for-unknown-policy value */ - g_object_get(manager, "ask-for-unknown-policy", &doAsk, NULL); + /* Get new unknown-policy value */ + g_object_get(manager, "unknown-policy", &policy, NULL); - /* Set toogle in widget (but block signal for toggle) */ - g_signal_handler_block(priv->askForUnknownPolicyCheckbox, priv->signalAskForUnknownPolicyID); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->askForUnknownPolicyCheckbox), doAsk); - g_signal_handler_unblock(priv->askForUnknownPolicyCheckbox, priv->signalAskForUnknownPolicyID); + /* Set value in combobox (blocking signal to avoid loops) */ + g_signal_handler_block(priv->unknownPolicyCombo, priv->signalUnknownPolicyID); + gtk_combo_box_set_active(GTK_COMBO_BOX(priv->unknownPolicyCombo), policy); + g_signal_handler_unblock(priv->unknownPolicyCombo, priv->signalUnknownPolicyID); } -static void _cookie_permission_manager_preferences_window_ask_for_unknown_policy_changed(CookiePermissionManagerPreferencesWindow *self, - gpointer *inUserData) +static void _cookie_permission_manager_preferences_window_unknown_policy_changed(CookiePermissionManagerPreferencesWindow *self, + gpointer *inUserData) { CookiePermissionManagerPreferencesWindowPrivate *priv=self->priv; - gboolean doAsk; + CookiePermissionManagerPolicy policy; + GtkTreeIter policyIter; + + if(!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(priv->unknownPolicyCombo), &policyIter)) + return; + + gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(priv->unknownPolicyCombo)), + &policyIter, + 0, &policy, + -1); /* Get toogle state of widget (but block signal for manager) and set in manager */ - g_signal_handler_block(priv->manager, priv->signalManagerAskForUnknownPolicyID); - doAsk=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->askForUnknownPolicyCheckbox)); - g_object_set(priv->manager, "ask-for-unknown-policy", doAsk, NULL); - g_signal_handler_unblock(priv->manager, priv->signalManagerAskForUnknownPolicyID); + g_signal_handler_block(priv->manager, priv->signalManagerUnknownPolicyID); + g_object_set(priv->manager, "unknown-policy", policy, NULL); + g_signal_handler_unblock(priv->manager, priv->signalManagerUnknownPolicyID); } static void _cookie_permission_manager_preferences_on_policy_editing_started(CookiePermissionManagerPreferencesWindow *self, @@ -588,8 +596,8 @@ static void cookie_permission_manager_preferences_window_finalize(GObject *inObj if(priv->signalManagerChangedDatabaseID) g_signal_handler_disconnect(priv->manager, priv->signalManagerChangedDatabaseID); priv->signalManagerChangedDatabaseID=0; - if(priv->signalManagerAskForUnknownPolicyID) g_signal_handler_disconnect(priv->manager, priv->signalManagerAskForUnknownPolicyID); - priv->signalManagerAskForUnknownPolicyID=0; + if(priv->signalManagerUnknownPolicyID) g_signal_handler_disconnect(priv->manager, priv->signalManagerUnknownPolicyID); + priv->signalManagerUnknownPolicyID=0; g_object_unref(priv->manager); priv->manager=NULL; @@ -619,8 +627,8 @@ static void cookie_permission_manager_preferences_window_set_property(GObject *i if(priv->signalManagerChangedDatabaseID) g_signal_handler_disconnect(priv->manager, priv->signalManagerChangedDatabaseID); priv->signalManagerChangedDatabaseID=0; - if(priv->signalManagerAskForUnknownPolicyID) g_signal_handler_disconnect(priv->manager, priv->signalManagerAskForUnknownPolicyID); - priv->signalManagerAskForUnknownPolicyID=0; + if(priv->signalManagerUnknownPolicyID) g_signal_handler_disconnect(priv->manager, priv->signalManagerUnknownPolicyID); + priv->signalManagerUnknownPolicyID=0; g_object_unref(priv->manager); priv->manager=NULL; @@ -641,12 +649,12 @@ static void cookie_permission_manager_preferences_window_set_property(GObject *i self); _cookie_permission_manager_preferences_window_manager_database_changed(self, NULL, priv->manager); - priv->signalManagerAskForUnknownPolicyID= + priv->signalManagerUnknownPolicyID= g_signal_connect_swapped(priv->manager, - "notify::ask-for-unknown-policy", - G_CALLBACK(_cookie_permission_manager_preferences_window_manager_ask_for_unknown_policy_changed), + "notify::unknown-policy", + G_CALLBACK(_cookie_permission_manager_preferences_window_manager_unknown_policy_changed), self); - _cookie_permission_manager_preferences_window_manager_ask_for_unknown_policy_changed(self, NULL, priv->manager); + _cookie_permission_manager_preferences_window_manager_unknown_policy_changed(self, NULL, priv->manager); } break; @@ -874,13 +882,39 @@ static void cookie_permission_manager_preferences_window_init(CookiePermissionMa gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5); - /* Add "ask-for-unknown-policy" checkbox */ - priv->askForUnknownPolicyCheckbox=gtk_check_button_new_with_mnemonic(_("A_sk for policy if unknown for a domain")); - priv->signalAskForUnknownPolicyID=g_signal_connect_swapped(priv->askForUnknownPolicyCheckbox, - "toggled", - G_CALLBACK(_cookie_permission_manager_preferences_window_ask_for_unknown_policy_changed), - self); - gtk_box_pack_start(GTK_BOX(vbox), priv->askForUnknownPolicyCheckbox, FALSE, TRUE, 5); + /* Add "unknown-policy" combo */ +#ifdef HAVE_GTK3 + hbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(hbox), FALSE); +#else + hbox=gtk_hbox_new(FALSE, 0); +#endif + widget=gtk_label_new(_("Policy for cookies from domains not in the list: ")); + gtk_container_add(GTK_CONTAINER(hbox), widget); + + list=gtk_list_store_new(2, G_TYPE_INT, G_TYPE_STRING); + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, COOKIE_PERMISSION_MANAGER_POLICY_UNDETERMINED, 1, _("Ask for a decision"), -1); + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, COOKIE_PERMISSION_MANAGER_POLICY_ACCEPT, 1, _("Accept"), -1); + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, COOKIE_PERMISSION_MANAGER_POLICY_ACCEPT_FOR_SESSION, 1, _("Accept for session"), -1); + gtk_list_store_append(list, &listIter); + gtk_list_store_set(list, &listIter, 0, COOKIE_PERMISSION_MANAGER_POLICY_BLOCK, 1, _("Block"), -1); + + priv->unknownPolicyCombo=gtk_combo_box_new_with_model(GTK_TREE_MODEL(list)); + gtk_combo_box_set_active(GTK_COMBO_BOX(priv->unknownPolicyCombo), 0); + gtk_container_add(GTK_CONTAINER(hbox), priv->unknownPolicyCombo); + + renderer=gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(priv->unknownPolicyCombo), renderer, TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(priv->unknownPolicyCombo), renderer, "text", 1); + + priv->signalUnknownPolicyID=g_signal_connect_swapped(priv->unknownPolicyCombo, + "changed", + G_CALLBACK(_cookie_permission_manager_preferences_window_unknown_policy_changed), + self); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5); /* Finalize setup of content area */ gtk_box_pack_start(GTK_BOX(priv->contentArea), vbox, TRUE, TRUE, 0); diff --git a/extensions/cookie-permissions/cookie-permission-manager.c b/extensions/cookie-permissions/cookie-permission-manager.c index 5cc07e73..f8d88989 100644 --- a/extensions/cookie-permissions/cookie-permission-manager.c +++ b/extensions/cookie-permissions/cookie-permission-manager.c @@ -31,7 +31,7 @@ enum PROP_DATABASE, PROP_DATABASE_FILENAME, - PROP_ASK_FOR_UNKNOWN_POLICY, + PROP_UNKNOWN_POLICY, PROP_LAST }; @@ -49,7 +49,7 @@ struct _CookiePermissionManagerPrivate MidoriApp *application; sqlite3 *database; gchar *databaseFilename; - gboolean askForUnknownPolicy; + CookiePermissionManagerPolicy unknownPolicy; /* Cookie jar related */ SoupSession *session; @@ -225,7 +225,7 @@ static void _cookie_permission_manager_open_database(CookiePermissionManager *se uri=soup_uri_new(NULL); soup_uri_set_host(uri, domain); cookies=soup_cookie_jar_get_cookie_list(priv->cookieJar, uri, TRUE); - for(cookie=cookies; cookie; cookie->next) + for(cookie=cookies; cookie; cookie=cookie->next) { soup_cookie_jar_delete_cookie(priv->cookieJar, (SoupCookie*)cookie->data); } @@ -294,24 +294,23 @@ static gint _cookie_permission_manager_get_policy(CookiePermissionManager *self, sqlite3_finalize(statement); /* Check if policy is undetermined. If it is then check if this policy was set by user. - * If it was not set by user check if we should ask user for his decision + * If it was not set by user, check what to do. */ - if(!priv->askForUnknownPolicy && !foundPolicy) + if(!foundPolicy) { - switch(soup_cookie_jar_get_accept_policy(priv->cookieJar)) - { - case SOUP_COOKIE_JAR_ACCEPT_ALWAYS: - case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY: - policy=COOKIE_PERMISSION_MANAGER_POLICY_ACCEPT; - break; + /* A SoupCookieJar that doesn't want to accept any cookies should override the user's + * choice, in case of e.g. private mode, to err on the side of caution. */ + SoupCookieJarAcceptPolicy soup_policy=soup_cookie_jar_get_accept_policy(priv->cookieJar); - case SOUP_COOKIE_JAR_ACCEPT_NEVER: - policy=COOKIE_PERMISSION_MANAGER_POLICY_BLOCK; - break; - - default: + if(soup_policy==SOUP_COOKIE_JAR_ACCEPT_ALWAYS || soup_policy==SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY) + { + policy=priv->unknownPolicy; + } + else + { + if(soup_policy!=SOUP_COOKIE_JAR_ACCEPT_NEVER) g_critical(_("Could not determine global cookie policy to set for domain: %s"), domain); - break; + policy=COOKIE_PERMISSION_MANAGER_POLICY_BLOCK; } } @@ -941,8 +940,8 @@ static void cookie_permission_manager_set_property(GObject *inObject, _cookie_permission_manager_on_application_changed(self); break; - case PROP_ASK_FOR_UNKNOWN_POLICY: - cookie_permission_manager_set_ask_for_unknown_policy(self, g_value_get_boolean(inValue)); + case PROP_UNKNOWN_POLICY: + cookie_permission_manager_set_unknown_policy(self, g_value_get_int(inValue)); break; default: @@ -976,8 +975,8 @@ static void cookie_permission_manager_get_property(GObject *inObject, g_value_set_string(outValue, self->priv->databaseFilename); break; - case PROP_ASK_FOR_UNKNOWN_POLICY: - g_value_set_boolean(outValue, self->priv->askForUnknownPolicy); + case PROP_UNKNOWN_POLICY: + g_value_set_int(outValue, self->priv->unknownPolicy); break; default: @@ -1029,12 +1028,14 @@ static void cookie_permission_manager_class_init(CookiePermissionManagerClass *k NULL, G_PARAM_READABLE); - CookiePermissionManagerProperties[PROP_ASK_FOR_UNKNOWN_POLICY]= - g_param_spec_boolean("ask-for-unknown-policy", - _("Ask for unknown policy"), - _("If true this extension ask for policy for every unknown domain." - "If false this extension uses the global cookie policy set in Midori settings."), - TRUE, + CookiePermissionManagerProperties[PROP_UNKNOWN_POLICY]= + g_param_spec_int("unknown-policy", + _("Unknown domain policy"), + _("The policy to use for domains not individually configured." + " This only acts to further restrict the global cookie policy set in Midori settings."), + COOKIE_PERMISSION_MANAGER_POLICY_UNDETERMINED, + COOKIE_PERMISSION_MANAGER_POLICY_BLOCK, + COOKIE_PERMISSION_MANAGER_POLICY_UNDETERMINED, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); g_object_class_install_properties(gobjectClass, PROP_LAST, CookiePermissionManagerProperties); @@ -1052,7 +1053,7 @@ static void cookie_permission_manager_init(CookiePermissionManager *self) /* Set up default values */ priv->database=NULL; priv->databaseFilename=NULL; - priv->askForUnknownPolicy=TRUE; + priv->unknownPolicy=COOKIE_PERMISSION_MANAGER_POLICY_UNDETERMINED; /* Hijack session's cookie jar to handle cookies requests on our own in HTTP streams * but remember old handlers to restore them on deactivation @@ -1078,22 +1079,22 @@ CookiePermissionManager* cookie_permission_manager_new(MidoriExtension *inExtens } /* Get/set policy to ask for policy if unknown for a domain */ -gboolean cookie_permission_manager_get_ask_for_unknown_policy(CookiePermissionManager *self) +CookiePermissionManagerPolicy cookie_permission_manager_get_unknown_policy(CookiePermissionManager *self) { - g_return_val_if_fail(IS_COOKIE_PERMISSION_MANAGER(self), FALSE); + g_return_val_if_fail(IS_COOKIE_PERMISSION_MANAGER(self), COOKIE_PERMISSION_MANAGER_POLICY_UNDETERMINED); - return(self->priv->askForUnknownPolicy); + return(self->priv->unknownPolicy); } -void cookie_permission_manager_set_ask_for_unknown_policy(CookiePermissionManager *self, gboolean inDoAsk) +void cookie_permission_manager_set_unknown_policy(CookiePermissionManager *self, CookiePermissionManagerPolicy inPolicy) { g_return_if_fail(IS_COOKIE_PERMISSION_MANAGER(self)); - if(inDoAsk!=self->priv->askForUnknownPolicy) + if(inPolicy!=self->priv->unknownPolicy) { - self->priv->askForUnknownPolicy=inDoAsk; - midori_extension_set_boolean(self->priv->extension, "ask-for-unknown-policy", inDoAsk); - g_object_notify_by_pspec(G_OBJECT(self), CookiePermissionManagerProperties[PROP_ASK_FOR_UNKNOWN_POLICY]); + self->priv->unknownPolicy=inPolicy; + midori_extension_set_integer(self->priv->extension, "unknown-policy", inPolicy); + g_object_notify_by_pspec(G_OBJECT(self), CookiePermissionManagerProperties[PROP_UNKNOWN_POLICY]); } } diff --git a/extensions/cookie-permissions/cookie-permission-manager.h b/extensions/cookie-permissions/cookie-permission-manager.h index 6e0ec3a0..1ba5a0ba 100644 --- a/extensions/cookie-permissions/cookie-permission-manager.h +++ b/extensions/cookie-permissions/cookie-permission-manager.h @@ -60,8 +60,8 @@ GType cookie_permission_manager_get_type(void); CookiePermissionManager* cookie_permission_manager_new(MidoriExtension *inExtension, MidoriApp *inApp); -gboolean cookie_permission_manager_get_ask_for_unknown_policy(CookiePermissionManager *self); -void cookie_permission_manager_set_ask_for_unknown_policy(CookiePermissionManager *self, gboolean inDoAsk); +CookiePermissionManagerPolicy cookie_permission_manager_get_unknown_policy(CookiePermissionManager *self); +void cookie_permission_manager_set_unknown_policy(CookiePermissionManager *self, CookiePermissionManagerPolicy inPolicy); /* Enumeration */ GType cookie_permission_manager_policy_get_type(void) G_GNUC_CONST; diff --git a/extensions/cookie-permissions/main.c b/extensions/cookie-permissions/main.c index fcf87bfc..1efc04f6 100644 --- a/extensions/cookie-permissions/main.c +++ b/extensions/cookie-permissions/main.c @@ -21,7 +21,7 @@ static void _cpm_on_activate(MidoriExtension *inExtension, MidoriApp *inApp, gpo g_return_if_fail(cpm==NULL); cpm=cookie_permission_manager_new(inExtension, inApp); - g_object_set(cpm, "ask-for-unknown-policy", midori_extension_get_boolean(inExtension, "ask-for-unknown-policy"), NULL); + g_object_set(cpm, "unknown-policy", midori_extension_get_integer(inExtension, "unknown-policy"), NULL); } /* This extension was deactivated */ @@ -65,7 +65,7 @@ MidoriExtension *extension_init(void) "authors", "Stephan Haller <nomad@froevel.de>", NULL); - midori_extension_install_boolean(extension, "ask-for-unknown-policy", TRUE); + midori_extension_install_integer(extension, "unknown-policy", COOKIE_PERMISSION_MANAGER_POLICY_UNDETERMINED); midori_extension_install_boolean(extension, "show-details-when-ask", FALSE); g_signal_connect(extension, "activate", G_CALLBACK(_cpm_on_activate), NULL); diff --git a/extensions/delayed-load.vala b/extensions/delayed-load.vala index 24aeb2b9..1ad9102c 100644 --- a/extensions/delayed-load.vala +++ b/extensions/delayed-load.vala @@ -9,137 +9,15 @@ See the file COPYING for the full license text. */ -using Gtk; -using Katze; -using Midori; - namespace DelayedLoad { - private class PreferencesDialog : Gtk.Dialog { - protected Manager dl_manager; - protected Scale slider; - - public PreferencesDialog (Manager manager) { - this.dl_manager = manager; - - this.title = _("Preferences for %s").printf ( _("Delayed load")); - if (this.get_class ().find_property ("has-separator") != null) - this.set ("has-separator", false); - this.border_width = 5; - this.set_modal (true); - this.set_default_size (350, 100); - this.create_widgets (); - - this.response.connect (response_cb); - } - - private void response_cb (Gtk.Dialog source, int response_id) { - switch (response_id) { - case ResponseType.APPLY: - this.dl_manager.set_integer ("delay", (int) (this.slider.get_value () * 1000)); - this.dl_manager.preferences_changed (); - this.destroy (); - break; - case ResponseType.CANCEL: - this.destroy (); - break; - } - } - - private void create_widgets () { - Label text = new Label (_("Delay in seconds until loading the page:")); -#if HAVE_GTK3 - this.slider = new Scale.with_range (Orientation.HORIZONTAL, 0, 15, 0.1); -#else - this.slider = new HScale.with_range (0, 15, 0.1); -#endif - - int delay = this.dl_manager.get_integer ("delay"); - if (delay > 0) - this.slider.set_value ((float)delay / 1000); - -#if HAVE_GTK3 - Gtk.Box vbox = get_content_area () as Gtk.Box; - vbox.pack_start (text, false, false, 0); - vbox.pack_start (this.slider, false, true, 0); -#else - this.vbox.pack_start (text, false, false, 0); - this.vbox.pack_start (this.slider, false, true, 0); -#endif - - this.add_button (Gtk.STOCK_CANCEL, ResponseType.CANCEL); - this.add_button (Gtk.STOCK_APPLY, ResponseType.APPLY); - - this.show_all (); - } - } - - private class TabShaker : GLib.Object { - public unowned Midori.Browser browser; - public GLib.PtrArray tasks; - - public bool reload_tab () { - if (tasks.len == 1) { - Midori.View? view = browser.tab as Midori.View; - Midori.View scheduled_view = tasks.index (0) as Midori.View; - if (scheduled_view == view) { - unowned Katze.Item item = view.get_proxy_item (); - - int64 delay = item.get_meta_integer ("delay"); - if (delay == Midori.Delay.PENDING_UNDELAY) { - view.reload (true); - } - } - } - tasks.remove_index (0); - return false; - } - - public TabShaker (Midori.Browser browser) { - this.browser = browser; - } - - construct { - this.tasks = new GLib.PtrArray (); - } - } - private class Manager : Midori.Extension { - private int timeout = 0; - private HashTable<Midori.Browser, TabShaker> tasks; - - public signal void preferences_changed (); - - private void preferences_changed_cb () { - this.timeout = get_integer ("delay"); - } - - private void show_preferences () { - PreferencesDialog dialog = new PreferencesDialog (this); - dialog.show (); - } - - private void schedule_reload (Midori.Browser browser, Midori.View view) { - if (this.timeout == 0) - view.reload (true); - else { - unowned TabShaker shaker = tasks.get (browser); - if (shaker != null) { - shaker.tasks.add (view); - Midori.Timeout.add (this.timeout, shaker.reload_tab); - } - } - } - private void tab_changed (Midori.View? old_view, Midori.View? new_view) { if (new_view != null) { - Midori.App app = get_app (); - Midori.Browser browser = app.browser; - unowned Katze.Item item = new_view.get_proxy_item (); int64 delay = item.get_meta_integer ("delay"); if (delay == Midori.Delay.PENDING_UNDELAY && new_view.progress < 1.0) { - this.schedule_reload (browser, new_view); + new_view.reload (true); } } } @@ -153,11 +31,6 @@ namespace DelayedLoad { } public void activated (Midori.App app) { - /* FIXME: override behavior without changing the preference */ - app.settings.load_on_startup = MidoriStartup.DELAYED_PAGES; - - this.preferences_changed (); - foreach (Midori.Browser browser in app.get_browsers ()) { browser_added (browser); } @@ -175,17 +48,11 @@ namespace DelayedLoad { internal Manager () { GLib.Object (name: _("Delayed load"), description: _("Delay page load until you actually use the tab."), - version: "0.1", + version: "0.2", authors: "André Stösel <andre@stoesel.de>"); - install_integer ("delay", 0); - activate.connect (this.activated); deactivate.connect (this.deactivated); - open_preferences.connect (show_preferences); - preferences_changed.connect (preferences_changed_cb); - - this.tasks = new HashTable<Midori.Browser, TabShaker> (GLib.direct_hash, GLib.direct_equal); } } } diff --git a/extensions/devpet.vala b/extensions/devpet.vala index d42c1d9f..8af341ba 100644 --- a/extensions/devpet.vala +++ b/extensions/devpet.vala @@ -74,6 +74,7 @@ namespace DevPet { this.destroy (); } + #if HAVE_EXECINFO_H private void row_activated (Gtk.TreePath path, Gtk.TreeViewColumn column) { Gtk.TreeIter iter; if (this.manager.list_store.get_iter (out iter, path)) { @@ -87,6 +88,7 @@ namespace DevPet { data_window.show (); } } + #endif private void create_content () { this.title = "Midori - DevPet"; @@ -141,14 +143,15 @@ namespace DevPet { private class Manager : Midori.Extension { public Gtk.ListStore list_store; - private Gtk.StatusIcon trayicon; + private Gtk.StatusIcon? trayicon = null; private LogWindow? log_window; private GLib.LogFunc default_log_func; private GLib.LogLevelFlags icon_flag = GLib.LogLevelFlags.LEVEL_DEBUG; public void clear_list() { this.icon_flag = GLib.LogLevelFlags.LEVEL_DEBUG; - this.trayicon.set_visible (false); + if(this.trayicon != null) + this.trayicon.set_visible (false); this.list_store.clear (); } @@ -165,10 +168,21 @@ namespace DevPet { return Gtk.Stock.DIALOG_INFO; } + private void ensure_trayicon() { + if(this.trayicon != null) + return; + + this.trayicon = new Gtk.StatusIcon (); + this.trayicon.set_tooltip_text ("Midori - DevPet"); + this.trayicon.activate.connect(this.show_error_log); + } + private void log_handler(string? domain, GLib.LogLevelFlags flags, string message) { Gtk.TreeIter iter; unowned string stock = this.get_stock_from_log_level (flags); + this.ensure_trayicon(); + if (flags < this.icon_flag) { this.icon_flag = flags; this.trayicon.set_from_stock (stock); @@ -213,13 +227,25 @@ namespace DevPet { } private void activated (Midori.App app) { - this.trayicon.set_visible (false); this.default_log_func = GLib.Log.default_handler; GLib.Log.set_default_handler (this.log_handler); + if (this.trayicon != null) { + int length = 0; + this.list_store.foreach((model, path, iter) => { + length++; + return false; + }); + + if (length > 0) { + this.trayicon.set_visible (true); + } + } } private void deactivated () { - this.trayicon.set_visible (false); + if (this.trayicon != null) + this.trayicon.set_visible (false); + GLib.Log.set_default_handler (this.default_log_func); } @@ -229,10 +255,6 @@ namespace DevPet { version: "0.1", authors: "André Stösel <andre@stoesel.de>"); - this.trayicon = new Gtk.StatusIcon (); - this.trayicon.set_tooltip_text ("Midori - DevPet"); - this.trayicon.activate.connect(this.show_error_log); - this.list_store = new Gtk.ListStore (TreeCells.COUNT, typeof(string), typeof(string), typeof (string)); this.activate.connect (this.activated); diff --git a/extensions/feed-panel/feed-panel.c b/extensions/feed-panel/feed-panel.c index 0753de32..b4e565a0 100644 --- a/extensions/feed-panel/feed-panel.c +++ b/extensions/feed-panel/feed-panel.c @@ -440,7 +440,6 @@ feed_panel_open_in_tab_activate_cb (GtkWidget* menuitem, { KatzeItem* item; const gchar* uri; - guint n; item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); diff --git a/extensions/flummi.vala b/extensions/flummi.vala new file mode 100644 index 00000000..7e8decb2 --- /dev/null +++ b/extensions/flummi.vala @@ -0,0 +1,94 @@ +/* + Copyright (C) 2013 André Stösel <andre@stoesel.de> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +namespace Flummi { + private class Manager : Midori.Extension { + private bool bounce () { + try { + Midori.App app = this.get_app (); + Midori.Browser? browser = app.browser; + + if (browser == null || browser.tab == null) { + return true; + } + + + Midori.Database database = new Midori.Database ("flummi.db"); + unowned Sqlite.Database db = database.db; + + string sqlcmd = "SELECT id, once, command FROM tasks ORDER BY id;"; + + Sqlite.Statement stmt; + if (db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) { + GLib.critical ("Failed to select from database: %s", db.errmsg ()); + return false; + } + + int result = stmt.step (); + if (!(result == Sqlite.DONE || result == Sqlite.ROW)) { + GLib.critical ("Failed to select from database: %s", db.errmsg ()); + return false; + } + + Sqlite.Statement del_stmt; + sqlcmd = "DELETE FROM `tasks` WHERE id = :task_id;"; + if (db.prepare_v2 (sqlcmd, -1, out del_stmt, null) != Sqlite.OK) { + GLib.critical ("Failed to update database: %s", db.errmsg ()); + return false; + } + + while (result == Sqlite.ROW) { + int64 id = stmt.column_int64 (0); + int64 once = stmt.column_int64 (1); + string command = stmt.column_text (2); + + string[] commands = { command }; + + if (!app.send_command (commands)) { + GLib.critical ("Command failed: %s", command); + return false; + } + + if (once > 0) { + del_stmt.bind_int64 (del_stmt.bind_parameter_index (":task_id"), id); + if (del_stmt.step () != Sqlite.DONE) { + GLib.critical ("Failed to delete record %lf.\nError: %s", id, db.errmsg ()); + return false; + } + } + + result = stmt.step (); + } + } catch (Midori.DatabaseError schema_error) { + GLib.error (schema_error.message); + } + + return false; + } + + private void activated (Midori.App app) { + GLib.Idle.add (this.bounce); + } + + internal Manager () { + GLib.Object (name: _("Flummi"), + description: _("This extension provides a task queue for update jobs or recurring events."), + version: "0.1", + authors: "André Stösel <andre@stoesel.de>"); + + this.activate.connect (this.activated); + } + } +} + +public Midori.Extension extension_init () { + return new Flummi.Manager (); +} diff --git a/extensions/formhistory/formhistory.c b/extensions/formhistory/formhistory.c index 660502e3..060ac1c7 100644 --- a/extensions/formhistory/formhistory.c +++ b/extensions/formhistory/formhistory.c @@ -495,6 +495,12 @@ formhistory_new (const gchar* config_dir) priv->master_password_canceled = 0; formhistory_construct_popup_gui (priv); + if (config_dir == NULL) + { + priv->db = NULL; + return priv; + } + filename = g_build_filename (config_dir, "forms.db", NULL); priv->database = midori_database_new (filename, &error); g_free (filename); diff --git a/extensions/history-list.vala b/extensions/history-list.vala index 5273adce..3a864b18 100644 --- a/extensions/history-list.vala +++ b/extensions/history-list.vala @@ -77,7 +77,7 @@ namespace HistoryList { protected bool is_dirty = false; protected Gtk.ScrolledWindow? scroll_windows; - protected void store_append_row (GLib.PtrArray list, Gtk.ListStore store, out Gtk.TreeIter iter) { + protected void store_append_row (GLib.PtrArray list, Gtk.ListStore store) { for (var i = list.len; i > 0; i--) { Midori.View view = list.index (i - 1) as Midori.View; @@ -86,6 +86,7 @@ namespace HistoryList { unowned string title = view.get_display_title (); + Gtk.TreeIter iter; store.append (out iter); store.set (iter, TabTreeCells.TREE_CELL_PIXBUF, icon, TabTreeCells.TREE_CELL_STRING, title, @@ -96,11 +97,10 @@ namespace HistoryList { } protected virtual void insert_rows (Gtk.ListStore store) { - Gtk.TreeIter iter; unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history"); unowned GLib.PtrArray list_new = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history-new"); - store_append_row (list, store, out iter); - store_append_row (list_new, store, out iter); + store_append_row (list, store); + store_append_row (list_new, store); } protected void resize_treeview () { @@ -243,16 +243,15 @@ namespace HistoryList { protected bool first_step = true; protected override void insert_rows (Gtk.ListStore store) { - Gtk.TreeIter iter; unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history-new"); - store_append_row (list, store, out iter); + store_append_row (list, store); if ((int)list.len == 0) { this.old_tabs = true; var label = new Gtk.Label (_("There are no unvisited tabs")); this.vbox.pack_start (label, true, true, 0); unowned GLib.PtrArray list_old = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history"); - store_append_row (list_old, store, out iter); + store_append_row (list_old, store); } } diff --git a/extensions/mouse-gestures.c b/extensions/mouse-gestures.c index 46c14c86..7238b5d8 100644 --- a/extensions/mouse-gestures.c +++ b/extensions/mouse-gestures.c @@ -384,7 +384,7 @@ mouse_gestures_load_config (MidoriExtension* extension) for(i = 0; keys[i]; i++) { gsize n_strokes; - int j; + guint j; gchar** stroke_strings = g_key_file_get_string_list (keyfile, "gestures", keys[i], &n_strokes, NULL); diff --git a/extensions/statusbar-features.c b/extensions/statusbar-features.c index 6be3ff2a..22934123 100644 --- a/extensions/statusbar-features.c +++ b/extensions/statusbar-features.c @@ -126,7 +126,7 @@ statusbar_features_property_proxy (MidoriWebSettings* settings, else if (!strcmp (property, "zoom-level")) { MidoriBrowser* browser = midori_browser_get_for_widget (toolbar); - gint i; + guint i; button = gtk_combo_box_text_new_with_entry (); gtk_entry_set_width_chars (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (button))), 4); for (i = 0; i < G_N_ELEMENTS (zoom_levels); i++) diff --git a/extensions/tabby.vala b/extensions/tabby.vala index 801ea970..13fa9a6a 100644 --- a/extensions/tabby.vala +++ b/extensions/tabby.vala @@ -10,6 +10,10 @@ */ namespace Tabby { + int IDLE_RESTORE_COUNT = 13; + /* FixMe: don't use a global object */ + Midori.App? APP; + /* function called from Manager object */ public interface IStorage : GLib.Object { public abstract Katze.Array get_sessions (); @@ -23,9 +27,16 @@ namespace Tabby { public abstract void add_item (Katze.Item item); public abstract void attach (Midori.Browser browser); public abstract void restore (Midori.Browser browser); + public abstract void remove (); public abstract void close (); } + public enum SessionState { + OPEN, + CLOSED, + RESTORING + } + namespace Base { /* each base class should connect to all necessary signals and provide an abstract function to handle them */ @@ -34,8 +45,18 @@ namespace Tabby { public abstract Katze.Array get_sessions (); public abstract Base.Session get_new_session (); + + public void start_new_session () { + Katze.Array sessions = new Katze.Array (typeof (Session)); + this.init_sessions (sessions); + } + public void restore_last_sessions () { Katze.Array sessions = this.get_sessions (); + this.init_sessions (sessions); + } + + private void init_sessions (Katze.Array sessions) { if (sessions.is_empty ()) { sessions.add_item (this.get_new_session ()); } @@ -58,25 +79,46 @@ namespace Tabby { public virtual void import_session (Katze.Array tabs) { Session session = this.get_new_session (); GLib.List<unowned Katze.Item> items = tabs.get_items (); + double i = 0; foreach (Katze.Item item in items) { + item.set_meta_string ("sorting", i.to_string()); + i += 1024; session.add_item (item); } } } public abstract class Session : GLib.Object, ISession { + protected GLib.SList<double?> tab_sorting; + + public Midori.Browser browser { get; protected set; } + public SessionState state { get; protected set; default = SessionState.CLOSED; } + public abstract void add_item (Katze.Item item); public abstract void uri_changed (Midori.View view, string uri); public abstract void data_changed (Midori.View view); public abstract void tab_added (Midori.Browser browser, Midori.View view); public abstract void tab_removed (Midori.Browser browser, Midori.View view); - public abstract void close (); + public abstract void tab_switched (Midori.View? old_view, Midori.View? new_view); + public abstract void tab_reordered (Gtk.Widget tab, uint pos); + + public abstract void remove (); + public abstract Katze.Array get_tabs (); + public abstract double? get_max_sorting (); public void attach (Midori.Browser browser) { - browser.add_tab.connect (this.tab_added); + this.browser = browser; + + browser.add_tab.connect_after (this.tab_added); browser.add_tab.connect (this.helper_data_changed); + browser.remove_tab.connect (this.tab_removed); + browser.switch_tab.connect (this.tab_switched); + browser.delete_event.connect_after(this.delete_event); + browser.notebook.page_reordered.connect_after (this.tab_reordered); + + this.state = SessionState.OPEN; foreach (Midori.View view in browser.get_tabs ()) { this.tab_added (browser, view); @@ -85,76 +127,235 @@ namespace Tabby { } public void restore (Midori.Browser browser) { + this.browser = browser; + Katze.Array tabs = this.get_tabs (); + unowned Katze.Array? open_uris = browser.get_data ("tabby-open-uris"); + + if(tabs.is_empty () && open_uris == null) { + /* Using get here to avoid MidoriMidoriStartup in generated C with Vala 0.20.1 */ + int load_on_startup; + APP.settings.get ("load-on-startup", out load_on_startup); - if(tabs.is_empty ()) { Katze.Item item = new Katze.Item (); - item.uri = "about:home"; + + if (load_on_startup == Midori.MidoriStartup.BLANK_PAGE) { + item.uri = "about:dial"; + } else { + item.uri = "about:home"; + } + tabs.add_item (item); } - browser.add_tab.connect (this.tab_added); + browser.add_tab.connect_after (this.tab_added); browser.add_tab.connect (this.helper_data_changed); + browser.remove_tab.connect (this.tab_removed); + browser.switch_tab.connect (this.tab_switched); + browser.delete_event.connect_after(this.delete_event); + browser.notebook.page_reordered.connect_after (this.tab_reordered); - GLib.List<unowned Katze.Item> items = tabs.get_items (); + GLib.List<unowned Katze.Item> items = new GLib.List<unowned Katze.Item> (); + if (open_uris != null) { + items.concat (open_uris.get_items ()); + } + items.concat (tabs.get_items ()); unowned GLib.List<unowned Katze.Item> u_items = items; bool delay = false; + bool should_delay = false; + + int load_on_startup; + APP.settings.get ("load-on-startup", out load_on_startup); + should_delay = load_on_startup == Midori.MidoriStartup.DELAYED_PAGES; + + if (APP.crashed == true) { + delay = true; + should_delay = true; + } + + this.state = SessionState.RESTORING; GLib.Idle.add (() => { /* Note: we need to use `items` for something to maintain a valid reference */ + GLib.PtrArray new_tabs = new GLib.PtrArray (); if (items.length () > 0) { - for (int i = 0; i < 3; i++) { - if (u_items == null) + for (int i = 0; i < IDLE_RESTORE_COUNT; i++) { + if (u_items == null) { + this.helper_reorder_tabs (new_tabs); + this.state = SessionState.OPEN; return false; + } Katze.Item t_item = u_items.data<Katze.Item>; - if (delay) + t_item.set_meta_integer ("append", 1); + + if (delay && should_delay) t_item.set_meta_integer ("delay", Midori.Delay.DELAYED); else delay = true; - browser.add_item (t_item); + unowned Gtk.Widget tab = browser.add_item (t_item); + new_tabs.add (tab); u_items = u_items.next; } + this.helper_reorder_tabs (new_tabs); + } + if (u_items == null) { + this.state = SessionState.OPEN; + return false; } - return u_items != null; + return true; }); } - private void helper_data_changed (Midori.Browser browser, Midori.View view) { - ulong sig_id = 0; - sig_id = view.web_view.load_started.connect (() => { + public virtual void close () { + this.browser.add_tab.disconnect (this.tab_added); + this.browser.add_tab.disconnect (this.helper_data_changed); + this.browser.remove_tab.disconnect (this.tab_removed); + this.browser.switch_tab.disconnect (this.tab_switched); + this.browser.delete_event.disconnect (this.delete_event); + this.browser.notebook.page_reordered.disconnect (this.tab_reordered); + } + +#if HAVE_GTK3 + protected bool delete_event (Gtk.Widget widget, Gdk.EventAny event) { +#else + protected bool delete_event (Gtk.Widget widget, Gdk.Event event) { +#endif + + this.close(); + return false; + + } + + protected double? get_tab_sorting (Midori.View view) { + int this_pos = this.browser.notebook.page_num (view); + Midori.View prev_view = this.browser.notebook.get_nth_page (this_pos - 1) as Midori.View; + Midori.View next_view = this.browser.notebook.get_nth_page (this_pos + 1) as Midori.View; + + string? prev_meta_sorting = null; + string? next_meta_sorting = null; + double? prev_sorting, next_sorting, this_sorting; + + if (prev_view != null) { + unowned Katze.Item prev_item = prev_view.get_proxy_item (); + prev_meta_sorting = prev_item.get_meta_string ("sorting"); + } + + if (prev_meta_sorting == null) + if (this.state == SessionState.RESTORING) + prev_sorting = this.get_max_sorting (); + else + prev_sorting = double.parse ("0"); + else + prev_sorting = double.parse (prev_meta_sorting); + + if (next_view != null) { + unowned Katze.Item next_item = next_view.get_proxy_item (); + next_meta_sorting = next_item.get_meta_string ("sorting"); + } + + if (next_meta_sorting == null) + next_sorting = prev_sorting + 2048; + else + next_sorting = double.parse (next_meta_sorting); + + this_sorting = prev_sorting + (next_sorting - prev_sorting) / 2; + + return this_sorting; + } + + private void load_status (GLib.Object _view, ParamSpec pspec) { + Midori.View view = (Midori.View)_view; + + if (view.load_status == Midori.LoadStatus.PROVISIONAL) { unowned Katze.Item item = view.get_proxy_item (); int64 delay = item.get_meta_integer ("delay"); if (delay == Midori.Delay.UNDELAYED) { view.web_view.notify["uri"].connect ( () => { - this.uri_changed (view, view.web_view.uri); - }); + this.uri_changed (view, view.web_view.uri); + }); view.web_view.notify["title"].connect ( () => { - this.data_changed (view); - }); + this.data_changed (view); + }); - GLib.SignalHandler.disconnect (view.web_view, sig_id); } - }); + + view.notify["load-status"].disconnect (load_status); + } + } + + private void helper_data_changed (Midori.Browser browser, Midori.View view) { + view.notify["load-status"].connect (load_status); + + view.new_view.connect (this.helper_duplicate_tab); + } + + private void helper_reorder_tabs (GLib.PtrArray new_tabs) { + CompareDataFunc<double?> helper_compare_data = (a, b) => { + if (a > b) + return 1; + else if(a < b) + return -1; + return 0; + }; + + GLib.CompareFunc<double?> helper_compare_func = (a,b) => { + return a == b ? 0 : -1; + }; + + this.browser.notebook.page_reordered.disconnect (this.tab_reordered); + for(var i = 0; i < new_tabs.len; i++) { + Midori.View tab = new_tabs.index(i) as Midori.View; + + unowned Katze.Item item = tab.get_proxy_item (); + + double? sorting; + string? sorting_string = item.get_meta_string ("sorting"); + if (sorting_string != null) { /* we have to use a seperate if condition to avoid a `possibly unassigned local variable` error */ + if (double.try_parse (item.get_meta_string ("sorting"), out sorting)) { + this.tab_sorting.insert_sorted_with_data (sorting, helper_compare_data); + + int index = this.tab_sorting.position (this.tab_sorting.find_custom (sorting, helper_compare_func)); + + this.browser.notebook.reorder_child (tab, index); + } + } + } + this.browser.notebook.page_reordered.connect_after (this.tab_reordered); + } + + private void helper_duplicate_tab (Midori.View view, Midori.View new_view, Midori.NewView where, bool user_initiated) { + unowned Katze.Item item = view.get_proxy_item (); + unowned Katze.Item new_item = new_view.get_proxy_item (); + int64 tab_id = item.get_meta_integer ("tabby-id"); + int64 new_tab_id = new_item.get_meta_integer ("tabby-id"); + + if (tab_id > 0 && tab_id == new_tab_id) { + new_item.set_meta_integer ("tabby-id", 0); + } + } + + construct { + this.tab_sorting = new GLib.SList<double?> (); } } } namespace Local { private class Session : Base.Session { - public static int open_sessions = 0; public int64 id { get; private set; } private unowned Sqlite.Database db; public override void add_item (Katze.Item item) { GLib.DateTime time = new DateTime.now_local (); - string sqlcmd = "INSERT INTO `tabs` (`crdate`, `tstamp`, `session_id`, `uri`, `title`) VALUES (:tstamp, :tstamp, :session_id, :uri, :title);"; + string? sorting = item.get_meta_string ("sorting"); + string sqlcmd = "INSERT INTO `tabs` (`crdate`, `tstamp`, `session_id`, `uri`, `title`, `sorting`) VALUES (:tstamp, :tstamp, :session_id, :uri, :title, :sorting);"; Sqlite.Statement stmt; if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) critical (_("Failed to update database: %s"), db.errmsg); @@ -162,6 +363,11 @@ namespace Tabby { stmt.bind_int64 (stmt.bind_parameter_index (":session_id"), this.id); stmt.bind_text (stmt.bind_parameter_index (":uri"), item.uri); stmt.bind_text (stmt.bind_parameter_index (":title"), item.name); + if (sorting == null) + stmt.bind_double (stmt.bind_parameter_index (":sorting"), double.parse ("1")); + else + stmt.bind_double (stmt.bind_parameter_index (":sorting"), double.parse (sorting)); + if (stmt.step () != Sqlite.DONE) critical (_("Failed to update database: %s"), db.errmsg); else { @@ -202,6 +408,8 @@ namespace Tabby { unowned Katze.Item item = view.get_proxy_item (); int64 tab_id = item.get_meta_integer ("tabby-id"); if (tab_id < 1) { + double? sorting = this.get_tab_sorting (view); + item.set_meta_string ("sorting", sorting.to_string ()); this.add_item (item); } } @@ -220,9 +428,76 @@ namespace Tabby { critical (_("Failed to update database: %s"), db.errmsg ()); } + protected override void tab_switched (Midori.View? old_view, Midori.View? new_view) { + GLib.DateTime time = new DateTime.now_local (); + unowned Katze.Item item = new_view.get_proxy_item (); + int64 tab_id = item.get_meta_integer ("tabby-id"); + string sqlcmd = "UPDATE `tabs` SET tstamp = :tstamp WHERE session_id = :session_id AND id = :tab_id;"; + Sqlite.Statement stmt; + if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) + critical (_("Failed to update database: %s"), db.errmsg ()); + stmt.bind_int64 (stmt.bind_parameter_index (":session_id"), this.id); + stmt.bind_int64 (stmt.bind_parameter_index (":tab_id"), tab_id); + stmt.bind_int64 (stmt.bind_parameter_index (":tstamp"), time.to_unix ()); + if (stmt.step () != Sqlite.DONE) + critical (_("Failed to update database: %s"), db.errmsg ()); + } + + protected override void tab_reordered (Gtk.Widget tab, uint pos) { + Midori.View view = tab as Midori.View; + + double? sorting = this.get_tab_sorting (view); + unowned Katze.Item item = view.get_proxy_item (); + int64 tab_id = item.get_meta_integer ("tabby-id"); + string sqlcmd = "UPDATE `tabs` SET sorting = :sorting WHERE session_id = :session_id AND id = :tab_id;"; + Sqlite.Statement stmt; + if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) + critical (_("Failed to update database: %s"), db.errmsg ()); + stmt.bind_int64 (stmt.bind_parameter_index (":session_id"), this.id); + stmt.bind_int64 (stmt.bind_parameter_index (":tab_id"), tab_id); + stmt.bind_double (stmt.bind_parameter_index (":sorting"), sorting); + + if (stmt.step () != Sqlite.DONE) + critical (_("Failed to update database: %s"), db.errmsg ()); + + item.set_meta_string ("sorting", sorting.to_string ()); + } + + public override void remove() { + string sqlcmd = "DELETE FROM `tabs` WHERE session_id = :session_id;"; + Sqlite.Statement stmt; + if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) + critical (_("Failed to update database: %s"), db.errmsg ()); + stmt.bind_int64 (stmt.bind_parameter_index (":session_id"), this.id); + + if (stmt.step () != Sqlite.DONE) + critical (_("Failed to update database: %s"), db.errmsg ()); + + sqlcmd = "DELETE FROM `sessions` WHERE id = :session_id;"; + if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) + critical (_("Failed to update database: %s"), db.errmsg ()); + stmt.bind_int64 (stmt.bind_parameter_index (":session_id"), this.id); + + if (stmt.step () != Sqlite.DONE) + critical (_("Failed to update database: %s"), db.errmsg ()); + } + public override void close() { - if (Session.open_sessions == 1) - return; + base.close (); + + bool should_break = true; + if (!this.browser.destroy_with_parent) { + foreach (Midori.Browser browser in APP.get_browsers ()) { + if (browser != this.browser && !browser.destroy_with_parent) { + should_break = false; + break; + } + } + + if (should_break) { + return; + } + } GLib.DateTime time = new DateTime.now_local (); string sqlcmd = "UPDATE `sessions` SET closed = 1, tstamp = :tstamp WHERE id = :session_id;"; @@ -239,7 +514,7 @@ namespace Tabby { public override Katze.Array get_tabs() { Katze.Array tabs = new Katze.Array (typeof (Katze.Item)); - string sqlcmd = "SELECT id, uri, title FROM tabs WHERE session_id = :session_id"; + string sqlcmd = "SELECT id, uri, title, sorting FROM tabs WHERE session_id = :session_id ORDER BY tstamp DESC"; Sqlite.Statement stmt; if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) critical (_("Failed to select from database: %s"), db.errmsg ()); @@ -258,6 +533,7 @@ namespace Tabby { item.uri = uri; item.name = title; item.set_meta_integer ("tabby-id", id); + item.set_meta_string ("sorting", stmt.column_double (3).to_string ()); tabs.add_item (item); result = stmt.step (); } @@ -265,6 +541,28 @@ namespace Tabby { return tabs; } + public override double? get_max_sorting () { + string sqlcmd = "SELECT MAX(sorting) FROM tabs WHERE session_id = :session_id"; + Sqlite.Statement stmt; + if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) + critical (_("Failed to select from database: %s"), db.errmsg ()); + stmt.bind_int64 (stmt.bind_parameter_index (":session_id"), this.id); + int result = stmt.step (); + if (!(result == Sqlite.DONE || result == Sqlite.ROW)) { + critical (_("Failed to select from database: %s"), db.errmsg ()); + } else if (result == Sqlite.ROW) { + double? sorting; + string? sorting_string = stmt.column_double (0).to_string (); + if (sorting_string != null) { /* we have to use a seperate if condition to avoid a `possibly unassigned local variable` error */ + if (double.try_parse (sorting_string, out sorting)) { + return sorting; + } + } + } + + return double.parse ("0"); + } + internal Session (Sqlite.Database db) { this.db = db; @@ -296,15 +594,6 @@ namespace Tabby { if (stmt.step () != Sqlite.DONE) critical (_("Failed to update database: %s"), db.errmsg); } - - construct { - Session.open_sessions++; - } - - ~Session () { - Session.open_sessions--; - } - } private class Storage : Base.Storage { @@ -314,7 +603,12 @@ namespace Tabby { public override Katze.Array get_sessions () { Katze.Array sessions = new Katze.Array (typeof (Session)); - string sqlcmd = "SELECT id FROM sessions WHERE closed = 0;"; + string sqlcmd = """ + SELECT id, closed FROM sessions WHERE closed = 0 + UNION + SELECT * FROM (SELECT id, closed FROM sessions WHERE closed = 1 ORDER BY tstamp DESC LIMIT 1) + ORDER BY closed; + """; Sqlite.Statement stmt; if (this.db.prepare_v2 (sqlcmd, -1, out stmt, null) != Sqlite.OK) critical (_("Failed to select from database: %s"), db.errmsg); @@ -326,10 +620,13 @@ namespace Tabby { while (result == Sqlite.ROW) { int64 id = stmt.column_int64 (0); - sessions.add_item (new Session.with_id (this.db, id)); + int64 closed = stmt.column_int64 (1); + if (closed == 0 || sessions.is_empty ()) { + sessions.add_item (new Session.with_id (this.db, id)); + } result = stmt.step (); } - + if (sessions.is_empty ()) { sessions.add_item (new Session (this.db)); } @@ -376,10 +673,56 @@ namespace Tabby { private class Manager : Midori.Extension { private Base.Storage storage; private bool load_session () { - this.storage.restore_last_sessions (); + /* Using get here to avoid MidoriMidoriStartup in generated C with Vala 0.20.1 */ + int load_on_startup; + APP.settings.get ("load-on-startup", out load_on_startup); + if (load_on_startup == Midori.MidoriStartup.BLANK_PAGE + || load_on_startup == Midori.MidoriStartup.HOMEPAGE) { + this.storage.start_new_session (); + } else { + this.storage.restore_last_sessions (); + } + + /* FIXME: execute_commands should be called before session creation */ + GLib.Idle.add (this.execute_commands); + return false; } + private bool execute_commands () { + Midori.App app = this.get_app (); + unowned string?[] commands = app.get_data ("execute-commands"); + + if (commands != null) { + app.send_command (commands); + } + + return false; + } + + private void set_open_uris (Midori.Browser browser) { + Midori.App app = this.get_app (); + unowned string?[] uris = app.get_data ("open-uris"); + + if (uris != null) { + Katze.Array tabs = new Katze.Array (typeof (Katze.Item)); + + for(int i = 0; uris[i] != null; i++) { + Katze.Item item = new Katze.Item (); + item.name = uris[i]; + item.uri = Midori.Sokoke.magic_uri (uris[i], true, true); + if (item.uri != null) { + tabs.add_item (item); + } + } + if (!tabs.is_empty()) { + browser.set_data ("tabby-open-uris", tabs); + } + } + + app.add_browser.disconnect (this.set_open_uris); + } + private void browser_added (Midori.Browser browser) { Base.Session session = browser.get_data<Base.Session> ("tabby-session"); if (session == null) { @@ -395,15 +738,35 @@ namespace Tabby { GLib.warning ("missing session"); } else { session.close (); + + /* Using get here to avoid MidoriMidoriStartup in generated C with Vala 0.20.1 */ + int load_on_startup; + APP.settings.get ("load-on-startup", out load_on_startup); + + if (browser.destroy_with_parent + || load_on_startup < Midori.MidoriStartup.LAST_OPEN_PAGES) { + /* Remove js popups and close if not restoring on startup */ + session.remove (); + } } } private void activated (Midori.App app) { + APP = app; + unowned string? restore_count = GLib.Environment.get_variable ("TABBY_RESTORE_COUNT"); + if (restore_count != null) { + int count = int.parse (restore_count); + if (count >= 1) { + IDLE_RESTORE_COUNT = count; + } + } + /* FixMe: provide an option to replace Local.Storage with IStorage based Objects */ this.storage = new Local.Storage (this.get_app ()) as Base.Storage; - app.add_browser.connect (browser_added); - app.remove_browser.connect (browser_removed); + app.add_browser.connect (this.set_open_uris); + app.add_browser.connect (this.browser_added); + app.remove_browser.connect (this.browser_removed); GLib.Idle.add (this.load_session); } @@ -414,7 +777,7 @@ namespace Tabby { version: "0.1", authors: "André Stösel <andre@stoesel.de>"); - activate.connect (this.activated); + this.activate.connect (this.activated); } } } diff --git a/extensions/transfers.vala b/extensions/transfers.vala index bf1623a5..5b6ad425 100644 --- a/extensions/transfers.vala +++ b/extensions/transfers.vala @@ -174,8 +174,13 @@ namespace Transfers { Transfer transfer; store.get (iter, 0, out transfer); - if (Midori.Download.action_clear (transfer.download, treeview)) - transfer.remove (); + try { + if (Midori.Download.action_clear (transfer.download, treeview)) + transfer.remove (); + } catch (Error error) { + // Failure to open is the only known possibility here + GLib.warning (_("Failed to open download: %s"), error.message); + } } } @@ -198,15 +203,23 @@ namespace Transfers { var menu = new Gtk.Menu (); var menuitem = new Gtk.ImageMenuItem.from_stock (Gtk.STOCK_OPEN, null); menuitem.activate.connect (() => { - Midori.Download.open (transfer.download, treeview); + try { + Midori.Download.open (transfer.download, treeview); + } catch (Error error_open) { + GLib.warning (_("Failed to open download: %s"), error_open.message); + } }); menuitem.sensitive = transfer.succeeded; menu.append (menuitem); menuitem = new Gtk.ImageMenuItem.with_mnemonic (_("Open Destination _Folder")); menuitem.image = new Gtk.Image.from_stock (Gtk.STOCK_DIRECTORY, Gtk.IconSize.MENU); menuitem.activate.connect (() => { - var folder = GLib.File.new_for_uri (transfer.destination); - Sokoke.show_uri (get_screen (), folder.get_parent ().get_uri (), 0); + try { + var folder = GLib.File.new_for_uri (transfer.destination); + Sokoke.show_uri (get_screen (), folder.get_parent ().get_uri (), 0); + } catch (Error error_folder) { + GLib.warning (_("Failed to open download: %s"), error_folder.message); + } }); menu.append (menuitem); menuitem = new Gtk.ImageMenuItem.with_mnemonic (_("Copy Link Loc_ation")); @@ -312,7 +325,7 @@ namespace Transfers { progress.show_text = true; #endif progress.ellipsize = Pango.EllipsizeMode.MIDDLE; - string filename = Path.get_basename (transfer.destination); + string filename = Midori.Download.get_basename_for_display (transfer.destination); progress.text = filename; int width; Sokoke.widget_get_text_size (progress, "M", out width, null); @@ -336,8 +349,13 @@ namespace Transfers { } void button_clicked () { - if (Midori.Download.action_clear (transfer.download, button)) - transfer.remove (); + try { + if (Midori.Download.action_clear (transfer.download, button)) + transfer.remove (); + } catch (Error error) { + // Failure to open is the only known possibility here + GLib.warning (_("Failed to open download: %s"), error.message); + } } void transfer_changed () { @@ -441,12 +459,17 @@ namespace Transfers { if (transfer.succeeded) { /* FIXME: The following 2 blocks ought to be done in core */ if (transfer.action == Midori.DownloadType.OPEN) { - if (Midori.Download.action_clear (transfer.download, widgets.nth_data (0))) - transfer.remove (); + try { + if (Midori.Download.action_clear (transfer.download, widgets.nth_data (0))) + transfer.remove (); + } catch (Error error) { + // Failure to open is the only known possibility here + GLib.warning (_("Failed to open download: %s"), error.message); + } } string uri = transfer.destination; - string filename = Path.get_basename (uri); + string filename = Midori.Download.get_basename_for_display (uri); var item = new Katze.Item (); item.uri = uri; item.name = filename; diff --git a/extensions/wscript_build b/extensions/wscript_build deleted file mode 100644 index 1ba8aea5..00000000 --- a/extensions/wscript_build +++ /dev/null @@ -1,62 +0,0 @@ -#! /usr/bin/env python -# WAF build script for midori -# This file is licensed under the terms of the expat license, see the file EXPAT. - -import Options -import os - -extensions = os.listdir ('extensions') -for extension in extensions: - # FIXME In the absense of a proper mechanism, transfers is a stock extension - if not bld.env['addons'] and extension != 'transfers.vala': - continue - - folder = 'extensions' + os.sep + extension - if os.path.isdir (folder): - files = os.listdir (folder) - target = extension - source = '' - for fila in files: - if fila[-2:] == '.c' or fila[-5:] == '.vala': - source += ' ' + extension + os.sep + fila - if not source: - Utils.pprint ('RED', folder + ': No source files found') - continue - else: - if extension[-2:] == '.c': - target = extension[:-2] - elif extension[-5:] == '.vala': - target = extension[:-5] - else: - continue - source = extension - - # FIXME - if bld.env['HAVE_WEBKIT2'] and target in ['external-download-manager', 'nsplugin-manager', 'formhistory', 'adblock', 'cookie-permissions', 'addons', 'nojs']: - continue - - obj = bld.new_task_gen ('cc', 'shlib') - obj.target = target - obj.includes = '.. ../katze ../midori' - obj.source = source - obj.uselib = 'UNIQUE LIBSOUP GIO GTK SQLITE WEBKIT LIBXML GRANITE' - if 'vala' in source: - obj.env.append_value ('CCFLAGS', '-w') - obj.vapi_dirs = '../midori ../katze' - obj.packages = 'glib-2.0 gio-2.0 libsoup-2.4 sqlite3 midori midori-core katze' - if bld.env['HAVE_GTK3']: - obj.packages += ' gtk+-3.0' - else: - obj.packages += ' gtk+-2.0' - if bld.env['HAVE_WEBKIT2']: - obj.packages += ' webkit2gtk-3.0' - else: - obj.packages += ' webkitgtk-3.0' - if bld.env['HAVE_GRANITE']: - obj.packages += ' granite' - if bld.env['platform'] != 'win32': - obj.packages += ' linux' - obj.install_path = '${LIBDIR}/midori' - # See LINKFLAGS in wscript: w/ o it we get several "undefined reference" errors - if bld.env['platform'] == 'win32': - obj.uselib_local = 'midori' diff --git a/icons/wscript_build b/icons/wscript_build deleted file mode 100644 index 4e2345c9..00000000 --- a/icons/wscript_build +++ /dev/null @@ -1,44 +0,0 @@ -#! /usr/bin/env python -# WAF build script for midori -# This file is licensed under the terms of the expat license, see the file EXPAT. - -import Utils -import os - -def add_image (bld, category, name): - - srcdir = os.getcwd () - blddir = bld.bdir - - rsvg_convert = bld.env['RSVG_CONVERT'] - - if rsvg_convert: - Utils.check_dir (blddir + '/icons') - - icon_sizes = [16, 22, 24, 32, 48] - - for size in icon_sizes: - format = str (size) + 'x' + str (size) - if os.access (srcdir + '/icons/' + format + '/' + name + '.png', os.F_OK): - bld.install_files ('${MDATADIR}/icons/hicolor/' + format + '/' + category, - srcdir + '/icons/' + format + '/' + name + '.png') - elif not rsvg_convert: - pass - elif os.access (srcdir + '/icons/scalable/' + name + '.svg', os.F_OK): - Utils.check_dir (blddir + '/icons/' + format) - command = rsvg_convert + ' -w ' + str(size) + \ - ' -h ' + str(size) + \ - ' -o ' + blddir + '/icons/' + format + '/' + name + '.png' + \ - ' ' + srcdir + '/icons/scalable/' + name + '.svg' - if not Utils.exec_command (command): - bld.install_files ('${MDATADIR}/icons/hicolor/' + format + '/' + category, - blddir + '/icons/' + format + '/' + name + '.png') - else: - Utils.pprint ('BLUE', "Optimized icons could not be created.") - break - bld.install_files ('${MDATADIR}/icons/hicolor/scalable/' + category, - srcdir + '/icons/scalable/' + name + '.svg') - -add_image (bld, 'categories', 'extension') -add_image (bld, 'apps', 'midori') -add_image (bld, 'status', 'internet-news-reader') diff --git a/katze/katze-array.c b/katze/katze-array.c index 2bfb12e5..9eb40e7e 100644 --- a/katze/katze-array.c +++ b/katze/katze-array.c @@ -371,7 +371,7 @@ gpointer katze_array_find_token (KatzeArray* array, const gchar* token) { - goffset token_length; + size_t token_length; GList* items; g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL); diff --git a/katze/katze-cellrenderercomboboxtext.c b/katze/katze-cellrenderercomboboxtext.c index 390086d4..161e9ce4 100644 --- a/katze/katze-cellrenderercomboboxtext.c +++ b/katze/katze-cellrenderercomboboxtext.c @@ -67,34 +67,6 @@ katze_cell_renderer_combobox_text_render (GtkCellRenderer *cell, GtkCellRendererState flags); #endif -static void -(*_cell_renderer_get_size) (GtkCellRenderer* cell, - GtkWidget* widget, - GdkRectangle* cell_area, - gint* x_offset, - gint* y_offset, - gint* width, - gint* height); - -#if GTK_CHECK_VERSION(3,0,0) -static void -(*_cell_renderer_render) (GtkCellRenderer *cell, - cairo_t* cr, - GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GtkCellRendererState flags) = NULL; -#else -static void -(*_cell_renderer_render) (GtkCellRenderer *cell, - GdkDrawable *window, - GtkWidget *widget, - GdkRectangle *background_area, - GdkRectangle *cell_area, - GdkRectangle *expose_area, - GtkCellRendererState flags) = NULL; -#endif - enum { PROP_0, diff --git a/katze/katze-preferences.c b/katze/katze-preferences.c index f43bb951..ca28e7b5 100644 --- a/katze/katze-preferences.c +++ b/katze/katze-preferences.c @@ -15,13 +15,6 @@ #include <config.h> #endif -#ifdef HAVE_GRANITE - #if HAVE_OSX - #error FIXME granite on OSX is not implemented - #endif - #include <granite.h> -#endif - #include <string.h> #include <glib/gi18n.h> @@ -151,12 +144,7 @@ katze_preferences_prepare (KatzePreferences* preferences) { KatzePreferencesPrivate* priv = preferences->priv; - #ifdef HAVE_GRANITE - /* FIXME: granite: should return GtkWidget* like GTK+ */ - priv->notebook = (GtkWidget*)granite_widgets_static_notebook_new (FALSE); - #else priv->notebook = gtk_notebook_new (); - #endif gtk_container_set_border_width (GTK_CONTAINER (priv->notebook), 6); #if HAVE_OSX @@ -231,14 +219,8 @@ katze_preferences_add_category (KatzePreferences* preferences, priv->sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); gtk_widget_show (priv->page); gtk_container_set_border_width (GTK_CONTAINER (priv->page), 4); - #ifdef HAVE_GRANITE - granite_widgets_static_notebook_append_page ( - GRANITE_WIDGETS_STATIC_NOTEBOOK (priv->notebook), - priv->page, GTK_LABEL (gtk_label_new (label))); - #else gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), priv->page, gtk_label_new (label)); - #endif #if HAVE_OSX priv->toolbutton = GTK_WIDGET (priv->toolbutton ? gtk_radio_tool_button_new_from_widget ( diff --git a/katze/katze-throbber.c b/katze/katze-throbber.c deleted file mode 100644 index 5e063106..00000000 --- a/katze/katze-throbber.c +++ /dev/null @@ -1,932 +0,0 @@ -/* - Copyright (C) 2007-2010 Christian Dywan <christian@twotoasts.de> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - See the file COPYING for the full license text. -*/ - -#include "katze-throbber.h" - -#include "katze-utils.h" - -#include <glib/gi18n.h> -#include <math.h> - -struct _KatzeThrobber -{ - GtkSpinner parent_instance; - GtkIconSize icon_size; - gchar* icon_name; - GdkPixbuf* pixbuf; - gchar* stock_id; - gboolean animated; - gchar* static_icon_name; - GdkPixbuf* static_pixbuf; - gchar* static_stock_id; - - gint index; - gint timer_id; - gint width; - gint height; -}; - -struct _KatzeThrobberClass -{ - GtkSpinnerClass parent_class; -}; - -G_DEFINE_TYPE (KatzeThrobber, katze_throbber, GTK_TYPE_SPINNER); - -enum -{ - PROP_0, - - PROP_ICON_SIZE, - PROP_ICON_NAME, - PROP_PIXBUF, - PROP_ANIMATED, - PROP_STATIC_ICON_NAME, - PROP_STATIC_PIXBUF, - PROP_STATIC_STOCK_ID -}; - -static void -katze_throbber_dispose (GObject* object); - -static void -katze_throbber_set_property (GObject* object, - guint prop_id, - const GValue* value, - GParamSpec* pspec); - -static void -katze_throbber_get_property (GObject* object, - guint prop_id, - GValue* value, - GParamSpec* pspec); - -static void -#if GTK_CHECK_VERSION (3, 0, 0) -katze_throbber_destroy (GtkWidget* object); -#else -katze_throbber_destroy (GtkObject* object); -#endif - -static void -katze_throbber_realize (GtkWidget* widget); - -#if GTK_CHECK_VERSION (3, 0, 0) -static void -katze_throbber_get_preferred_height (GtkWidget *widget, - gint *minimal_height, - gint *natural_height); -static void -katze_throbber_get_preferred_width (GtkWidget *widget, - gint *minimal_width, - gint *natural_width); -#endif -static void -katze_throbber_unrealize (GtkWidget* widget); - -static void -katze_throbber_map (GtkWidget* widget); - -static void -katze_throbber_unmap (GtkWidget* widget); - -static void -katze_throbber_style_set (GtkWidget* widget, - GtkStyle* style); - -static void -katze_throbber_screen_changed (GtkWidget* widget, - GdkScreen* screen_prev); - -static void -katze_throbber_size_request (GtkWidget* widget, - GtkRequisition* requisition); - -static gboolean -katze_throbber_expose_event (GtkWidget* widget, -#if GTK_CHECK_VERSION (3, 0, 0) - cairo_t* cr); -#else - GdkEventExpose* event); -#endif - -static void -icon_theme_changed (KatzeThrobber* throbber); - -static void -katze_throbber_class_init (KatzeThrobberClass* class) -{ - GObjectClass* gobject_class; -#if !GTK_CHECK_VERSION (3, 0, 0) - GtkObjectClass* object_class; -#endif - GtkWidgetClass* widget_class; - GParamFlags flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT; - - gobject_class = G_OBJECT_CLASS (class); - gobject_class->dispose = katze_throbber_dispose; - gobject_class->set_property = katze_throbber_set_property; - gobject_class->get_property = katze_throbber_get_property; - - widget_class = GTK_WIDGET_CLASS (class); -#if GTK_CHECK_VERSION (3, 0, 0) - widget_class->destroy = katze_throbber_destroy; -#else - object_class = GTK_OBJECT_CLASS (class); - object_class->destroy = katze_throbber_destroy; -#endif - widget_class->realize = katze_throbber_realize; - widget_class->unrealize = katze_throbber_unrealize; - widget_class->map = katze_throbber_map; - widget_class->unmap = katze_throbber_unmap; - widget_class->style_set = katze_throbber_style_set; - widget_class->screen_changed = katze_throbber_screen_changed; -#if GTK_CHECK_VERSION (3, 0, 0) - widget_class->get_preferred_width= katze_throbber_get_preferred_width; - widget_class->get_preferred_height= katze_throbber_get_preferred_height; -#else - widget_class->size_request = katze_throbber_size_request; -#endif -#if GTK_CHECK_VERSION (3, 0, 0) - widget_class->draw = katze_throbber_expose_event; -#else - widget_class->expose_event = katze_throbber_expose_event; -#endif - g_object_class_install_property (gobject_class, - PROP_ICON_SIZE, - g_param_spec_int ( - "icon-size", - "Icon size", - "Symbolic size to use for the animation", - 0, G_MAXINT, GTK_ICON_SIZE_MENU, - flags)); - - g_object_class_install_property (gobject_class, - PROP_ICON_NAME, - g_param_spec_string ( - "icon-name", - "Icon Name", - "The name of an icon containing animation frames", - "process-working", - flags)); - - g_object_class_install_property (gobject_class, - PROP_PIXBUF, - g_param_spec_object ( - "pixbuf", - "Pixbuf", - "A GdkPixbuf containing animation frames", - GDK_TYPE_PIXBUF, - G_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_ANIMATED, - g_param_spec_boolean ( - "animated", - "Animated", - "Whether the throbber should be animated", - FALSE, - flags)); - - g_object_class_install_property (gobject_class, - PROP_STATIC_ICON_NAME, - g_param_spec_string ( - "static-icon-name", - "Static Icon Name", - "The name of an icon to be used as the static image", - NULL, - flags)); - - g_object_class_install_property (gobject_class, - PROP_STATIC_PIXBUF, - g_param_spec_object ( - "static-pixbuf", - "Static Pixbuf", - "A GdkPixbuf to be used as the static image", - GDK_TYPE_PIXBUF, - G_PARAM_READWRITE)); - - g_object_class_install_property (gobject_class, - PROP_STATIC_STOCK_ID, - g_param_spec_string ( - "static-stock-id", - "Static Stock ID", - "The stock ID of an icon to be used as the static image", - NULL, - flags)); -} - -static void -katze_throbber_init (KatzeThrobber *throbber) -{ - gtk_widget_set_has_window (GTK_WIDGET (throbber), FALSE); - - throbber->timer_id = -1; -} - -static void -katze_throbber_dispose (GObject* object) -{ - KatzeThrobber* throbber = KATZE_THROBBER (object); - - if (G_UNLIKELY (throbber->timer_id >= 0)) - g_source_remove (throbber->timer_id); - - (*G_OBJECT_CLASS (katze_throbber_parent_class)->dispose) (object); -} - -static void -#if GTK_CHECK_VERSION (3, 0, 0) -katze_throbber_destroy (GtkWidget* object) -#else -katze_throbber_destroy (GtkObject* object) -#endif -{ - KatzeThrobber* throbber = KATZE_THROBBER (object); - - katze_assign (throbber->icon_name, NULL); - katze_object_assign (throbber->pixbuf, NULL); - katze_assign (throbber->static_icon_name, NULL); - katze_object_assign (throbber->static_pixbuf, NULL); - katze_assign (throbber->static_stock_id, NULL); -#if GTK_CHECK_VERSION (3, 0, 0) - GTK_WIDGET_CLASS (katze_throbber_parent_class)->destroy (object); -#else - GTK_OBJECT_CLASS (katze_throbber_parent_class)->destroy (object); -#endif -} - -static void -katze_throbber_set_property (GObject* object, - guint prop_id, - const GValue* value, - GParamSpec* pspec) -{ - KatzeThrobber* throbber = KATZE_THROBBER (object); - - switch (prop_id) - { - case PROP_ICON_SIZE: - katze_throbber_set_icon_size (throbber, g_value_get_int (value)); - break; - case PROP_ICON_NAME: - katze_throbber_set_icon_name (throbber, g_value_get_string (value)); - break; - case PROP_PIXBUF: - katze_throbber_set_pixbuf (throbber, g_value_get_object (value)); - break; - case PROP_ANIMATED: - katze_throbber_set_animated (throbber, g_value_get_boolean (value)); - break; - case PROP_STATIC_ICON_NAME: - katze_throbber_set_static_icon_name (throbber, g_value_get_string (value)); - break; - case PROP_STATIC_PIXBUF: - katze_throbber_set_static_pixbuf (throbber, g_value_get_object (value)); - break; - case PROP_STATIC_STOCK_ID: - katze_throbber_set_static_stock_id (throbber, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -katze_throbber_get_property (GObject* object, - guint prop_id, - GValue* value, - GParamSpec* pspec) -{ - KatzeThrobber* throbber = KATZE_THROBBER (object); - - switch (prop_id) - { - case PROP_ICON_SIZE: - g_value_set_int (value, katze_throbber_get_icon_size (throbber)); - break; - case PROP_ICON_NAME: - g_value_set_string (value, katze_throbber_get_icon_name (throbber)); - break; - case PROP_PIXBUF: - g_value_set_object (value, katze_throbber_get_pixbuf (throbber)); - break; - case PROP_ANIMATED: - g_value_set_boolean (value, katze_throbber_get_animated (throbber)); - break; - case PROP_STATIC_ICON_NAME: - g_value_set_string (value, katze_throbber_get_static_icon_name (throbber)); - break; - case PROP_STATIC_PIXBUF: - g_value_set_object (value, katze_throbber_get_static_pixbuf (throbber)); - break; - case PROP_STATIC_STOCK_ID: - g_value_set_string (value, katze_throbber_get_static_stock_id (throbber)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/** - * katze_throbber_new: - * - * Creates a new throbber widget. - * - * Return value: a new #KatzeThrobber - **/ -GtkWidget* -katze_throbber_new (void) -{ - KatzeThrobber* throbber = g_object_new (KATZE_TYPE_THROBBER, - NULL); - - return GTK_WIDGET (throbber); -} - -/** - * katze_throbber_set_icon_size: - * @throbber: a #KatzeThrobber - * @icon_size: the new icon size - * - * Sets the desired size of the throbber image. The animation and static image - * will be displayed in this size. If a pixbuf is used for the animation every - * single frame is assumed to have this size. - **/ -void -katze_throbber_set_icon_size (KatzeThrobber* throbber, - GtkIconSize icon_size) -{ - GtkSettings* gtk_settings; - - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - gtk_settings = gtk_widget_get_settings (GTK_WIDGET (throbber)); - g_return_if_fail (gtk_icon_size_lookup_for_settings (gtk_settings, - icon_size, - &throbber->width, - &throbber->height)); - - throbber->icon_size = icon_size; - - g_object_notify (G_OBJECT (throbber), "icon-size"); - - gtk_widget_queue_draw (GTK_WIDGET (throbber)); -} - -/** - * katze_throbber_set_icon_name: - * @throbber: a #KatzeThrobber - * @icon_name: an icon name or %NULL - * - * Sets the name of an icon that should provide the animation frames. - * - * The pixbuf is automatically invalidated. - **/ -void -katze_throbber_set_icon_name (KatzeThrobber* throbber, - const gchar* icon_name) -{ - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - - katze_assign (throbber->icon_name, g_strdup (icon_name)); - - if (icon_name) - icon_theme_changed (throbber); - - g_object_notify (G_OBJECT (throbber), "icon-name"); -} - -/** - * katze_throbber_set_pixbuf: - * @throbber: a #KatzeThrobber - * @pixbuf: a #GdkPixbuf or %NULL - * - * Sets the pixbuf that should provide the animation frames. Every frame - * is assumed to have the icon size of the throbber, which can be specified - * with katze_throbber_set_icon_size (). - * - * The icon name is automatically invalidated. - **/ -void -katze_throbber_set_pixbuf (KatzeThrobber* throbber, - GdkPixbuf* pixbuf) -{ - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - g_return_if_fail (!pixbuf || GDK_IS_PIXBUF (pixbuf)); - - katze_object_assign (throbber->pixbuf, pixbuf); - - g_object_freeze_notify (G_OBJECT (throbber)); - - if (pixbuf) - { - g_object_ref (pixbuf); - - katze_assign (throbber->icon_name, NULL); - g_object_notify (G_OBJECT (throbber), "icon-name"); - } - - gtk_widget_queue_draw (GTK_WIDGET (throbber)); - - g_object_notify (G_OBJECT (throbber), "pixbuf"); - g_object_thaw_notify (G_OBJECT (throbber)); -} - -/** - * katze_throbber_set_animated: - * @throbber: a #KatzeThrobber - * @animated: %TRUE to animate the throbber - * - * Sets the animation state of the throbber. - **/ -void -katze_throbber_set_animated (KatzeThrobber* throbber, - gboolean animated) -{ - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - - if (G_UNLIKELY (throbber->animated == animated)) - return; - - throbber->animated = animated; - - g_object_set (throbber, "active", animated, NULL); - gtk_widget_queue_draw (GTK_WIDGET (throbber)); - - g_object_notify (G_OBJECT (throbber), "animated"); -} - -/** - * katze_throbber_set_static_icon_name: - * @throbber: a #KatzeThrobber - * @icon_name: an icon name or %NULL - * - * Sets the name of an icon that should provide the static image. - * - * The static pixbuf and stock ID are automatically invalidated. - **/ -void -katze_throbber_set_static_icon_name (KatzeThrobber* throbber, - const gchar* icon_name) -{ - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - - katze_assign (throbber->static_icon_name, g_strdup (icon_name)); - - g_object_freeze_notify (G_OBJECT (throbber)); - - if (icon_name) - { - katze_assign (throbber->static_stock_id, NULL); - - icon_theme_changed (throbber); - - g_object_notify (G_OBJECT (throbber), "static-pixbuf"); - g_object_notify (G_OBJECT (throbber), "static-stock-id"); - } - - g_object_notify (G_OBJECT (throbber), "static-icon-name"); - g_object_thaw_notify (G_OBJECT (throbber)); -} - -/** - * katze_throbber_set_static_pixbuf: - * @throbber: a #KatzeThrobber - * @pixbuf: a #GdkPixbuf or %NULL - * - * Sets the pixbuf that should provide the static image. The pixbuf is - * assumed to have the icon size of the throbber, which can be specified - * with katze_throbber_set_icon_size (). - * - * The static icon name and stock ID are automatically invalidated. - **/ -void -katze_throbber_set_static_pixbuf (KatzeThrobber* throbber, - GdkPixbuf* pixbuf) -{ - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf)); - - katze_object_assign (throbber->static_pixbuf, pixbuf); - - g_object_freeze_notify (G_OBJECT (throbber)); - - if (pixbuf) - { - g_object_ref (pixbuf); - - katze_assign (throbber->static_icon_name, NULL); - katze_assign (throbber->static_stock_id, NULL); - - gtk_widget_queue_draw (GTK_WIDGET (throbber)); - - g_object_notify (G_OBJECT (throbber), "static-icon-name"); - g_object_notify (G_OBJECT (throbber), "static-stock-id"); - } - - g_object_notify (G_OBJECT (throbber), "static-pixbuf"); - g_object_thaw_notify (G_OBJECT (throbber)); -} - -/** - * katze_throbber_set_static_stock_id: - * @throbber: a #KatzeThrobber - * @stock_id: a stock ID or %NULL - * - * Sets the stock ID of an icon that should provide the static image. - * - * The static icon name and pixbuf are automatically invalidated. - **/ -void -katze_throbber_set_static_stock_id (KatzeThrobber* throbber, - const gchar* stock_id) -{ - g_return_if_fail (KATZE_IS_THROBBER (throbber)); - - g_object_freeze_notify (G_OBJECT (throbber)); - - if (stock_id) - { - GtkStockItem stock_item; - g_return_if_fail (gtk_stock_lookup (stock_id, &stock_item)); - - g_object_notify (G_OBJECT (throbber), "static-icon-name"); - g_object_notify (G_OBJECT (throbber), "static-pixbuf"); - } - - katze_assign (throbber->static_stock_id, g_strdup (stock_id)); - - if (stock_id) - icon_theme_changed (throbber); - - g_object_notify (G_OBJECT (throbber), "static-stock-id"); - g_object_thaw_notify (G_OBJECT (throbber)); -} - -/** - * katze_throbber_get_icon_size: - * @throbber: a #KatzeThrobber - * - * Retrieves the size of the throbber. - * - * Return value: the size of the throbber - **/ -GtkIconSize -katze_throbber_get_icon_size (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), GTK_ICON_SIZE_INVALID); - - return throbber->icon_size; -} - -/** - * katze_throbber_get_icon_name: - * @throbber: a #KatzeThrobber - * - * Retrieves the name of the icon providing the animation frames. - * - * Return value: the name of the icon providing the animation frames, or %NULL - **/ -const gchar* -katze_throbber_get_icon_name (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); - - return throbber->icon_name; -} - -/** - * katze_throbber_get_pixbuf: - * @throbber: a #KatzeThrobber - * - * Retrieves the #GdkPixbuf providing the animation frames if an icon name - * or pixbuf is available. The caller of this function does not own a - * reference to the returned pixbuf. - * - * Return value: the pixbuf providing the animation frames, or %NULL - **/ -GdkPixbuf* -katze_throbber_get_pixbuf (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); - - return throbber->pixbuf; -} - -/** - * katze_throbber_get_animated: - * @throbber: a #KatzeThrobber - * - * Retrieves the status of the animation, whcih can be animated or static. - * - * Return value: %TRUE if the throbber is animated - **/ -gboolean -katze_throbber_get_animated (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), FALSE); - - return throbber->animated; -} - -/** - * katze_throbber_get_static_icon_name: - * @throbber: a #KatzeThrobber - * - * Retrieves the name of the icon providing the static image, if an icon name - * for the static image was specified. - * - * Return value: the name of the icon providing the static image, or %NULL - **/ -const gchar* -katze_throbber_get_static_icon_name (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); - - return throbber->static_icon_name; -} - -/** - * katze_throbber_get_static pixbuf: - * @throbber: a #KatzeThrobber - * - * Retrieves the #GdkPixbuf providing the static image, if an icon name, a - * pixbuf or a stock ID for the static image was specified. The caller of this - * function does not own a reference to the returned pixbuf. - * - * Return value: the pixbuf providing the static image, or %NULL - **/ -GdkPixbuf* -katze_throbber_get_static_pixbuf (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); - - return throbber->static_pixbuf; -} - -/** - * katze_throbber_get_static_stock_id: - * @throbber: a #KatzeThrobber - * - * Retrieves the stock ID of the icon providing the static image, if a - * stock ID for the static image was specified. - * - * Return value: the stock ID of the icon providing the static image, or %NULL - **/ -const gchar* -katze_throbber_get_static_stock_id (KatzeThrobber* throbber) -{ - g_return_val_if_fail (KATZE_IS_THROBBER (throbber), NULL); - - return throbber->static_stock_id; -} - -static void -katze_throbber_realize (GtkWidget* widget) -{ - (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->realize) (widget); - - icon_theme_changed (KATZE_THROBBER (widget)); -} - -static void -katze_throbber_unrealize (GtkWidget* widget) -{ - if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize) - GTK_WIDGET_CLASS (katze_throbber_parent_class)->unrealize (widget); -} - -static void -pixbuf_assign_icon (GdkPixbuf** pixbuf, - const gchar* icon_name, - KatzeThrobber* throbber) -{ - GdkScreen* screen; - GtkIconTheme* icon_theme; - - if (*pixbuf) - g_object_unref (*pixbuf); - - screen = gtk_widget_get_screen (GTK_WIDGET (throbber)); - icon_theme = gtk_icon_theme_get_for_screen (screen); - *pixbuf = gtk_icon_theme_load_icon (icon_theme, - icon_name, - MAX (throbber->width, throbber->height), - (GtkIconLookupFlags) 0, - NULL); -} - -static void -icon_theme_changed (KatzeThrobber* throbber) -{ - if (throbber->icon_name) - pixbuf_assign_icon (&throbber->pixbuf, - throbber->icon_name, throbber); - - if (throbber->static_icon_name) - pixbuf_assign_icon (&throbber->static_pixbuf, - throbber->static_icon_name, throbber); - else if (throbber->static_stock_id) - katze_object_assign (throbber->static_pixbuf, - gtk_widget_render_icon (GTK_WIDGET (throbber), - throbber->static_stock_id, - throbber->icon_size, - NULL)); - - g_object_freeze_notify (G_OBJECT (throbber)); - g_object_notify (G_OBJECT (throbber), "pixbuf"); - g_object_notify (G_OBJECT (throbber), "static-pixbuf"); - g_object_thaw_notify (G_OBJECT (throbber)); - - gtk_widget_queue_draw (GTK_WIDGET (throbber)); -} - -static void -katze_throbber_map (GtkWidget* widget) -{ - (*GTK_WIDGET_CLASS (katze_throbber_parent_class)->map) (widget); -} - -static void -katze_throbber_unmap (GtkWidget* widget) -{ - if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap) - GTK_WIDGET_CLASS (katze_throbber_parent_class)->unmap (widget); -} - -static void -katze_throbber_style_set (GtkWidget* widget, - GtkStyle* prev_style) -{ - if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set) - GTK_WIDGET_CLASS (katze_throbber_parent_class)->style_set (widget, - prev_style); - - icon_theme_changed (KATZE_THROBBER (widget)); -} - -static void -katze_throbber_screen_changed (GtkWidget* widget, - GdkScreen* prev_screen) -{ - if (GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed) - GTK_WIDGET_CLASS (katze_throbber_parent_class)->screen_changed ( - widget, - prev_screen); - - icon_theme_changed (KATZE_THROBBER (widget)); -} - -static void -katze_throbber_size_request (GtkWidget* widget, - GtkRequisition* requisition) -{ - KatzeThrobber* throbber = KATZE_THROBBER (widget); - - requisition->width = throbber->width; - requisition->height = throbber->height; -#if !GTK_CHECK_VERSION (3, 0, 0) - GTK_WIDGET_CLASS (katze_throbber_parent_class)->size_request (widget, - requisition); -#endif -} - -#if GTK_CHECK_VERSION (3, 0, 0) -static void -katze_throbber_get_preferred_height (GtkWidget *widget, - gint *minimal_height, - gint *natural_height) -{ - GtkRequisition requisition; - - katze_throbber_size_request (widget, &requisition); - - *minimal_height = *natural_height = requisition.height; -} - -static void -katze_throbber_get_preferred_width (GtkWidget *widget, - gint *minimal_width, - gint *natural_width) -{ - GtkRequisition requisition; - - katze_throbber_size_request (widget, &requisition); - - *minimal_width = *natural_width = requisition.width; -} -#endif - -static void -katze_throbber_aligned_coords (GtkWidget* widget, - gint* ax, - gint* ay) -{ - gfloat xalign, yalign; - gint xpad, ypad; - GtkAllocation allocation; - GtkRequisition requisition; - - xalign = 0.0; - yalign = 0.5; - xpad = ypad = 0.0; - - #if GTK_CHECK_VERSION (3, 0, 0) - allocation.x = allocation.y = 0; - allocation.width = gtk_widget_get_allocated_width (widget); - allocation.height = gtk_widget_get_allocated_height (widget); - gtk_widget_get_preferred_size (widget, &requisition, NULL); - #else - gtk_widget_get_allocation (widget, &allocation); - gtk_widget_size_request (widget, &requisition); - #endif - *ax = floor (allocation.x + xpad - + ((allocation.width - requisition.width) * xalign)); - *ay = floor (allocation.y + ypad - + ((allocation.height - requisition.height) * yalign)); -} - -static gboolean -katze_throbber_expose_event (GtkWidget* widget, -#if GTK_CHECK_VERSION (3, 0, 0) - cairo_t* cr) -#else - GdkEventExpose* event) -#endif -{ - KatzeThrobber* throbber = KATZE_THROBBER (widget); - gint ax, ay; - - if (G_UNLIKELY (!throbber->width || !throbber->height)) - return TRUE; - - if (G_UNLIKELY (!throbber->pixbuf && !throbber->static_pixbuf)) - if (throbber->animated && !throbber->pixbuf && !throbber->icon_name) - return TRUE; - - if (!throbber->animated && (throbber->static_pixbuf - || throbber->static_icon_name || throbber->static_stock_id)) - { -#if !GTK_CHECK_VERSION (3, 0, 0) - cairo_t* cr; -#endif - if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_icon_name)) - { - icon_theme_changed (KATZE_THROBBER (widget)); - - if (!throbber->static_pixbuf) - { - g_warning (_("Named icon '%s' couldn't be loaded"), - throbber->static_icon_name); - katze_assign (throbber->static_icon_name, NULL); - g_object_notify (G_OBJECT (throbber), "static-icon-name"); - return TRUE; - } - } - else if (G_UNLIKELY (!throbber->static_pixbuf && throbber->static_stock_id)) - { - icon_theme_changed (KATZE_THROBBER (widget)); - - if (!throbber->static_pixbuf) - { - g_warning (_("Stock icon '%s' couldn't be loaded"), - throbber->static_stock_id); - katze_assign (throbber->static_stock_id, NULL); - g_object_notify (G_OBJECT (throbber), "static-stock-id"); - return TRUE; - } - } - - katze_throbber_aligned_coords (widget, &ax, &ay); - -#if !GTK_CHECK_VERSION (3, 0, 0) - cr = gdk_cairo_create (gtk_widget_get_window (widget)); -#endif - gdk_cairo_set_source_pixbuf (cr, throbber->static_pixbuf, ax, ay); - cairo_paint (cr); -#if !GTK_CHECK_VERSION (3, 0, 0) - cairo_destroy (cr); -#endif - } - else - { - if (throbber->animated) -#if GTK_CHECK_VERSION (3, 0, 0) - return GTK_WIDGET_CLASS (katze_throbber_parent_class)->draw (widget, cr); -#else - return GTK_WIDGET_CLASS (katze_throbber_parent_class)->expose_event (widget, event); -#endif - } - - return TRUE; -} diff --git a/katze/katze-throbber.h b/katze/katze-throbber.h deleted file mode 100644 index 18c212ed..00000000 --- a/katze/katze-throbber.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - Copyright (C) 2007 Christian Dywan <christian@twotoasts.de> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - See the file COPYING for the full license text. -*/ - -#ifndef __KATZE_THROBBER_H__ -#define __KATZE_THROBBER_H__ - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define KATZE_TYPE_THROBBER \ - (katze_throbber_get_type ()) -#define KATZE_THROBBER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), KATZE_TYPE_THROBBER, KatzeThrobber)) -#define KATZE_THROBBER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST ((klass), KATZE_TYPE_THROBBER, KatzeThrobberClass)) -#define KATZE_IS_THROBBER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), KATZE_TYPE_THROBBER)) -#define KATZE_IS_THROBBER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE ((klass), KATZE_TYPE_THROBBER)) -#define KATZE_THROBBER_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), KATZE_TYPE_THROBBER, KatzeThrobberClass)) - -typedef struct _KatzeThrobber KatzeThrobber; -typedef struct _KatzeThrobberPrivate KatzeThrobberPrivate; -typedef struct _KatzeThrobberClass KatzeThrobberClass; - - -GType -katze_throbber_get_type (void) G_GNUC_CONST; - -GtkWidget* -katze_throbber_new (void); - -void -katze_throbber_set_icon_size (KatzeThrobber* throbber, - GtkIconSize icon_size); - -void -katze_throbber_set_icon_name (KatzeThrobber* throbber, - const gchar* icon_size); - -void -katze_throbber_set_pixbuf (KatzeThrobber* throbber, - GdkPixbuf* pixbuf); - -void -katze_throbber_set_animated (KatzeThrobber* throbber, - gboolean animated); - -void -katze_throbber_set_static_icon_name (KatzeThrobber* throbber, - const gchar* icon_name); - -void -katze_throbber_set_static_pixbuf (KatzeThrobber* throbber, - GdkPixbuf* pixbuf); - -void -katze_throbber_set_static_stock_id (KatzeThrobber* throbber, - const gchar* stock_id); - -GtkIconSize -katze_throbber_get_icon_size (KatzeThrobber* throbber); - -const gchar* -katze_throbber_get_icon_name (KatzeThrobber* throbber); - -GdkPixbuf* -katze_throbber_get_pixbuf (KatzeThrobber* throbber); - -gboolean -katze_throbber_get_animated (KatzeThrobber* throbber); - -const gchar* -katze_throbber_get_static_icon_name (KatzeThrobber *throbber); - -GdkPixbuf* -katze_throbber_get_static_pixbuf (KatzeThrobber* throbber); - -const gchar* -katze_throbber_get_static_stock_id (KatzeThrobber* throbber); - -G_END_DECLS - -#endif /* __KATZE_THROBBER_H__ */ diff --git a/katze/katze-utils.c b/katze/katze-utils.c index 6f9f4c77..e83f34d7 100644 --- a/katze/katze-utils.c +++ b/katze/katze-utils.c @@ -73,10 +73,12 @@ proxy_uri_file_set_cb (GtkFileChooser* button, #if GTK_CHECK_VERSION (3, 2, 0) static void proxy_font_chooser_font_activated_cb (GtkFontChooser* chooser, - const gchar* font_name, GObject* object) { - gtk_font_chooser_set_font (chooser, font_name); + PangoFontFamily* font_family = gtk_font_chooser_get_font_family (GTK_FONT_CHOOSER (chooser)); + const gchar* font_name = pango_font_family_get_name (font_family); + const gchar* property = g_object_get_data (G_OBJECT (chooser), "property"); + g_object_set (object, property, font_name, NULL); } static gboolean @@ -335,7 +337,6 @@ katze_app_info_get_all_for_category (const gchar* category) GList* all_apps = g_app_info_get_all (); #endif GList* apps = NULL; - GAppInfo* info; GList* app; for (app = apps; app; app = g_list_next (app)) { @@ -394,7 +395,7 @@ proxy_populate_apps (GtkWidget* widget) GList* app; for (app = apps; app; app = g_list_next (app)) { - GAppInfo* info = app->data; + info = app->data; const gchar* name = g_app_info_get_name (info); GIcon* icon = g_app_info_get_icon (info); gchar* icon_name; @@ -615,7 +616,8 @@ katze_property_proxy (gpointer object, widget = gtk_font_button_new (); gtk_font_button_set_show_size (GTK_FONT_BUTTON (widget), FALSE); gtk_font_chooser_set_font (GTK_FONT_CHOOSER (widget), string); - g_signal_connect (widget, "font-activated", + /* font-activated doesn't work with at least GTK+ 3.8.4 */ + g_signal_connect (widget, "font-set", G_CALLBACK (proxy_font_chooser_font_activated_cb), object); gtk_font_chooser_set_filter_func (GTK_FONT_CHOOSER (widget), (GtkFontFilterFunc)proxy_font_chooser_filter_monospace_cb, GINT_TO_POINTER (monospace), NULL); diff --git a/katze/katze.h b/katze/katze.h index 5d5b780b..6518b659 100644 --- a/katze/katze.h +++ b/katze/katze.h @@ -13,7 +13,6 @@ #define __KATZE_H__ #include "katze-http-auth.h" -#include "katze-throbber.h" #include "katze-utils.h" #include "katze-item.h" #include "katze-array.h" diff --git a/katze/katze.vapi b/katze/katze.vapi index 73eb663d..1f03a4f7 100644 --- a/katze/katze.vapi +++ b/katze/katze.vapi @@ -33,6 +33,8 @@ namespace Katze { public bool get_meta_boolean (string key); public int64 get_meta_integer (string key); public void set_meta_integer (string key, int64 value); + public unowned string? get_meta_string (string key); + public void set_meta_string (string key, string value); } } diff --git a/katze/midori-paths.vala b/katze/midori-paths.vala index 42007039..7f74aaa2 100644 --- a/katze/midori-paths.vala +++ b/katze/midori-paths.vala @@ -157,6 +157,18 @@ namespace Midori { WebKit.get_favicon_database ().set_path (folder); #endif } + else + { +#if HAVE_WEBKIT2 + /* with wk2 set_favicon_database_directory can only be called once and actually + initializes and enables the favicon database, so we do not call it in this case */ +#else + /* wk1 documentation claims that the favicon database is not enabled unless + a call to favicon_database.set_path is made, but in fact it must be explicitly + disabled by setting to null (verified as of webkitgtk 2.3.1) */ + WebKit.get_favicon_database ().set_path (null); +#endif + } if (strcmp (Environment.get_variable ("MIDORI_DEBUG"), "paths") == 0) { stdout.printf ("config: %s\ncache: %s\nuser_data: %s\ntmp: %s\n", config_dir, cache_dir, user_data_dir, tmp_dir); @@ -354,7 +366,7 @@ namespace Midori { return path; /* Fallback to build folder */ - File? parent = File.new_for_path (exec_path).get_parent (); + File? parent = File.new_for_path (exec_path); while (parent != null) { var data = parent.get_child ("data"); var child = data.get_child (filename); diff --git a/katze/midori-uri.vala b/katze/midori-uri.vala index 41216e17..4eda36d6 100644 --- a/katze/midori-uri.vala +++ b/katze/midori-uri.vala @@ -17,9 +17,7 @@ namespace GLib { namespace Midori { public class URI : Object { public static string? parse_hostname (string? uri, out string path) { - /* path may be null. */ - if (&path != null) - path = null; + path = null; if (uri == null) return uri; unowned string? hostname = uri.chr (-1, '/'); @@ -27,10 +25,8 @@ namespace Midori { || hostname.chr (-1, ' ') != null) return null; hostname = hostname.offset (2); - if (&path != null) { - if ((path = hostname.chr (-1, '/')) != null) - return hostname.split ("/")[0]; - } + if ((path = hostname.chr (-1, '/')) != null) + return hostname.split ("/")[0]; return hostname; } /* Deprecated: 0.4.3 */ @@ -53,9 +49,9 @@ namespace Midori { return uri; } public static string get_base_domain (string uri) { - string ascii = to_ascii (uri); #if HAVE_LIBSOUP_2_40_0 try { + string ascii = to_ascii (uri); return Soup.tld_get_base_domain (ascii); } catch (Error error) { /* This is fine, we fallback to hostname */ @@ -205,11 +201,8 @@ namespace Midori { /* No SHA256: no known usage and no need for strong encryption */ - if (&checksum != null) - checksum = fragment != null - ? fragment.offset (delimiter.length) : null; - if (&label != null) - label = display; + checksum = fragment != null ? fragment.offset (delimiter.length) : null; + label = display; return type; } } diff --git a/midori/main.c b/midori/main.c index 0f12e0cf..30a2a6b4 100644 --- a/midori/main.c +++ b/midori/main.c @@ -219,7 +219,7 @@ main (int argc, else if (type == G_TYPE_PARAM_ENUM) { GEnumClass* enum_class = G_ENUM_CLASS (g_type_class_peek (pspec->value_type)); - gint j = 0; + guint j = 0; tname_string = g_string_new (""); for (j = 0; j < enum_class->n_values; j++) { diff --git a/midori/midori-app.c b/midori/midori-app.c index 7e3162e7..8d6d177c 100644 --- a/midori/midori-app.c +++ b/midori/midori-app.c @@ -615,6 +615,11 @@ midori_app_get_name (MidoriApp* app) gboolean midori_app_get_crashed (MidoriApp* app) { + static gint cache = -1; + + if (cache != -1) + return (gboolean) cache; + if (!midori_paths_is_readonly ()) { /* We test for the presence of a dummy file which is created once @@ -624,10 +629,14 @@ midori_app_get_crashed (MidoriApp* app) if (!crashed) g_file_set_contents (config_file, "RUNNING", -1, NULL); g_free (config_file); - if (crashed) + if (crashed) { + cache = 1; return TRUE; + } } + cache = 0; + return FALSE; } diff --git a/midori/midori-bookmarks-db.c b/midori/midori-bookmarks-db.c index 47b8ee0f..b858454f 100644 --- a/midori/midori-bookmarks-db.c +++ b/midori/midori-bookmarks-db.c @@ -39,11 +39,7 @@ struct _MidoriBookmarksDb KatzeArray parent_instance; sqlite3* db; - GList* pending_inserts; - GHashTable* pending_updates; - GHashTable* pending_deletes; GHashTable* all_items; - gboolean in_idle_func; }; struct _MidoriBookmarksDbClass @@ -87,9 +83,6 @@ static void _midori_bookmarks_db_clear (KatzeArray* array); static void -midori_bookmarks_db_force_idle (MidoriBookmarksDb* bookmarks); - -static void midori_bookmarks_db_finalize (GObject* object); static gint64 @@ -154,13 +147,8 @@ static void midori_bookmarks_db_init (MidoriBookmarksDb* bookmarks) { bookmarks->db = NULL; - bookmarks->pending_inserts = NULL; - bookmarks->pending_updates = g_hash_table_new (item_hash, item_equal); - bookmarks->pending_deletes = g_hash_table_new (item_hash, item_equal); bookmarks->all_items = g_hash_table_new (item_hash, item_equal); - bookmarks->in_idle_func = FALSE; - katze_item_set_meta_integer (KATZE_ITEM (bookmarks), "id", -1); katze_item_set_name (KATZE_ITEM (bookmarks), _("Bookmarks")); g_hash_table_insert (bookmarks->all_items, bookmarks, bookmarks); @@ -174,13 +162,9 @@ midori_bookmarks_db_finalize (GObject* object) if (bookmarks->db) { - midori_bookmarks_db_force_idle (bookmarks); sqlite3_close (bookmarks->db); } - g_list_free (bookmarks->pending_inserts); - g_hash_table_unref (bookmarks->pending_updates); - g_hash_table_unref (bookmarks->pending_deletes); g_hash_table_unref (bookmarks->all_items); G_OBJECT_CLASS (midori_bookmarks_db_parent_class)->finalize (object); @@ -240,7 +224,6 @@ _midori_bookmarks_db_add_item (KatzeArray* array, g_return_if_fail (KATZE_IS_ITEM (item)); bookmarks = MIDORI_BOOKMARKS_DB (array); - g_return_if_fail (bookmarks->in_idle_func); parent = katze_item_get_parent (KATZE_ITEM (item)); @@ -280,8 +263,6 @@ _midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); g_return_if_fail (KATZE_IS_ITEM (item)); - g_return_if_fail (bookmarks->in_idle_func); - parent = katze_item_get_parent (KATZE_ITEM (item)); g_return_if_fail (parent); @@ -301,15 +282,11 @@ static void _midori_bookmarks_db_remove_item (KatzeArray* array, gpointer item) { - MidoriBookmarksDb *bookmarks; KatzeArray* parent; g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); g_return_if_fail (KATZE_IS_ITEM (item)); - bookmarks = MIDORI_BOOKMARKS_DB (array); - g_return_if_fail (bookmarks->in_idle_func); - parent = katze_item_get_parent (KATZE_ITEM (item)); g_return_if_fail (parent); @@ -334,7 +311,6 @@ _midori_bookmarks_db_move_item (KatzeArray* array, gpointer item, gint position) { - MidoriBookmarksDb *bookmarks; KatzeArray* parent; g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); @@ -380,50 +356,6 @@ midori_bookmarks_db_signal_update_item (MidoriBookmarksDb* array, } /** - * midori_bookmarks_db_begin_transaction: - * @db: the removed #KatzeItem - * - * Internal function that starts an SQL transaction. - **/ -static gboolean -midori_bookmarks_db_begin_transaction (sqlite3* db) -{ - char* errmsg = NULL; - - if (sqlite3_exec (db, "BEGIN TRANSACTION;", NULL, NULL, &errmsg) != SQLITE_OK) - { - g_printerr (_("Failed to begin transaction: %s\n"), errmsg); - sqlite3_free (errmsg); - return FALSE; - } - - return TRUE; -} - -/** - * midori_bookmarks_db_end_transaction: - * @db: the removed #KatzeItem - * @commit : boolean - * - * Internal function that ends an SQL transaction. - * If @commit is %TRUE, the transaction is ended by a COMMIT. - * It is ended by a ROLLBACK otherwise. - **/ -static void -midori_bookmarks_db_end_transaction (sqlite3* db, gboolean commit) -{ - char* errmsg = NULL; - if (sqlite3_exec (db, (commit ? "COMMIT;" : "ROLLBACK;"), NULL, NULL, &errmsg) != SQLITE_OK) - { - if (commit) - g_printerr (_("Failed to end transaction: %s\n"), errmsg); - else - g_printerr (_("Failed to cancel transaction: %s\n"), errmsg); - sqlite3_free (errmsg); - } -} - -/** * midori_bookmarks_db_add_item_recursive: * @item: the removed #KatzeItem * @bookmarks : the main bookmarks array @@ -476,26 +408,11 @@ static void midori_bookmarks_db_remove_item_recursive (KatzeItem* item, MidoriBookmarksDb* bookmarks) { - GHashTableIter hash_iter; - gpointer key, value; gpointer found; KatzeArray* array; KatzeItem* child; GList* list; - if (NULL != (found = g_list_find (bookmarks->pending_inserts, item))) - { - g_object_unref (((GList*)found)->data); - bookmarks->pending_inserts = g_list_delete_link (bookmarks->pending_inserts, - ((GList*)found)); - } - - if (NULL != (found = g_hash_table_lookup (bookmarks->pending_updates, item))) - { - g_hash_table_remove (bookmarks->pending_updates, found); - g_object_unref (found); - } - if (NULL != (found = g_hash_table_lookup (bookmarks->all_items, item))) { g_hash_table_remove (bookmarks->all_items, found); @@ -516,119 +433,6 @@ midori_bookmarks_db_remove_item_recursive (KatzeItem* item, } /** - * midori_bookmarks_db_idle_func: - * @data: the main bookmark array - * - * Internal function executed during idle time that Packs pending database - * operations in one transaction. - * - * Pending operations are either: - * a. a list of pending add items, - * all child #KatzeItem of a #KatzeArray are recursively added. - * Each added #KatzeItem is memorized for future use. - * (See %midori_bookmarks_db_array_from_statement()) - * b. a hash table of items to update, - * c. or a hash table of items to remove - * the database CASCADE on delete takes care of removal of the childs - * #KatzeItem of a #KatzeArray in the database - * - * When database operations are done, the #KatzeArray equivalent operations - * are called to: - * 1. update the #KatzeArray tree content - * 2. signal the client views of the #KatzeArray tree content change. - **/ -static gboolean -midori_bookmarks_db_idle_func (gpointer data) -{ - GTimer *timer = g_timer_new(); - gint count = 0; - gulong microseconds; - gboolean with_transaction; - MidoriBookmarksDb* bookmarks = MIDORI_BOOKMARKS_DB (data); - GList* list_iter; - GHashTableIter hash_iter; - gpointer key, value; - - bookmarks->in_idle_func = TRUE; - - g_timer_start (timer); - - with_transaction = midori_bookmarks_db_begin_transaction (bookmarks->db); - - for (list_iter = bookmarks->pending_inserts; list_iter; list_iter = g_list_next (list_iter)) - { - KatzeItem *item = KATZE_ITEM (list_iter->data); - - count += midori_bookmarks_db_add_item_recursive (bookmarks, item); - katze_array_add_item (KATZE_ARRAY (bookmarks), item); - - g_object_unref (item); - } - - g_hash_table_iter_init (&hash_iter, bookmarks->pending_updates); - - while (g_hash_table_iter_next (&hash_iter, &key, &value)) - { - KatzeItem *item = KATZE_ITEM (value); - - midori_bookmarks_db_update_item_db (bookmarks->db, item); - midori_bookmarks_db_signal_update_item (bookmarks, item); - g_object_unref (item); - count++; - } - - g_hash_table_iter_init (&hash_iter, bookmarks->pending_deletes); - - while (g_hash_table_iter_next (&hash_iter, &key, &value)) - { - KatzeItem *item = KATZE_ITEM (value); - - midori_bookmarks_db_remove_item_db (bookmarks->db, item); - katze_array_remove_item (KATZE_ARRAY (bookmarks), item); - g_object_unref (item); - count++; - } - - if (with_transaction) - midori_bookmarks_db_end_transaction (bookmarks->db, TRUE); - - g_timer_elapsed (timer, µseconds); - g_print ("midori_bookmarks_db_idle: %d DB operation(s) in %lu micro-seconds\n", - count, microseconds); - - g_timer_destroy (timer); - - g_hash_table_remove_all (bookmarks->pending_deletes); - g_hash_table_remove_all (bookmarks->pending_updates); - g_list_free (bookmarks->pending_inserts); - bookmarks->pending_inserts = NULL; - - bookmarks->in_idle_func = FALSE; - - return FALSE; -} - -/** - * midori_bookmarks_db_idle_start: - * @bookmarks: the main bookmark array - * - * Internal function that checks whether idle processing is pending, - * if not, add a new one. - **/ -static void -midori_bookmarks_db_idle_start (MidoriBookmarksDb* bookmarks) -{ - g_return_if_fail (bookmarks->db != NULL); - - if (bookmarks->pending_inserts - || g_hash_table_size (bookmarks->pending_updates) - || g_hash_table_size (bookmarks->pending_deletes)) - return; - - g_idle_add (midori_bookmarks_db_idle_func, bookmarks); -} - -/** * midori_bookmarks_db_insert_item_db: * @db: the #sqlite3 * @item: #KatzeItem the item to insert @@ -827,22 +631,11 @@ midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) { g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); g_return_if_fail (KATZE_IS_ITEM (item)); + g_return_if_fail (NULL == katze_item_get_meta_string (item, "id")); - /* Force NULL id for database addition */ - if (NULL != katze_item_get_meta_string (item, "id")) - { - katze_item_set_meta_string (item, "id", NULL); - } - - gpointer found = g_list_find (bookmarks->pending_inserts, item); - - if (found) - return; - - midori_bookmarks_db_idle_start (bookmarks); + midori_bookmarks_db_add_item_recursive (bookmarks, item); - g_object_ref (item); - bookmarks->pending_inserts = g_list_append (bookmarks->pending_inserts, item); + katze_array_add_item (KATZE_ARRAY (bookmarks), item); } /** @@ -862,15 +655,9 @@ midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) g_return_if_fail (katze_item_get_meta_string (item, "id")); g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); - gpointer found = g_hash_table_lookup (bookmarks->pending_updates, item); - - if (found) - return; - - midori_bookmarks_db_idle_start (bookmarks); + midori_bookmarks_db_update_item_db (bookmarks->db, item); - g_object_ref (item); - g_hash_table_insert (bookmarks->pending_updates, item, item); + midori_bookmarks_db_signal_update_item (bookmarks, item); } /** @@ -890,85 +677,11 @@ midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) g_return_if_fail (katze_item_get_meta_string (item, "id")); g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); - gpointer found = g_hash_table_lookup (bookmarks->pending_deletes, item); - - if (found) - return; - - midori_bookmarks_db_idle_start (bookmarks); - midori_bookmarks_db_remove_item_recursive (item, bookmarks); + midori_bookmarks_db_remove_item_db (bookmarks->db, item); - g_object_ref (item); - g_hash_table_insert (bookmarks->pending_deletes, item, item); -} - -#define _APPEND_TO_SQL_ERRORMSG(custom_errmsg) \ - do { \ - if (sql_errmsg) \ - { \ - g_string_append_printf (errmsg_str, "%s : %s\n", custom_errmsg, sql_errmsg); \ - sqlite3_free (sql_errmsg); \ - } \ - else \ - g_string_append (errmsg_str, custom_errmsg); \ - } while (0) - -static gboolean -midori_bookmarks_db_import_from_old_db (sqlite3* db, - const gchar* oldfile, - gchar** errmsg) -{ - gint sql_errcode; - gboolean failure = FALSE; - gchar* sql_errmsg = NULL; - GString* errmsg_str = g_string_new (NULL); - gchar* attach_stmt = sqlite3_mprintf ("ATTACH DATABASE %Q AS old_db;", oldfile); - const gchar* convert_stmts = - "BEGIN TRANSACTION;" - "INSERT INTO main.bookmarks (parentid, title, uri, desc, app, toolbar) " - "SELECT NULL AS parentid, title, uri, desc, app, toolbar " - "FROM old_db.bookmarks;" - "UPDATE main.bookmarks SET parentid = (" - "SELECT id FROM main.bookmarks AS b1 WHERE b1.title = (" - "SELECT folder FROM old_db.bookmarks WHERE title = main.bookmarks.title));" - "COMMIT;"; - const gchar* detach_stmt = "DETACH DATABASE old_db;"; - - *errmsg = NULL; - sql_errcode = sqlite3_exec (db, attach_stmt, NULL, NULL, &sql_errmsg); - sqlite3_free (attach_stmt); - - if (sql_errcode != SQLITE_OK) - { - _APPEND_TO_SQL_ERRORMSG (_("failed to ATTACH old db")); - goto convert_failed; - } - - if (sqlite3_exec (db, convert_stmts, NULL, NULL, &sql_errmsg) != SQLITE_OK) - { - failure = TRUE; - _APPEND_TO_SQL_ERRORMSG (_("failed to import from old db")); - - /* try to get back to previous state */ - if (sqlite3_exec (db, "ROLLBACK TRANSACTION;", NULL, NULL, &sql_errmsg) != SQLITE_OK) - _APPEND_TO_SQL_ERRORMSG (_("failed to rollback the transaction")); - } - - if (sqlite3_exec (db, detach_stmt, NULL, NULL, &sql_errmsg) != SQLITE_OK) - _APPEND_TO_SQL_ERRORMSG (_("failed to DETACH ")); - - if (failure) - { - convert_failed: - *errmsg = g_string_free (errmsg_str, FALSE); - g_print ("ERRORR: %s\n", errmsg_str->str); - return FALSE; - } - - return TRUE; + katze_array_remove_item (KATZE_ARRAY (bookmarks), item); } -#undef _APPEND_TO_SQL_ERRORMSG static void midori_bookmarks_db_dbtracer (void* dummy, @@ -989,177 +702,33 @@ midori_bookmarks_db_dbtracer (void* dummy, MidoriBookmarksDb* midori_bookmarks_db_new (char** errmsg) { - sqlite3* db; - gchar* oldfile; - gchar* newfile; - gboolean newfile_did_exist, oldfile_exists; - const gchar* create_stmt; - gchar* sql_errmsg = NULL; - gchar* import_errmsg = NULL; - KatzeArray* array; - MidoriBookmarksDb* bookmarks; + MidoriBookmarksDatabase* database; + GError* error = NULL; + sqlite3* db; + MidoriBookmarksDb* bookmarks; g_return_val_if_fail (errmsg != NULL, NULL); - oldfile = midori_paths_get_config_filename_for_writing ("bookmarks.db"); - oldfile_exists = g_access (oldfile, F_OK) == 0; - newfile = midori_paths_get_config_filename_for_writing ("bookmarks_v2.db"); - newfile_did_exist = g_access (newfile, F_OK) == 0; - - /* sqlite3_open will create the file if it did not exists already */ - if (sqlite3_open (newfile, &db) != SQLITE_OK) + database = midori_bookmarks_database_new (&error); + + if (error != NULL) { - *errmsg = g_strdup_printf (_("Failed to open database: %s\n"), - db ? sqlite3_errmsg (db) : "(db = NULL)"); - goto init_failed; + *errmsg = g_strdup (error->message); + g_error_free (error); + return NULL; } + db = midori_database_get_db (MIDORI_DATABASE (database)); + g_return_val_if_fail (db != NULL, NULL); + if (midori_debug ("bookmarks")) sqlite3_trace (db, midori_bookmarks_db_dbtracer, NULL); - create_stmt = /* Table structure */ - "CREATE TABLE IF NOT EXISTS bookmarks " - "(id INTEGER PRIMARY KEY AUTOINCREMENT, " - "parentid INTEGER DEFAULT NULL, " - "title TEXT, uri TEXT, desc TEXT, app INTEGER, toolbar INTEGER, " - "pos_panel INTEGER, pos_bar INTEGER, " - "created DATE DEFAULT CURRENT_TIMESTAMP, " - "last_visit DATE, visit_count INTEGER DEFAULT 0, " - "nick TEXT, " - "FOREIGN KEY(parentid) REFERENCES bookmarks(id) " - "ON DELETE CASCADE); PRAGMA foreign_keys = ON;" - - /* trigger: insert panel position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkInsertPosPanel " - "AFTER INSERT ON bookmarks FOR EACH ROW " - "BEGIN UPDATE bookmarks SET pos_panel = (" - "SELECT ifnull(MAX(pos_panel),0)+1 FROM bookmarks WHERE " - "(NEW.parentid IS NOT NULL AND parentid = NEW.parentid) " - "OR (NEW.parentid IS NULL AND parentid IS NULL)) " - "WHERE id = NEW.id; END;" - - /* trigger: insert Bookmarkbar position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkInsertPosBar " - "AFTER INSERT ON bookmarks FOR EACH ROW WHEN NEW.toolbar=1 " - "BEGIN UPDATE bookmarks SET pos_bar = (" - "SELECT ifnull(MAX(pos_bar),0)+1 FROM bookmarks WHERE " - "((NEW.parentid IS NOT NULL AND parentid = NEW.parentid) " - "OR (NEW.parentid IS NULL AND parentid IS NULL)) AND toolbar=1) " - "WHERE id = NEW.id; END;" - - /* trigger: update panel position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosPanel " - "BEFORE UPDATE OF parentid ON bookmarks FOR EACH ROW " - "WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL) " - "AND NEW.parentid IS NOT OLD.parentid) OR " - "((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL) " - "AND NEW.parentid!=OLD.parentid) " - "BEGIN UPDATE bookmarks SET pos_panel = pos_panel-1 " - "WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) " - "OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_panel > OLD.pos_panel; " - "UPDATE bookmarks SET pos_panel = (" - "SELECT ifnull(MAX(pos_panel),0)+1 FROM bookmarks " - "WHERE (NEW.parentid IS NOT NULL AND parentid = NEW.parentid) " - "OR (NEW.parentid IS NULL AND parentid IS NULL)) " - "WHERE id = OLD.id; END;" - - /* trigger: update Bookmarkbar position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosBar0 " - "AFTER UPDATE OF parentid, toolbar ON bookmarks FOR EACH ROW " - "WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL) " - "AND NEW.parentid IS NOT OLD.parentid) " - "OR ((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL) " - "AND NEW.parentid!=OLD.parentid) OR (OLD.toolbar=1 AND NEW.toolbar=0) " - "BEGIN UPDATE bookmarks SET pos_bar = NULL WHERE id = NEW.id; " - "UPDATE bookmarks SET pos_bar = pos_bar-1 " - "WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) " - "OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_bar > OLD.pos_bar; END;" - - /* trigger: update Bookmarkbar position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkUpdatePosBar1 " - "BEFORE UPDATE OF parentid, toolbar ON bookmarks FOR EACH ROW " - "WHEN ((NEW.parentid IS NULL OR OLD.parentid IS NULL) " - "AND NEW.parentid IS NOT OLD.parentid) OR " - "((NEW.parentid IS NOT NULL AND OLD.parentid IS NOT NULL) " - "AND NEW.parentid!=OLD.parentid) OR (OLD.toolbar=0 AND NEW.toolbar=1) " - "BEGIN UPDATE bookmarks SET pos_bar = (" - "SELECT ifnull(MAX(pos_bar),0)+1 FROM bookmarks WHERE " - "(NEW.parentid IS NOT NULL AND parentid = NEW.parentid) " - "OR (NEW.parentid IS NULL AND parentid IS NULL)) " - "WHERE id = OLD.id; END;" - - /* trigger: delete panel position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkDeletePosPanel " - "AFTER DELETE ON bookmarks FOR EACH ROW " - "BEGIN UPDATE bookmarks SET pos_panel = pos_panel-1 " - "WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) " - "OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_panel > OLD.pos_panel; END;" - - /* trigger: delete Bookmarkbar position */ - "CREATE TRIGGER IF NOT EXISTS bookmarkDeletePosBar " - "AFTER DELETE ON bookmarks FOR EACH ROW WHEN OLD.toolbar=1 " - "BEGIN UPDATE bookmarks SET pos_bar = pos_bar-1 " - "WHERE ((OLD.parentid IS NOT NULL AND parentid = OLD.parentid) " - "OR (OLD.parentid IS NULL AND parentid IS NULL)) AND pos_bar > OLD.pos_bar; END;"; - - - if (newfile_did_exist) - { - const gchar* setup_stmt = "PRAGMA foreign_keys = ON;"; - /* initial setup */ - if (sqlite3_exec (db, setup_stmt, NULL, NULL, &sql_errmsg) != SQLITE_OK) - { - *errmsg = g_strdup_printf (_("Couldn't setup bookmarks: %s\n"), - sql_errmsg ? sql_errmsg : "(err = NULL)"); - sqlite3_free (sql_errmsg); - goto init_failed; - } - - /* we are done */ - goto init_success; - } - else - { - /* initial creation */ - if (sqlite3_exec (db, create_stmt, NULL, NULL, &sql_errmsg) != SQLITE_OK) - { - *errmsg = g_strdup_printf (_("Couldn't create bookmarks table: %s\n"), - sql_errmsg ? sql_errmsg : "(err = NULL)"); - sqlite3_free (sql_errmsg); - - /* we can as well remove the new file */ - g_unlink (newfile); - goto init_failed; - } - - } - - if (oldfile_exists) - /* import from old db */ - if (!midori_bookmarks_db_import_from_old_db (db, oldfile, &import_errmsg)) - { - *errmsg = g_strdup_printf (_("Couldn't import from old database: %s\n"), - import_errmsg ? import_errmsg : "(err = NULL)"); - g_free (import_errmsg); - } - - init_success: - g_free (newfile); - g_free (oldfile); - bookmarks = MIDORI_BOOKMARKS_DB (g_object_new (TYPE_MIDORI_BOOKMARKS_DB, NULL)); - bookmarks->db = db; - - g_object_set_data (G_OBJECT (bookmarks), "db", db); - return bookmarks; + bookmarks = MIDORI_BOOKMARKS_DB (g_object_new (TYPE_MIDORI_BOOKMARKS_DB, NULL)); + bookmarks->db = db; - init_failed: - g_free (newfile); - g_free (oldfile); - - if (db) - sqlite3_close (db); - - return NULL; + g_object_set_data (G_OBJECT (bookmarks), "db", db); + return bookmarks; } /** @@ -1202,32 +771,15 @@ midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks, KATZE_ARRAY_FOREACH_ITEM_L (item, array, list) { + /* IDs coming from previously exported database must be forgotten */ + katze_item_set_meta_integer (item, "id", -1); katze_item_set_meta_integer (item, "parentid", parentid); midori_bookmarks_db_add_item (bookmarks, item); } - g_list_free (list); } /** - * midori_bookmarks_db_force_idle: - * @array: the main bookmark array - * - * Internal function that checks if idle processing is pending. - * If it is the case, removes it from idle time processing and - * executes it immediately. - **/ -static void -midori_bookmarks_db_force_idle (MidoriBookmarksDb* bookmarks) -{ - if (bookmarks->in_idle_func) - return; - - if (g_idle_remove_by_data (bookmarks)) - midori_bookmarks_db_idle_func (bookmarks); -} - -/** * midori_bookmarks_db_array_from_statement: * @stmt: the sqlite returned statement * @bookmarks: the database controller @@ -1261,7 +813,7 @@ midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt, { gint i; KatzeItem* item; - KatzeItem* found; + gpointer found; item = katze_item_new (); for (i = 0; i < cols; i++) @@ -1307,8 +859,7 @@ midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt, * @array: the main bookmark array * @sqlcmd: the sqlcmd to execute * - * Internal function that first forces pending idle processing to update the - * database then process the requested @sqlcmd. + * Internal function that process the requested @sqlcmd. * * Return value: a #KatzeArray on success, %NULL otherwise **/ @@ -1321,8 +872,6 @@ midori_bookmarks_db_array_from_sqlite (MidoriBookmarksDb* bookmarks, g_return_val_if_fail (bookmarks->db != NULL, NULL); - midori_bookmarks_db_force_idle (bookmarks); - result = sqlite3_prepare_v2 (bookmarks->db, sqlcmd, -1, &stmt, NULL); if (result != SQLITE_OK) return NULL; diff --git a/midori/midori-bookmarksdatabase.vala b/midori/midori-bookmarksdatabase.vala new file mode 100644 index 00000000..c678035b --- /dev/null +++ b/midori/midori-bookmarksdatabase.vala @@ -0,0 +1,101 @@ +/* + Copyright (C) 2013 Andre Auzi <aauzi@free.fr> + Copyright (C) 2013 Christian Dywan <christian@twotoats.de> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +namespace Midori { + public class BookmarksDatabase : Midori.Database { + public BookmarksDatabase () throws DatabaseError { + Object (path: "bookmarks.db"); + preinit (); + init (); + exec ("PRAGMA foreign_keys = ON;"); + } + + protected void preinit () throws DatabaseError { + string dbfile = Paths.get_config_filename_for_writing (path); + string olddbfile = dbfile + ".old"; + string dbfile_v2 = Paths.get_config_filename_for_reading ("bookmarks_v2.db"); + + if (Posix.access (dbfile_v2, Posix.F_OK) == 0) { + if (Posix.access (dbfile, Posix.F_OK) == 0) { + if (Posix.access (olddbfile, Posix.F_OK) == 0) + Posix.unlink (olddbfile); + GLib.FileUtils.rename (dbfile, olddbfile); + } + + GLib.FileUtils.rename (dbfile_v2, dbfile); + + if (Sqlite.Database.open_v2 (dbfile, out _db) != Sqlite.OK) + throw new DatabaseError.OPEN ("Failed to open database %s".printf (path)); + + Sqlite.Statement stmt; + if (db.prepare_v2 ("PRAGMA user_version;", -1, out stmt, null) != Sqlite.OK) + throw new DatabaseError.EXECUTE ("Failed to compile statement %s".printf (db.errmsg ())); + if (stmt.step () != Sqlite.ROW) + throw new DatabaseError.EXECUTE ("Failed to get row %s".printf (db.errmsg ())); + int64 user_version = stmt.column_int64 (0); + + if (user_version == 0) { + exec ("PRAGMA user_version = 1;"); + } + + _db = null; + } else if (Posix.access (dbfile, Posix.F_OK) == 0) { + + if (Sqlite.Database.open_v2 (dbfile, out _db) != Sqlite.OK) + throw new DatabaseError.OPEN ("Failed to open database %s".printf (path)); + + Sqlite.Statement stmt; + if (db.prepare_v2 ("PRAGMA user_version;", -1, out stmt, null) != Sqlite.OK) + throw new DatabaseError.EXECUTE ("Failed to compile statement %s".printf (db.errmsg ())); + if (stmt.step () != Sqlite.ROW) + throw new DatabaseError.EXECUTE ("Failed to get row %s".printf (db.errmsg ())); + int64 user_version = stmt.column_int64 (0); + + _db = null; + + if (user_version == 0) { + if (Posix.access (olddbfile, Posix.F_OK) == 0) + Posix.unlink (olddbfile); + + GLib.FileUtils.rename (dbfile, olddbfile); + + if (Sqlite.Database.open_v2 (dbfile, out _db) != Sqlite.OK) + throw new DatabaseError.OPEN ("Failed to open database %s".printf (path)); + + exec_script ("Create"); + + if (db.exec ("ATTACH DATABASE '%s' AS old_db;".printf (olddbfile)) != Sqlite.OK) + throw new DatabaseError.EXECUTE ("Failed to attach old database : %s (%s)".printf (olddbfile, db.errmsg ())); + + bool failure = false; + try { + exec_script ("Import_old_db_bookmarks"); + } catch (DatabaseError error) { + if (error is DatabaseError.EXECUTE) + failure = true; + else + throw error; + } + + /* try to get back to previous state */ + if (failure) + exec ("ROLLBACK TRANSACTION;"); + + exec ("DETACH DATABASE old_db;"); + exec ("PRAGMA user_version = 1;"); + + _db = null; + } + } + } + } +} diff --git a/midori/midori-browser.c b/midori/midori-browser.c index c29e6a96..8f460743 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -82,7 +82,6 @@ struct _MidoriBrowser gint last_window_width, last_window_height; guint alloc_timeout; - gint last_tab_size; guint panel_timeout; MidoriWebSettings* settings; @@ -91,6 +90,7 @@ struct _MidoriBrowser KatzeArray* trash; KatzeArray* search_engines; KatzeArray* history; + MidoriHistoryDatabase* history_database; MidoriSpeedDial* dial; gboolean show_tabs; @@ -178,10 +178,6 @@ static void midori_bookmarkbar_clear (GtkWidget* toolbar); static void -midori_browser_new_history_item (MidoriBrowser* browser, - KatzeItem* item); - -static void _midori_browser_set_toolbar_style (MidoriBrowser* browser, MidoriToolbarStyle toolbar_style); @@ -202,11 +198,6 @@ static void midori_browser_add_speed_dial (MidoriBrowser* browser); static void -midori_browser_notebook_size_allocate_cb (GtkWidget* notebook, - GdkRectangle* allocation, - MidoriBrowser* browser); - -static void midori_browser_step_history (MidoriBrowser* browser, MidoriView* view); @@ -220,6 +211,10 @@ midori_browser_step_history (MidoriBrowser* browser, gtk_toggle_action_set_active (GTK_TOGGLE_ACTION ( \ _action_by_name (brwsr, nme)), actv); +static void +midori_browser_disconnect_tab (MidoriBrowser* browser, + MidoriView* view); + static gboolean midori_browser_is_fullscreen (MidoriBrowser* browser) { @@ -236,15 +231,7 @@ _toggle_tabbar_smartly (MidoriBrowser* browser, gboolean show_tabs = !midori_browser_is_fullscreen (browser) || ignore_fullscreen; if (!browser->show_tabs) show_tabs = FALSE; -#ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_set_show_tabs ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), show_tabs); -#else - if (!(has_tabs || katze_object_get_boolean (browser->settings, "always-show-tabbar"))) - show_tabs = FALSE; - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), show_tabs); - gtk_notebook_set_show_border (GTK_NOTEBOOK (browser->notebook), show_tabs); -#endif + midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), show_tabs); return has_tabs; } @@ -311,6 +298,8 @@ _midori_browser_update_interface (MidoriBrowser* browser, midori_tab_can_view_source (MIDORI_TAB (view))); _action_set_sensitive (browser, "SourceView", midori_tab_can_view_source (MIDORI_TAB (view))); + _action_set_sensitive (browser, "SourceViewDom", + midori_tab_can_view_source (MIDORI_TAB (view))); action = _action_by_name (browser, "NextForward"); if (midori_tab_can_go_forward (MIDORI_TAB (view))) @@ -449,8 +438,7 @@ _midori_browser_update_progress (MidoriBrowser* browser, "tooltip", _("Stop loading the current page"), NULL); } - gtk_widget_set_sensitive (browser->throbber, loading); - katze_throbber_set_animated (KATZE_THROBBER (browser->throbber), loading); + g_object_set (browser->throbber, "active", loading, "visible", loading, NULL); } /** @@ -757,7 +745,7 @@ midori_browser_step_history (MidoriBrowser* browser, { if (midori_view_get_load_status (view) != MIDORI_LOAD_COMMITTED) return; - if (!browser->history || !browser->maximum_history_age) + if (!browser->history_database || !browser->maximum_history_age) return; KatzeItem* proxy = midori_view_get_proxy_item (view); @@ -768,8 +756,24 @@ midori_browser_step_history (MidoriBrowser* browser, if (katze_item_get_meta_integer (proxy, "history-step") == -1 && !katze_item_get_meta_boolean (proxy, "dont-write-history")) { - midori_browser_new_history_item (browser, proxy); + GError* error = NULL; + time_t now = time (NULL); + katze_item_set_added (proxy, now); + gint64 day = sokoke_time_t_to_julian (&now); + midori_history_database_insert (browser->history_database, + katze_item_get_uri (proxy), + katze_item_get_name (proxy), + katze_item_get_added (proxy), day, &error); + if (error != NULL) + { + g_printerr (_("Failed to insert new history item: %s\n"), error->message); + g_error_free (error); + return; + } katze_item_set_meta_integer (proxy, "history-step", 1); + /* FIXME: No signal for adding/ removing */ + katze_array_add_item (browser->history, proxy); + katze_array_remove_item (browser->history, proxy); } else if (katze_item_get_name (proxy) && katze_item_get_meta_integer (proxy, "history-step") >= 1) @@ -780,23 +784,6 @@ midori_browser_step_history (MidoriBrowser* browser, } static void -midori_view_notify_minimized_cb (GtkWidget* widget, - GParamSpec* pspec, - MidoriBrowser* browser) -{ - if (katze_object_get_boolean (widget, "minimized")) - { - #ifndef HAVE_GRANITE - GtkNotebook* notebook = GTK_NOTEBOOK (browser->notebook); - GtkWidget* label = gtk_notebook_get_tab_label (notebook, widget); - gtk_widget_set_size_request (label, -1, -1); - #endif - } - else - midori_browser_notebook_size_allocate_cb (NULL, NULL, browser); -} - -static void midori_view_notify_zoom_level_cb (GtkWidget* view, GParamSpec* pspec, MidoriBrowser* browser) @@ -1356,12 +1343,12 @@ midori_browser_save_uri (MidoriBrowser* browser, if (!file_only) { gchar* fullname = g_strconcat (filename, ".html", NULL); - midori_view_save_source (view, uri, fullname); + midori_view_save_source (view, uri, fullname, FALSE); g_free (fullname); midori_browser_save_resources (resources, filename); } else - midori_view_save_source (view, uri, filename); + midori_view_save_source (view, uri, filename, FALSE); katze_assign (last_dir, gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog))); } @@ -1399,6 +1386,25 @@ midori_browser_tab_leave_notify_event_cb (GtkWidget* widget, } static void +midori_view_destroy_cb (GtkWidget* view, + MidoriBrowser* browser) +{ + if (browser->proxy_array) + { + KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); + if (katze_array_get_item_index (browser->proxy_array, item) != -1 + && !midori_tab_is_blank (MIDORI_TAB (view))) + { + if (browser->trash) + katze_array_add_item (browser->trash, item); + midori_browser_update_history (item, "website", "leave"); + } + midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); + g_signal_emit (browser, signals[REMOVE_TAB], 0, view); + } +} + +static void midori_view_attach_inspector_cb (GtkWidget* view, GtkWidget* inspector_view, MidoriBrowser* browser) @@ -1535,6 +1541,10 @@ midori_view_new_window_cb (GtkWidget* view, } static void +_midori_browser_set_toolbar_items (MidoriBrowser* browser, + const gchar* items); + +static void midori_view_new_view_cb (GtkWidget* view, GtkWidget* new_view, MidoriNewView where, @@ -1549,19 +1559,15 @@ midori_view_new_view_cb (GtkWidget* view, g_assert (new_browser != NULL); gtk_window_set_transient_for (GTK_WINDOW (new_browser), GTK_WINDOW (browser)); gtk_window_set_destroy_with_parent (GTK_WINDOW (new_browser), TRUE); - MidoriWebSettings* settings = midori_web_settings_new (); - g_object_set (settings, - "toolbar-items", "Location", - "show-menubar", FALSE, - "show-bookmarkbar", FALSE, - "show-statusbar", FALSE, - NULL); g_object_set (new_browser, - "settings", settings, "show-tabs", FALSE, NULL); - g_object_unref (settings); + sokoke_widget_set_visible (new_browser->menubar, FALSE); + sokoke_widget_set_visible (new_browser->bookmarkbar, FALSE); + sokoke_widget_set_visible (new_browser->statusbar, FALSE); _action_set_visible (new_browser, "CompactMenu", FALSE); + _midori_browser_set_toolbar_items (new_browser, "Location"); + sokoke_widget_set_visible (new_browser->panel, FALSE); midori_browser_add_tab (new_browser, new_view); midori_browser_set_current_tab (new_browser, new_view); return; @@ -1783,98 +1789,14 @@ midori_view_search_text_cb (GtkWidget* view, gint midori_browser_get_n_pages (MidoriBrowser* browser) { - #ifdef HAVE_GRANITE - return granite_widgets_dynamic_notebook_get_n_tabs ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); - #else - return gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook)); - #endif -} - -static void -midori_browser_disconnect_tab (MidoriBrowser* browser, - MidoriView* view); - -static gboolean -midori_browser_tab_connected (MidoriBrowser* browser, - MidoriView* view) -{ - return browser->proxy_array && - (katze_array_get_item_index (browser->proxy_array, midori_view_get_proxy_item (view)) != -1); + return midori_notebook_get_count (MIDORI_NOTEBOOK (browser->notebook)); } static void _midori_browser_remove_tab (MidoriBrowser* browser, GtkWidget* widget) { - MidoriView* view = MIDORI_VIEW (widget); -#ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_remove_tab ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), midori_view_get_tab (view)); -#else gtk_widget_destroy (widget); -#endif - if (midori_browser_tab_connected (browser, view)) - midori_browser_disconnect_tab (browser, view); -} - -#ifndef HAVE_GRANITE -static void -midori_browser_notebook_resize (MidoriBrowser* browser, - GdkRectangle* allocation) -{ - gint new_size = 0; - gint n = MAX (1, gtk_notebook_get_n_pages (GTK_NOTEBOOK (browser->notebook))); - const gint max_size = 150; - gint min_size; - gint icon_size = 16; - GtkAllocation notebook_size; - GList* children; - - if (allocation != NULL) - notebook_size.width = allocation->width; - else - gtk_widget_get_allocation (browser->notebook, ¬ebook_size); - new_size = notebook_size.width / n; - - gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (browser->notebook), - GTK_ICON_SIZE_MENU, &icon_size, NULL); - min_size = icon_size; - if (katze_object_get_boolean (browser->settings, "close-buttons-on-tabs")) - min_size += icon_size; - if (new_size < min_size) new_size = min_size; - if (new_size > max_size) new_size = max_size; - - if (new_size > browser->last_tab_size - 3 - && new_size < browser->last_tab_size + 3) - return; - browser->last_tab_size = new_size; - - children = gtk_container_get_children (GTK_CONTAINER (browser->notebook)); - for (; children; children = g_list_next (children)) - { - GtkWidget* view = children->data; - GtkWidget* label; - label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(browser->notebook), view); - /* Don't resize empty bin, which is used for thumbnail tabs */ - if (GTK_IS_BIN (label) && gtk_bin_get_child (GTK_BIN (label)) - && !katze_object_get_boolean (view, "minimized")) - gtk_widget_set_size_request (label, new_size, -1); - } -} -#endif - -static void -midori_browser_notebook_size_allocate_cb (GtkWidget* widget, - GdkRectangle* allocation, - MidoriBrowser* browser) -{ - #ifndef HAVE_GRANITE - if (!gtk_notebook_get_show_tabs (GTK_NOTEBOOK (browser->notebook))) - return; - - midori_browser_notebook_resize (browser, allocation); - #endif } static void @@ -1884,7 +1806,6 @@ midori_browser_connect_tab (MidoriBrowser* browser, KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); katze_array_add_item (browser->proxy_array, item); - gtk_widget_set_can_focus (view, TRUE); g_object_connect (view, "signal::notify::icon", midori_view_notify_icon_cb, browser, @@ -1896,8 +1817,6 @@ midori_browser_connect_tab (MidoriBrowser* browser, midori_view_notify_uri_cb, browser, "signal::notify::title", midori_view_notify_title_cb, browser, - "signal::notify::minimized", - midori_view_notify_minimized_cb, browser, "signal::notify::zoom-level", midori_view_notify_zoom_level_cb, browser, "signal::notify::statusbar-text", @@ -1918,30 +1837,12 @@ midori_browser_connect_tab (MidoriBrowser* browser, midori_view_search_text_cb, browser, "signal::leave-notify-event", midori_browser_tab_leave_notify_event_cb, browser, + "signal::destroy", + midori_view_destroy_cb, browser, NULL); } static void -midori_browser_add_tab_to_trash (MidoriBrowser* browser, - MidoriView* view) -{ - if (browser->proxy_array) - { - KatzeItem* item = midori_view_get_proxy_item (view); - if (katze_array_get_item_index (browser->proxy_array, item) != -1) - { - if (!midori_view_is_blank (view)) - { - if (browser->trash) - katze_array_add_item (browser->trash, item); - midori_browser_update_history (item, "website", "leave"); - } - } - } -} - - -static void midori_browser_disconnect_tab (MidoriBrowser* browser, MidoriView* view) { @@ -1972,8 +1873,6 @@ midori_browser_disconnect_tab (MidoriBrowser* browser, "any_signal", midori_view_notify_title_cb, browser, "any_signal", - midori_view_notify_minimized_cb, browser, - "any_signal", midori_view_notify_zoom_level_cb, browser, "any_signal", midori_view_notify_statusbar_text_cb, browser, @@ -2000,11 +1899,7 @@ static void _midori_browser_add_tab (MidoriBrowser* browser, GtkWidget* view) { - GtkWidget* notebook = browser->notebook; KatzeItem* item = midori_view_get_proxy_item (MIDORI_VIEW (view)); - #ifndef HAVE_GRANITE - GtkWidget* tab_label; - #endif guint n; midori_browser_connect_tab (browser, view); @@ -2016,24 +1911,10 @@ _midori_browser_add_tab (MidoriBrowser* browser, katze_array_move_item (browser->proxy_array, item, n); } else - n = midori_browser_get_n_pages (browser); + n = -1; katze_item_set_meta_integer (item, "append", -1); -#ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_insert_tab ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), - midori_view_get_tab (MIDORI_VIEW (view)), n); -#else - tab_label = midori_view_get_proxy_tab_label (MIDORI_VIEW (view)); - /* Don't resize empty bin, which is used for thumbnail tabs */ - if (GTK_IS_BIN (tab_label) && gtk_bin_get_child (GTK_BIN (tab_label)) - && !katze_object_get_boolean (view, "minimized")) - gtk_widget_set_size_request (tab_label, browser->last_tab_size, -1); - gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), view, tab_label, n); - gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (notebook), view, TRUE); - gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (notebook), view, TRUE); - midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser); -#endif + midori_notebook_insert (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view), n); _midori_browser_update_actions (browser); } @@ -2052,7 +1933,6 @@ midori_browser_key_press_event (GtkWidget* widget, MidoriBrowser* browser = MIDORI_BROWSER (widget); GtkWidgetClass* widget_class; guint clean_state; - GtkWidget* focus; /* Interpret Ctrl(+Shift)+Tab as tab switching for compatibility */ if (midori_browser_get_nth_tab (browser, 1) != NULL @@ -2084,7 +1964,7 @@ midori_browser_key_press_event (GtkWidget* widget, } #ifndef HAVE_WEBKIT2 - focus = gtk_window_get_focus (GTK_WINDOW (widget)); + GtkWidget* focus = gtk_window_get_focus (GTK_WINDOW (widget)); if (focus == NULL) gtk_widget_grab_focus (midori_browser_get_current_tab (MIDORI_BROWSER (widget))); else if (G_OBJECT_TYPE (focus) == WEBKIT_TYPE_WEB_VIEW @@ -2848,32 +2728,7 @@ _action_print_activate (GtkAction* action, { GtkWidget* view = midori_browser_get_current_tab (browser); - #if 0 // def HAVE_GRANITE - /* FIXME: Blacklist/ custom contract doesn't work - gchar* blacklisted_contracts[] = { "print", NULL }; */ - /* FIXME: granite: should return GtkWidget* like GTK+ */ - GtkWidget* dialog = (GtkWidget*)granite_widgets_light_window_new (_("Share this page")); - /* FIXME: granite: should return GtkWidget* like GTK+ */ - GtkWidget* content_area = (GtkWidget*)granite_widgets_decorated_window_get_box (GRANITE_WIDGETS_DECORATED_WINDOW (dialog)); - gchar* filename = midori_view_save_source (MIDORI_VIEW (view), NULL, NULL); - const gchar* mime_type = katze_item_get_meta_string ( - midori_view_get_proxy_item (MIDORI_VIEW (view)), "mime-type"); - GtkWidget* contractor = (GtkWidget*)granite_widgets_contractor_view_new ( - filename, mime_type, 32, TRUE); - /* granite_widgets_contractor_view_add_item (GRANITE_WIDGETS_CONTRACTOR_VIEW ( - contractor), _("_Print"), _("Send document to the printer"), "document-print", - 32, G_MAXINT, midori_view_print, view); - granite_widgets_contractor_view_name_blacklist (GRANITE_WIDGETS_CONTRACTOR_VIEW ( - contractor), blacklisted_contracts, -1); */ - g_free (filename); - gtk_box_pack_start (GTK_BOX (content_area), contractor, TRUE, TRUE, 0); - gtk_widget_show (contractor); - gtk_widget_show (dialog); - /* FIXME: granite: "box" isn't visible by default */ - gtk_widget_show_all (dialog); - #else midori_view_print (MIDORI_VIEW (view)); - #endif } static void @@ -3356,8 +3211,8 @@ _action_compact_menu_populate_popup (GtkAction* action, midori_context_action_add_by_name (menu, "HelpFAQ"); midori_context_action_add_by_name (menu, "HelpBugs"); #endif - midori_context_action_add_by_name (menu, "About"); midori_context_action_add_by_name (menu, "Preferences"); + midori_context_action_add_by_name (menu, "About"); midori_context_action_create_menu (menu, default_menu, FALSE); } @@ -3578,15 +3433,16 @@ _action_view_encoding_activate (GtkAction* action, } static void -_action_source_view_activate (GtkAction* action, - MidoriBrowser* browser) +_action_source_view (GtkAction* action, + MidoriBrowser* browser, + gboolean use_dom) { GtkWidget* view; gchar* text_editor; gchar* filename = NULL; view = midori_browser_get_current_tab (browser); - filename = midori_view_save_source (MIDORI_VIEW (view), NULL, NULL); + filename = midori_view_save_source (MIDORI_VIEW (view), NULL, NULL, use_dom); g_object_get (browser->settings, "text-editor", &text_editor, NULL); if (!(text_editor && *text_editor)) { @@ -3612,6 +3468,21 @@ _action_source_view_activate (GtkAction* action, } static void +_action_source_view_activate (GtkAction* action, + MidoriBrowser* browser) +{ + _action_source_view (action, browser, FALSE); +} + +static void +_action_source_view_dom_activate (GtkAction* action, + MidoriBrowser* browser) +{ + _action_source_view (action, browser, TRUE); +} + + +static void _action_caret_browsing_activate (GtkAction* action, MidoriBrowser* browser) { @@ -3680,13 +3551,7 @@ _action_fullscreen_activate (GtkAction* action, gtk_widget_hide (browser->bookmarkbar); gtk_widget_hide (browser->navigationbar); gtk_widget_hide (browser->statusbar); - #ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_set_show_tabs ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), FALSE); - #else - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (browser->notebook), FALSE); - gtk_notebook_set_show_border (GTK_NOTEBOOK (browser->notebook), FALSE); - #endif + midori_notebook_set_labels_visible (MIDORI_NOTEBOOK (browser->notebook), FALSE); gtk_window_fullscreen (GTK_WINDOW (browser)); } @@ -3802,8 +3667,9 @@ _action_navigation_activate (GtkAction* action, WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_forward_item (list); const gchar* back_uri = webkit_web_history_item_get_uri (item); #endif - GtkWidget* view = midori_browser_add_uri (browser, back_uri); - midori_browser_set_current_tab_smartly (browser, view); + + GtkWidget* new_view = midori_browser_add_uri (browser, back_uri); + midori_browser_set_current_tab_smartly (browser, new_view); } else midori_view_go_back (view); @@ -3824,8 +3690,9 @@ _action_navigation_activate (GtkAction* action, WebKitWebHistoryItem* item = webkit_web_back_forward_list_get_forward_item (list); const gchar* forward_uri = webkit_web_history_item_get_uri (item); #endif - GtkWidget* view = midori_browser_add_uri (browser, forward_uri); - midori_browser_set_current_tab_smartly (browser, view); + + GtkWidget* new_view = midori_browser_add_uri (browser, forward_uri); + midori_browser_set_current_tab_smartly (browser, new_view); } else midori_tab_go_forward (MIDORI_TAB (view)); @@ -3839,8 +3706,8 @@ _action_navigation_activate (GtkAction* action, if (middle_click) { - GtkWidget* view = midori_browser_add_uri (browser, uri); - midori_browser_set_current_tab_smartly (browser, view); + GtkWidget* new_view = midori_browser_add_uri (browser, uri); + midori_browser_set_current_tab_smartly (browser, new_view); } else midori_view_set_uri (view, uri); @@ -3855,8 +3722,8 @@ _action_navigation_activate (GtkAction* action, if (middle_click) { - GtkWidget* view = midori_browser_add_uri (browser, uri); - midori_browser_set_current_tab_smartly (browser, view); + GtkWidget* new_view = midori_browser_add_uri (browser, uri); + midori_browser_set_current_tab_smartly (browser, new_view); } else midori_view_set_uri (view, uri); @@ -3868,8 +3735,8 @@ _action_navigation_activate (GtkAction* action, { if (middle_click) { - GtkWidget* view = midori_browser_add_uri (browser, "about:home"); - midori_browser_set_current_tab_smartly (browser, view); + GtkWidget* new_view = midori_browser_add_uri (browser, "about:home"); + midori_browser_set_current_tab_smartly (browser, new_view); } else midori_view_set_uri (view, "about:home"); @@ -3965,7 +3832,6 @@ _action_location_submit_uri (GtkAction* action, MidoriBrowser* browser) { gchar* new_uri; - gint n; /* Switch to already open tab if possible */ KatzeItem* found = katze_array_find_uri (browser->proxy_array, uri); @@ -4241,7 +4107,6 @@ midori_browser_bookmark_open_in_tab_activate_cb (GtkWidget* menuitem, { KatzeItem* item; const gchar* uri; - guint n; item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); if (KATZE_IS_ARRAY (item)) @@ -4618,11 +4483,15 @@ wrong_format: if (midori_dialog_run (GTK_DIALOG (file_dialog)) == GTK_RESPONSE_OK) path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_dialog)); gtk_widget_destroy (file_dialog); + + if (path == NULL) + return; + if (g_str_has_suffix (path, ".xbel")) format = "xbel"; else if (g_str_has_suffix (path, ".html")) format = "netscape"; - else if (path != NULL) + else { sokoke_message_dialog (GTK_MESSAGE_ERROR, _("Midori can only export to XBEL (*.xbel) and Netscape (*.html)"), @@ -4631,9 +4500,6 @@ wrong_format: goto wrong_format; } - if (path == NULL) - return; - error = NULL; bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks, "*", "parentid IS NULL", NULL, TRUE); @@ -4723,13 +4589,7 @@ _action_tab_move_activate (GtkAction* action, else g_assert_not_reached (); - #ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_set_tab_position ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), - midori_view_get_tab (MIDORI_VIEW (widget)), new_pos); - #else - gtk_notebook_reorder_child (GTK_NOTEBOOK (browser->notebook), widget, new_pos); - #endif + midori_notebook_move (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (widget), new_pos); g_signal_emit (browser, signals[MOVE_TAB], 0, browser->notebook, cur_pos, new_pos); } @@ -4780,7 +4640,9 @@ static void _action_tab_duplicate_activate (GtkAction* action, MidoriBrowser* browser) { - GtkWidget* view = midori_browser_get_current_tab (browser); + GtkWidget* view = g_object_get_data (G_OBJECT (action), "tab"); + if (view == NULL) + view = midori_browser_get_current_tab (browser); midori_view_duplicate (MIDORI_VIEW (view)); } @@ -5016,10 +4878,10 @@ midori_panel_close_cb (MidoriPanel* panel, } static void -midori_browser_switched_tab (MidoriBrowser* browser, - GtkWidget* old_widget, - MidoriView* new_view, - gint new_page) +midori_browser_switched_tab_cb (MidoriNotebook* notebook, + GtkWidget* old_widget, + MidoriView* new_view, + MidoriBrowser* browser) { GtkAction* action; const gchar* text; @@ -5033,13 +4895,8 @@ midori_browser_switched_tab (MidoriBrowser* browser, g_strdup (text), g_free); } - if (new_view == NULL) - { - g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view); - return; - } - g_return_if_fail (MIDORI_IS_VIEW (new_view)); + g_return_if_fail (new_view != MIDORI_VIEW (old_widget)); uri = g_object_get_data (G_OBJECT (new_view), "midori-browser-typed-text"); if (!uri) @@ -5050,9 +4907,10 @@ midori_browser_switched_tab (MidoriBrowser* browser, if (midori_paths_get_runtime_mode () == MIDORI_RUNTIME_MODE_APP) gtk_window_set_icon (GTK_WINDOW (browser), midori_view_get_icon (new_view)); - if (browser->proxy_array) - katze_item_set_meta_integer (KATZE_ITEM (browser->proxy_array), "current", new_page); + g_object_freeze_notify (G_OBJECT (browser)); + g_object_notify (G_OBJECT (browser), "uri"); g_object_notify (G_OBJECT (browser), "tab"); + g_object_thaw_notify (G_OBJECT (browser)); g_signal_emit (browser, signals[SWITCH_TAB], 0, old_widget, new_view); _midori_browser_set_statusbar_text (browser, new_view, NULL); @@ -5061,17 +4919,17 @@ midori_browser_switched_tab (MidoriBrowser* browser, } static void -midori_browser_notebook_page_reordered_cb (GtkWidget* notebook, - MidoriView* view, - guint page_num, - MidoriBrowser* browser) +midori_browser_tab_moved_cb (GtkWidget* notebook, + MidoriView* view, + guint page_num, + MidoriBrowser* browser) { KatzeItem* item = midori_view_get_proxy_item (view); katze_array_move_item (browser->proxy_array, item, page_num); g_object_notify (G_OBJECT (browser), "tab"); } -static GtkWidget* +static void midori_browser_notebook_create_window_cb (GtkWidget* notebook, GtkWidget* view, gint x, @@ -5082,216 +4940,53 @@ midori_browser_notebook_create_window_cb (GtkWidget* notebook, g_signal_emit (browser, signals[NEW_WINDOW], 0, NULL, &new_browser); if (new_browser) { - GtkWidget* new_notebook = new_browser->notebook; gtk_window_move (GTK_WINDOW (new_browser), x, y); - return new_notebook; - } - else /* No MidoriApp, so this is app or private mode */ - return NULL; -} - -#ifdef HAVE_GRANITE -static void -midori_browser_notebook_tab_added_cb (GtkWidget* notebook, - GraniteWidgetsTab* tab, - MidoriBrowser* browser) -{ - gint n = granite_widgets_dynamic_notebook_get_tab_position ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab); - midori_browser_set_current_page (browser, n); - GtkWidget* view = midori_view_new_with_item (NULL, browser->settings); - midori_view_set_tab (MIDORI_VIEW (view), tab); - midori_browser_connect_tab (browser, view); - midori_view_set_uri (MIDORI_VIEW (view), "about:new"); - /* FIXME: signal add-tab */ - _midori_browser_update_actions (browser); - midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook), - MIDORI_VIEW (view), n, browser); -} - -static gboolean -midori_browser_notebook_tab_removed_cb (GtkWidget* notebook, - GraniteWidgetsTab* tab, - MidoriBrowser* browser) -{ - - MidoriView* view = MIDORI_VIEW (granite_widgets_tab_get_page (tab)); - if (midori_browser_tab_connected (browser, MIDORI_VIEW (view))) + g_object_ref (view); midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); - - return TRUE; -} - -static void -midori_browser_move_tab_to_notebook (MidoriBrowser* browser, - GtkWidget* view, - GraniteWidgetsTab* tab, - GtkWidget* new_notebook) -{ - GraniteWidgetsTab* new_tab = granite_widgets_tab_new ("", NULL, NULL); - g_object_ref (view); - _midori_browser_remove_tab (browser, view); - granite_widgets_dynamic_notebook_insert_tab ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (new_notebook), new_tab, 0); - midori_view_set_tab (MIDORI_VIEW (view), new_tab); - _midori_browser_update_actions (browser); - midori_browser_connect_tab (midori_browser_get_for_widget (new_notebook), view); - g_object_unref (view); -} - -static void -midori_browser_notebook_tab_switched_cb (GraniteWidgetsDynamicNotebook* notebook, - GraniteWidgetsTab* old_tab, - GraniteWidgetsTab* new_tab, - MidoriBrowser* browser) -{ - gint new_pos = granite_widgets_dynamic_notebook_get_tab_position (notebook, new_tab); - - midori_browser_switched_tab (browser, - old_tab ? granite_widgets_tab_get_page (old_tab) : NULL, - MIDORI_VIEW (granite_widgets_tab_get_page (new_tab)), new_pos); -} - -static void -midori_browser_notebook_tab_moved_cb (GtkWidget* notebook, - GraniteWidgetsTab* tab, - gint old_pos, - gboolean new_window, - gint x, - gint y, - MidoriBrowser* browser) -{ - GtkWidget* view = granite_widgets_tab_get_page (tab); - if (new_window) - { - GtkWidget* notebook = midori_browser_notebook_create_window_cb ( - browser->notebook, view, x, y, browser); - if (notebook != NULL) - midori_browser_move_tab_to_notebook (browser, view, tab, notebook); - } - else - { - gint new_pos = granite_widgets_dynamic_notebook_get_tab_position ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (notebook), tab); - midori_browser_notebook_page_reordered_cb (notebook, - MIDORI_VIEW (view), new_pos, browser); + midori_notebook_remove (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view)); + midori_browser_add_tab (new_browser, view); + g_object_unref (view); } } static void -midori_browser_notebook_tab_duplicated_cb (GtkWidget* notebook, - GraniteWidgetsTab* tab, - MidoriBrowser* browser) -{ - GtkWidget* view = granite_widgets_tab_get_page (tab); - midori_view_duplicate (MIDORI_VIEW (view)); -} - -#else -static void -midori_browser_notebook_page_added_cb (GtkNotebook* notebook, - GtkWidget* child, - guint page_num, - MidoriBrowser* browser) -{ - if (!midori_browser_tab_connected (browser, MIDORI_VIEW (child))) - midori_browser_connect_tab (browser, child); - midori_browser_notebook_page_reordered_cb (GTK_WIDGET (notebook), - MIDORI_VIEW (child), page_num, browser); -} - -static void -midori_browser_notebook_switch_page_cb (GtkWidget* notebook, - gpointer page, - guint page_num, - MidoriBrowser* browser) +midori_browser_notebook_new_tab_cb (GtkWidget* notebook, + MidoriBrowser* browser) { - midori_browser_switched_tab (browser, - midori_browser_get_current_tab (browser), - MIDORI_VIEW (midori_browser_get_nth_tab (browser, page_num)), page_num); + GtkWidget* view = midori_browser_add_uri (browser, "about:new"); + midori_browser_set_current_tab (browser, view); } static void -midori_browser_notebook_page_removed_cb (GtkWidget* notebook, - GtkWidget* view, - guint page_num, - MidoriBrowser* browser) -{ - if (midori_browser_tab_connected (browser, MIDORI_VIEW (view))) - midori_browser_disconnect_tab (browser, MIDORI_VIEW (view)); - midori_browser_notebook_size_allocate_cb (browser->notebook, NULL, browser); -} - -static gboolean -midori_browser_notebook_reorder_tab_cb (GtkNotebook* notebook, - GtkDirectionType arg1, - gboolean arg2, - gpointer user_data) +midori_browser_notebook_context_menu_cb (MidoriNotebook* notebook, + MidoriContextAction* menu, + MidoriBrowser* browser) { - g_signal_stop_emission_by_name (notebook, "reorder-tab"); - return TRUE; + midori_context_action_add_action_group (menu, browser->action_group); + midori_context_action_add (menu, NULL); + midori_context_action_add_by_name (menu, "TabNew"); + midori_context_action_add_by_name (menu, "UndoTabClose"); } static void -midori_browser_menu_item_switch_tab_cb (GtkWidget* menuitem, - MidoriBrowser* browser) +midori_browser_notebook_tab_context_menu_cb (MidoriNotebook* notebook, + MidoriTab* tab, + MidoriContextAction* menu, + MidoriBrowser* browser) { - gint page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menuitem), "index")); - midori_browser_set_current_page (browser, page); -} - -static gboolean -midori_browser_notebook_button_press_event_after_cb (GtkNotebook* notebook, - GdkEventButton* event, - MidoriBrowser* browser) -{ -#if !GTK_CHECK_VERSION(3,0,0) /* TODO */ - if (event->window != notebook->event_window) - return FALSE; -#endif - - /* FIXME: Handle double click only when it wasn't handled by GtkNotebook */ - - /* Open a new tab on double click or middle mouse click */ - if (/*(event->type == GDK_2BUTTON_PRESS && event->button == 1) - || */(event->type == GDK_BUTTON_PRESS && MIDORI_EVENT_NEW_TAB (event))) - { - GtkWidget* view = midori_browser_add_uri (browser, "about:new"); - midori_browser_set_current_tab (browser, view); - - return TRUE; - } - else if (event->type == GDK_BUTTON_PRESS && MIDORI_EVENT_CONTEXT_MENU (event)) + midori_context_action_add_action_group (menu, browser->action_group); + midori_context_action_add (menu, NULL); + midori_context_action_add_by_name (menu, "TabNew"); + midori_context_action_add_by_name (menu, "UndoTabClose"); + if (MIDORI_IS_VIEW (tab)) { - MidoriContextAction* menu = midori_context_action_new ("NotebookContextMenu", NULL, NULL, NULL); - midori_context_action_add_action_group (menu, browser->action_group); - GList* tabs = midori_browser_get_tabs (browser); - midori_context_action_add_by_name (menu, "TabNew"); - midori_context_action_add_by_name (menu, "UndoTabClose"); - midori_context_action_add (menu, NULL); - gint i = 0; - for (; tabs != NULL; tabs = g_list_next (tabs)) - { - const gchar* title = midori_view_get_display_title (tabs->data); - gchar* tab_option = g_strdup_printf ("Tab%u", i); - GtkAction* action = gtk_action_new (tab_option, title, NULL, NULL); - g_free (tab_option); - gtk_action_set_gicon (GTK_ACTION (action), G_ICON (midori_view_get_icon (tabs->data))); - g_object_set_data (G_OBJECT (action), "index", GINT_TO_POINTER (i)); - g_signal_connect (action, "activate", - G_CALLBACK (midori_browser_menu_item_switch_tab_cb), browser); - midori_context_action_add (menu, action); - i++; - } - g_list_free (tabs); - GtkMenu* context_menu = midori_context_action_create_menu (menu, NULL, FALSE); - katze_widget_popup (GTK_WIDGET (notebook), context_menu, NULL, - KATZE_MENU_POSITION_CURSOR); + GtkAction* action = gtk_action_new ("TabDuplicate", _("_Duplicate Current Tab"), NULL, NULL); + g_object_set_data (G_OBJECT (action), "tab", tab); + g_signal_connect (action, "activate", + G_CALLBACK (_action_tab_duplicate_activate), browser); + midori_context_action_add (menu, action); } - - return FALSE; } -#endif static void _action_undo_tab_close_activate (GtkAction* action, @@ -5351,15 +5046,9 @@ static const GtkActionEntry entries[] = { "WindowClose", NULL, N_("C_lose Window"), "<Ctrl><Shift>w", NULL, G_CALLBACK (_action_window_close_activate) }, - #if 0 // def HAVE_GRANITE - { "Print", "document-export", - N_("_Share"), "<Ctrl>p", - N_("Share this page"), G_CALLBACK (_action_print_activate) }, - #else { "Print", GTK_STOCK_PRINT, NULL, "<Ctrl>p", N_("Print the current page"), G_CALLBACK (_action_print_activate) }, - #endif { "Quit", GTK_STOCK_QUIT, N_("Close a_ll Windows"), "<Ctrl><Shift>q", NULL, G_CALLBACK (_action_quit_activate) }, @@ -5426,6 +5115,9 @@ static const GtkActionEntry entries[] = { "SourceView", NULL, N_("View So_urce"), "<Ctrl><Alt>U", NULL, G_CALLBACK (_action_source_view_activate) }, + { "SourceViewDom", NULL, + N_("View _DOM Source"), "<Ctrl><Alt><Shift>U", + NULL, G_CALLBACK (_action_source_view_dom_activate) }, { "CaretBrowsing", NULL, N_("Ca_ret Browsing"), "F7", NULL, G_CALLBACK (_action_caret_browsing_activate) }, @@ -5464,8 +5156,8 @@ static const GtkActionEntry entries[] = /* i18n: Visit the following logical page, ie. in a forum or blog */ N_("Go to the next sub-page"), G_CALLBACK (_action_navigation_activate) }, { "NextForward", GTK_STOCK_MEDIA_NEXT, - NULL, "", - N_("Go to the next sub-page"), G_CALLBACK (_action_navigation_activate) }, + N_("Next or Forward"), "", + N_("Go to the next sub-page or next page in history"), G_CALLBACK (_action_navigation_activate) }, { "Homepage", GTK_STOCK_HOME, N_("_Homepage"), "<Alt>Home", N_("Go to your homepage"), G_CALLBACK (_action_navigation_activate) }, @@ -5637,7 +5329,6 @@ midori_inactivity_timeout (gpointer data) XScreenSaverQueryInfo (xdisplay, RootWindow (xdisplay, 0), mit_info); if (mit_info->idle / 1000 > mit->timeout) { - GtkWidget* view; midori_private_data_clear_all (mit->browser); midori_browser_activate_action (mit->browser, "Homepage"); } @@ -5740,14 +5431,6 @@ midori_browser_destroy_cb (MidoriBrowser* browser) /* Destroy panel first, so panels don't need special care */ gtk_widget_destroy (browser->panel); - #ifndef HAVE_GRANITE - g_signal_handlers_disconnect_by_func (browser->notebook, - midori_browser_notebook_reorder_tab_cb, - NULL); - g_signal_handlers_disconnect_by_func (browser->notebook, - midori_browser_notebook_size_allocate_cb, - browser); - #endif /* Destroy tabs second, so child widgets don't need special care */ gtk_container_foreach (GTK_CONTAINER (browser->notebook), (GtkCallback) gtk_widget_destroy, NULL); @@ -5819,6 +5502,7 @@ static const gchar* ui_markup = "<menuitem action='EncodingCustom'/>" "</menu>" "<menuitem action='SourceView'/>" + "<menuitem action='SourceViewDom'/>" "<menuitem action='Fullscreen'/>" "<menuitem action='Readable'/>" "</menu>" @@ -5897,46 +5581,6 @@ midori_browser_realize_cb (GtkStyle* style, } static void -midori_browser_new_history_item (MidoriBrowser* browser, - KatzeItem* item) -{ - time_t now; - gint64 day; - sqlite3* db; - static sqlite3_stmt* stmt = NULL; - - g_return_if_fail (katze_item_get_uri (item) != NULL); - - now = time (NULL); - katze_item_set_added (item, now); - day = sokoke_time_t_to_julian (&now); - - db = g_object_get_data (G_OBJECT (browser->history), "db"); - g_return_if_fail (db != NULL); - if (!stmt) - { - const gchar* sqlcmd; - - sqlcmd = "INSERT INTO history (uri, title, date, day) VALUES (?,?,?,?)"; - sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL); - } - sqlite3_bind_text (stmt, 1, katze_item_get_uri (item), -1, 0); - sqlite3_bind_text (stmt, 2, katze_item_get_name (item), -1, 0); - sqlite3_bind_int64 (stmt, 3, katze_item_get_added (item)); - sqlite3_bind_int64 (stmt, 4, day); - - if (sqlite3_step (stmt) != SQLITE_DONE) - g_printerr (_("Failed to insert new history item: %s\n"), - sqlite3_errmsg (db)); - sqlite3_reset (stmt); - sqlite3_clear_bindings (stmt); - - /* FIXME: Workaround for the lack of a database interface */ - katze_array_add_item (browser->history, item); - katze_array_remove_item (browser->history, item); -} - -static void midori_browser_set_history (MidoriBrowser* browser, KatzeArray* history) { @@ -5946,10 +5590,20 @@ midori_browser_set_history (MidoriBrowser* browser, if (history) g_object_ref (history); katze_object_assign (browser->history, history); + katze_object_assign (browser->history_database, NULL); if (!history) return; + GError* error = NULL; + browser->history_database = midori_history_database_new (NULL, &error); + if (error != NULL) + { + g_printerr (_("Failed to initialize history: %s"), error->message); + g_printerr ("\n"); + g_error_free (error); + return; + } g_object_set (_action_by_name (browser, "Location"), "history", browser->history, NULL); } @@ -6064,6 +5718,8 @@ midori_browser_init (MidoriBrowser* browser) browser->settings = midori_web_settings_new (); browser->proxy_array = katze_array_new (KATZE_TYPE_ARRAY); browser->bookmarks = NULL; + browser->history = NULL; + browser->history_database = NULL; browser->trash = NULL; browser->search_engines = NULL; browser->dial = NULL; @@ -6267,10 +5923,17 @@ midori_browser_init (MidoriBrowser* browser) menuitem = gtk_menu_item_new (); gtk_widget_show (menuitem); - browser->throbber = katze_throbber_new (); - gtk_widget_show (browser->throbber); - gtk_container_add (GTK_CONTAINER (menuitem), browser->throbber); - gtk_widget_set_sensitive (menuitem, FALSE); + browser->throbber = gtk_spinner_new (); + /* Wrap the spinner in an event box to retain its size when hidden */ + GtkWidget* throbber_box = gtk_event_box_new (); + gtk_event_box_set_visible_window (GTK_EVENT_BOX (throbber_box), FALSE); + gint icon_size = 16; + gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (GTK_WIDGET (browser)), + GTK_ICON_SIZE_MENU, &icon_size, NULL); + gtk_widget_set_size_request (throbber_box, icon_size, icon_size); + gtk_container_add (GTK_CONTAINER (throbber_box), browser->throbber); + gtk_widget_show (throbber_box); + gtk_container_add (GTK_CONTAINER (menuitem), throbber_box); #if GTK_CHECK_VERSION (3, 2, 0) /* FIXME: Doesn't work */ gtk_widget_set_hexpand (menuitem, TRUE); @@ -6369,78 +6032,24 @@ midori_browser_init (MidoriBrowser* browser) vpaned = gtk_vpaned_new (); gtk_paned_pack2 (GTK_PANED (hpaned), vpaned, TRUE, FALSE); gtk_widget_show (vpaned); - #ifdef HAVE_GRANITE - /* FIXME: granite: should return GtkWidget* like GTK+ */ - browser->notebook = (GtkWidget*)granite_widgets_dynamic_notebook_new (); - granite_widgets_dynamic_notebook_set_allow_new_window ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE); - granite_widgets_dynamic_notebook_set_allow_duplication ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), TRUE); - /* FIXME: work-around a bug */ - gtk_widget_show_all (browser->notebook); - granite_widgets_dynamic_notebook_set_group_name ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), PACKAGE_NAME); - #else - browser->notebook = gtk_notebook_new (); - gtk_notebook_set_scrollable (GTK_NOTEBOOK (browser->notebook), TRUE); - #if GTK_CHECK_VERSION (3, 0, 0) - gtk_notebook_set_group_name (GTK_NOTEBOOK (browser->notebook), PACKAGE_NAME); - #else - gtk_notebook_set_group_id (GTK_NOTEBOOK (browser->notebook), GPOINTER_TO_INT (PACKAGE_NAME)); - #endif - #endif + browser->notebook = midori_notebook_new (); - #if !GTK_CHECK_VERSION (3, 0, 0) - { - /* Remove the inner border between scrollbars and the window border */ - GtkRcStyle* rcstyle = gtk_rc_style_new (); - rcstyle->xthickness = 0; - gtk_widget_modify_style (browser->notebook, rcstyle); - g_object_unref (rcstyle); - } - #endif gtk_paned_pack1 (GTK_PANED (vpaned), browser->notebook, FALSE, FALSE); - #ifdef HAVE_GRANITE - /* FIXME menu items */ - g_signal_connect (browser->notebook, "tab-added", - G_CALLBACK (midori_browser_notebook_tab_added_cb), - browser); - g_signal_connect (browser->notebook, "tab-removed", - G_CALLBACK (midori_browser_notebook_tab_removed_cb), - browser); g_signal_connect (browser->notebook, "tab-switched", - G_CALLBACK (midori_browser_notebook_tab_switched_cb), + G_CALLBACK (midori_browser_switched_tab_cb), browser); g_signal_connect (browser->notebook, "tab-moved", - G_CALLBACK (midori_browser_notebook_tab_moved_cb), - browser); - g_signal_connect (browser->notebook, "tab-duplicated", - G_CALLBACK (midori_browser_notebook_tab_duplicated_cb), - browser); - #else - g_signal_connect (browser->notebook, "switch-page", - G_CALLBACK (midori_browser_notebook_switch_page_cb), - browser); - g_signal_connect (browser->notebook, "page-reordered", - G_CALLBACK (midori_browser_notebook_page_reordered_cb), + G_CALLBACK (midori_browser_tab_moved_cb), browser); - g_signal_connect (browser->notebook, "page-added", - G_CALLBACK (midori_browser_notebook_page_added_cb), + g_signal_connect (browser->notebook, "context-menu", + G_CALLBACK (midori_browser_notebook_context_menu_cb), browser); - g_signal_connect (browser->notebook, "page-removed", - G_CALLBACK (midori_browser_notebook_page_removed_cb), - browser); - g_signal_connect (browser->notebook, "size-allocate", - G_CALLBACK (midori_browser_notebook_size_allocate_cb), - browser); - g_signal_connect_after (browser->notebook, "button-press-event", - G_CALLBACK (midori_browser_notebook_button_press_event_after_cb), - browser); - g_signal_connect (browser->notebook, "reorder-tab", - G_CALLBACK (midori_browser_notebook_reorder_tab_cb), NULL); - g_signal_connect (browser->notebook, "create-window", + g_signal_connect (browser->notebook, "tab-context-menu", + G_CALLBACK (midori_browser_notebook_tab_context_menu_cb), browser); + g_signal_connect (browser->notebook, "tab-detached", G_CALLBACK (midori_browser_notebook_create_window_cb), browser); - #endif + g_signal_connect (browser->notebook, "new-tab", + G_CALLBACK (midori_browser_notebook_new_tab_cb), browser); gtk_widget_show (browser->notebook); /* Inspector container */ @@ -6498,6 +6107,7 @@ midori_browser_finalize (GObject* object) katze_object_assign (browser->trash, NULL); katze_object_assign (browser->search_engines, NULL); katze_object_assign (browser->history, NULL); + katze_object_assign (browser->history_database, NULL); katze_object_assign (browser->dial, NULL); g_idle_remove_by_data (browser); @@ -6542,6 +6152,7 @@ _midori_browser_set_toolbar_style (MidoriBrowser* browser, gtk_toolbar_style); } +#ifndef HAVE_WEBKIT2 static void midori_browser_toolbar_popup_context_menu_history_cb (GtkMenuItem* menu_item, MidoriBrowser* browser) @@ -6550,6 +6161,7 @@ midori_browser_toolbar_popup_context_menu_history_cb (GtkMenuItem* menu_item, MidoriView* view = MIDORI_VIEW (midori_browser_get_current_tab (browser)); midori_view_go_back_or_forward (view, steps); } +#endif static void midori_browser_toolbar_popup_context_menu_history (MidoriBrowser* browser, @@ -6745,11 +6357,9 @@ _midori_browser_set_toolbar_items (MidoriBrowser* browser, } else if (token_current != token_dontcare && token_last == token_dontcare) continue; - #ifdef HAVE_GRANITE /* A "new tab" button is already part of the notebook */ else if (!strcmp (gtk_action_get_name (action), "TabNew")) continue; - #endif else toolitem = gtk_action_create_tool_item (action); @@ -6816,7 +6426,7 @@ _midori_browser_update_settings (MidoriBrowser* browser) gboolean show_panel; MidoriToolbarStyle toolbar_style; gchar* toolbar_items; - gboolean close_buttons_on_tabs; + gboolean close_buttons_left, close_buttons_on_tabs; g_object_get (browser->settings, "remember-last-window-size", &remember_last_window_size, @@ -6836,19 +6446,19 @@ _midori_browser_update_settings (MidoriBrowser* browser) "show-statusbar", &browser->show_statusbar, "toolbar-style", &toolbar_style, "toolbar-items", &toolbar_items, + "close-buttons-left", &close_buttons_left, "close-buttons-on-tabs", &close_buttons_on_tabs, "maximum-history-age", &browser->maximum_history_age, NULL); - #ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_set_tabs_closable ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), close_buttons_on_tabs); - #endif + midori_notebook_set_close_buttons_visible ( + MIDORI_NOTEBOOK (browser->notebook), close_buttons_on_tabs); + midori_notebook_set_close_buttons_left ( + MIDORI_NOTEBOOK (browser->notebook), close_buttons_left); midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find), - katze_object_get_boolean (browser->settings, "close-buttons-left")); + close_buttons_left); if (browser->dial != NULL) - midori_speed_dial_set_close_buttons_left (browser->dial, - katze_object_get_boolean (browser->settings, "close-buttons-left")); + midori_speed_dial_set_close_buttons_left (browser->dial, close_buttons_left); midori_browser_set_inactivity_reset (browser, inactivity_reset); @@ -6969,17 +6579,17 @@ midori_browser_settings_notify (MidoriWebSettings* web_settings, } else if (name == g_intern_string ("maximum-history-age")) browser->maximum_history_age = g_value_get_int (&value); - #ifdef HAVE_GRANITE else if (name == g_intern_string ("close-buttons-on-tabs")) - granite_widgets_dynamic_notebook_set_tabs_closable ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), g_value_get_boolean (&value)); - #endif + midori_notebook_set_close_buttons_visible ( + MIDORI_NOTEBOOK (browser->notebook), g_value_get_boolean (&value)); else if (name == g_intern_string ("close-buttons-left")) { midori_findbar_set_close_button_left (MIDORI_FINDBAR (browser->find), g_value_get_boolean (&value)); midori_speed_dial_set_close_buttons_left (browser->dial, - katze_object_get_boolean (browser->settings, "close-buttons-left")); + g_value_get_boolean (&value)); + midori_notebook_set_close_buttons_left ( + MIDORI_NOTEBOOK (browser->notebook), g_value_get_boolean (&value)); } else if (name == g_intern_string ("inactivity-reset")) midori_browser_set_inactivity_reset (browser, g_value_get_uint (&value)); @@ -7233,7 +6843,7 @@ midori_browser_set_property (GObject* object, _action_set_visible (browser, "UndoTabClose", browser->trash != NULL); if (browser->trash != NULL) { - g_signal_connect (browser->trash, "clear", + g_signal_connect_after (browser->trash, "clear", G_CALLBACK (midori_browser_trash_clear_cb), browser); midori_browser_trash_clear_cb (browser->trash, browser); } @@ -7302,7 +6912,7 @@ midori_browser_get_property (GObject* object, g_value_set_object (value, browser->navigationbar); break; case PROP_NOTEBOOK: - g_value_set_object (value, browser->notebook); + g_value_set_object (value, MIDORI_NOTEBOOK (browser->notebook)->notebook); break; case PROP_PANEL: g_value_set_object (value, browser->panel); @@ -7423,13 +7033,7 @@ midori_browser_page_num (MidoriBrowser* browser, g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); g_return_val_if_fail (MIDORI_IS_VIEW (view), -1); -#ifdef HAVE_GRANITE - return granite_widgets_dynamic_notebook_get_tab_position ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), - midori_view_get_tab (MIDORI_VIEW (view))); -#else - return gtk_notebook_page_num (GTK_NOTEBOOK (browser->notebook), view); -#endif + return midori_notebook_get_tab_index (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view)); } @@ -7448,7 +7052,6 @@ midori_browser_close_tab (MidoriBrowser* browser, g_return_if_fail (MIDORI_IS_BROWSER (browser)); g_return_if_fail (GTK_IS_WIDGET (view)); - midori_browser_add_tab_to_trash (browser, MIDORI_VIEW (view)); g_signal_emit (browser, signals[REMOVE_TAB], 0, view); } @@ -7674,22 +7277,7 @@ midori_browser_set_current_page (MidoriBrowser* browser, view = midori_browser_get_nth_tab (browser, n); g_return_if_fail (view != NULL); - #ifdef HAVE_GRANITE - granite_widgets_dynamic_notebook_set_current ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), - midori_view_get_tab (MIDORI_VIEW (view))); - #else - gtk_notebook_set_current_page (GTK_NOTEBOOK (browser->notebook), n); - #endif - if (midori_view_is_blank (MIDORI_VIEW (view))) - midori_browser_activate_action (browser, "Location"); - else - gtk_widget_grab_focus (view); - - g_object_freeze_notify (G_OBJECT (browser)); - g_object_notify (G_OBJECT (browser), "uri"); - g_object_notify (G_OBJECT (browser), "tab"); - g_object_thaw_notify (G_OBJECT (browser)); + midori_browser_set_tab (browser, view); } /** @@ -7707,14 +7295,7 @@ midori_browser_get_current_page (MidoriBrowser* browser) { g_return_val_if_fail (MIDORI_IS_BROWSER (browser), -1); - #ifdef HAVE_GRANITE - GraniteWidgetsTab* tab = granite_widgets_dynamic_notebook_get_current ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); - return tab ? granite_widgets_dynamic_notebook_get_tab_position ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), tab) : -1; - #else - return gtk_notebook_get_current_page (GTK_NOTEBOOK (browser->notebook)); - #endif + return midori_notebook_get_index (MIDORI_NOTEBOOK (browser->notebook)); } /** @@ -7760,19 +7341,9 @@ GtkWidget* midori_browser_get_nth_tab (MidoriBrowser* browser, gint page) { -#ifdef HAVE_GRANITE - GraniteWidgetsTab* tab; - g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); - tab = granite_widgets_dynamic_notebook_get_tab_by_index ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook), page); - return tab != NULL ? granite_widgets_tab_get_page (tab) : NULL; -#else - g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); - - return gtk_notebook_get_nth_page (GTK_NOTEBOOK (browser->notebook), page); -#endif + return (GtkWidget*)midori_notebook_get_nth_tab (MIDORI_NOTEBOOK (browser->notebook), page); } /** @@ -7790,13 +7361,19 @@ void midori_browser_set_current_tab (MidoriBrowser* browser, GtkWidget* view) { - gint n; - g_return_if_fail (MIDORI_IS_BROWSER (browser)); g_return_if_fail (GTK_IS_WIDGET (view)); - n = midori_browser_page_num (browser, view); - midori_browser_set_current_page (browser, n); + midori_notebook_set_tab (MIDORI_NOTEBOOK (browser->notebook), MIDORI_TAB (view)); + if (midori_tab_is_blank (MIDORI_TAB (view))) + midori_browser_activate_action (browser, "Location"); + else + gtk_widget_grab_focus (view); + + g_object_freeze_notify (G_OBJECT (browser)); + g_object_notify (G_OBJECT (browser), "uri"); + g_object_notify (G_OBJECT (browser), "tab"); + g_object_thaw_notify (G_OBJECT (browser)); } /** @@ -7816,22 +7393,9 @@ midori_browser_set_current_tab (MidoriBrowser* browser, GtkWidget* midori_browser_get_current_tab (MidoriBrowser* browser) { - #if 0 // def HAVE_GRANITE - GraniteWidgetsTab* tab; - #else - gint n; - #endif - g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); - #if 0 // FIXME: not reliable def HAVE_GRANITE - tab = granite_widgets_dynamic_notebook_get_current ( - GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); - return tab ? granite_widgets_tab_get_page (tab) : NULL; - #else - n = midori_browser_get_current_page (browser); - return (n >= 0) ? midori_browser_get_nth_tab (browser, n) : NULL; - #endif + return (GtkWidget*)midori_notebook_get_tab (MIDORI_NOTEBOOK (browser->notebook)); } /** @@ -7849,12 +7413,7 @@ midori_browser_get_tabs (MidoriBrowser* browser) { g_return_val_if_fail (MIDORI_IS_BROWSER (browser), NULL); - #ifdef HAVE_GRANITE - /* FIXME: granite doesn't correctly implemented gtk.container */ - return granite_widgets_dynamic_notebook_get_children (GRANITE_WIDGETS_DYNAMIC_NOTEBOOK (browser->notebook)); - #else return gtk_container_get_children (GTK_CONTAINER (browser->notebook)); - #endif } /** diff --git a/midori/midori-database.vala b/midori/midori-database.vala index df4608ba..e19fede4 100644 --- a/midori/midori-database.vala +++ b/midori/midori-database.vala @@ -10,13 +10,122 @@ */ namespace Midori { + /* + * Since: 0.5.6 + */ public errordomain DatabaseError { OPEN, NAMING, FILENAME, EXECUTE, + COMPILE, + TYPE, } + /* + * Since: 0.5.7 + */ + public class DatabaseStatement : GLib.Object, GLib.Initable { + public Sqlite.Statement? stmt { get { return _stmt; } } + protected Sqlite.Statement _stmt = null; + public Database? database { get; set construct; } + public string? query { get; set construct; } + + public DatabaseStatement (Database database, string query) throws DatabaseError { + Object (database: database, query: query); + init (); + } + + public virtual bool init (GLib.Cancellable? cancellable = null) throws DatabaseError { + int result = database.db.prepare_v2 (query, -1, out _stmt, null); + if (result != Sqlite.OK) + throw new DatabaseError.COMPILE ("Failed to compile statement: %s".printf (query)); + return true; + } + + /* + * Bind values to named parameters. + * SQL: "SELECT foo FROM bar WHERE id = :session_id" + * Vala: statement.bind(":session_id", typeof (int64), 12345); + * Supported types: string, int64, double + */ + public void bind (string pname, ...) throws DatabaseError { + int pindex = stmt.bind_parameter_index (pname); + var args = va_list (); + Type ptype = args.arg (); + if (ptype == typeof (string)) + stmt.bind_text (pindex, args.arg ()); + else if (ptype == typeof (int64)) + stmt.bind_int64 (pindex, args.arg ()); + else if (ptype == typeof (double)) + stmt.bind_double (pindex, args.arg ()); + else + throw new DatabaseError.TYPE ("Invalid type '%s' for '%s' in statement: %s".printf (ptype.name (), pname, query)); + } + + /* + * Execute the statement, it's an error if there are more rows. + */ + public bool exec () throws DatabaseError { + if (step ()) + throw new DatabaseError.EXECUTE ("More rows available - use step instead of exec"); + return true; + } + + /* + * Proceed to the next row, returns false when the end is nigh. + */ + public bool step () throws DatabaseError { + int result = stmt.step (); + if (result != Sqlite.DONE && result != Sqlite.ROW) + throw new DatabaseError.EXECUTE (database.db.errmsg ()); + return result == Sqlite.ROW; + } + + private int column_index (string name) throws DatabaseError { + for (int i = 0; i < stmt.column_count (); i++) { + if (name == stmt.column_name (i)) + return i; + } + throw new DatabaseError.TYPE ("No such column '%s' in row: %s".printf (name, query)); + } + + /* + * Get a string value by its named parameter, for example ":uri". + */ + public string? get_string (string name) throws DatabaseError { + int index = column_index (name); + if (stmt.column_type (index) != Sqlite.TEXT) + throw new DatabaseError.TYPE ("Getting '%s' with wrong type in row: %s".printf (name, query)); + return stmt.column_text (index); + } + + /* + * Get an integer value by its named parameter, for example ":day". + */ + public int64 get_int64 (string name) throws DatabaseError { + int index = column_index (name); + int type = stmt.column_type (index); + if (type != Sqlite.INTEGER && type != Sqlite.NULL) + throw new DatabaseError.TYPE ("Getting '%s' with value '%s' of wrong type %d in row: %s".printf ( + name, stmt.column_text (index), type, query)); + return stmt.column_int64 (index); + } + + /* + * Get a double value by its named parameter, for example ":session_id". + */ + public double get_double (string name) throws DatabaseError { + int index = column_index (name); + if (stmt.column_type (index) != Sqlite.FLOAT) + throw new DatabaseError.TYPE ("Getting '%s' with wrong type in row: %s".printf (name, query)); + return stmt.column_double (index); + } + } + + /* + * Since: 0.5.6 + */ public class Database : GLib.Object, GLib.Initable { public Sqlite.Database? db { get { return _db; } } protected Sqlite.Database? _db = null; @@ -104,5 +213,32 @@ namespace Midori { throw new DatabaseError.EXECUTE (db.errmsg ()); return true; } + + /* + * Prepare a statement with optionally binding parameters by name. + * See also DatabaseStatement.bind(). + * Since: 0.5.7 + */ + public DatabaseStatement prepare (string query, ...) throws DatabaseError { + var statement = new DatabaseStatement (this, query); + var args = va_list (); + unowned string? pname = args.arg (); + while (pname != null) { + Type ptype = args.arg (); + if (ptype == typeof (string)) { + string pvalue = args.arg (); + statement.bind (pname, ptype, pvalue); + } else if (ptype == typeof (int64)) { + int64 pvalue = args.arg (); + statement.bind (pname, ptype, pvalue); + } else if (ptype == typeof (double)) { + double pvalue = args.arg (); + statement.bind (pname, ptype, pvalue); + } else + throw new DatabaseError.TYPE ("Invalid type '%s' in statement: %s".printf (ptype.name (), query)); + pname = args.arg (); + } + return statement; + } } } diff --git a/midori/midori-dialog.vala b/midori/midori-dialog.vala index a6862eea..9c8e5104 100644 --- a/midori/midori-dialog.vala +++ b/midori/midori-dialog.vala @@ -73,7 +73,7 @@ namespace Midori { } public class FileChooserDialog : Gtk.FileChooserDialog { - public FileChooserDialog (string title, Gtk.Window window, Gtk.FileChooserAction action) { + public FileChooserDialog (string title, Gtk.Window? window, Gtk.FileChooserAction action) { /* Creates a new file chooser dialog to Open or Save and Cancel. The positive response is %Gtk.ResponseType.OK. */ unowned string stock_id = Gtk.Stock.OPEN; diff --git a/midori/midori-download.vala b/midori/midori-download.vala index b49104e4..e2923abb 100644 --- a/midori/midori-download.vala +++ b/midori/midori-download.vala @@ -10,8 +10,10 @@ */ namespace Sokoke { +#if !HAVE_WEBKIT2 extern static bool show_uri (Gdk.Screen screen, string uri, uint32 timestamp) throws Error; extern static bool message_dialog (Gtk.MessageType type, string short, string detailed, bool modal); +#endif } namespace Midori { @@ -52,7 +54,7 @@ namespace Midori { public static string get_tooltip (WebKit.Download download) { #if !HAVE_WEBKIT2 - string filename = Path.get_basename (download.destination_uri); + string filename = Midori.Download.get_basename_for_display (download.destination_uri); /* i18n: Download tooltip (size): 4KB of 43MB */ string size = _("%s of %s").printf ( format_size (download.current_size), @@ -254,6 +256,10 @@ namespace Midori { #endif } + /** + * Returns a filename of the form "name.ext" to use as a suggested name for + * a download of the given uri + */ public string get_filename_suggestion_for_uri (string mime_type, string uri) { return_val_if_fail (Midori.URI.is_location (uri), uri); string filename = File.new_for_uri (uri).get_basename (); @@ -263,8 +269,7 @@ namespace Midori { } public static string? get_extension_for_uri (string uri, out string basename = null) { - if (&basename != null) - basename = null; + basename = null; /* Find the last slash and the last period *after* the last slash. */ int last_slash = uri.last_index_of_char ('/'); /* Huh, URI without slashes? */ @@ -277,8 +282,7 @@ namespace Midori { int query = uri.last_index_of_char ('?', period); /* The extension, or "." if it ended with a period */ string extension = uri.substring (period, query - period); - if (&basename != null) - basename = uri.substring (0, period); + basename = uri.substring (0, period); return extension; } @@ -297,9 +301,28 @@ namespace Midori { return filename; } + /** + * Returns a string showing a file:// URI's intended filename on + * disk, suited for displaying to a user. + * + * The string returned is the basename (final path segment) of the + * filename of the uri. If the uri is invalid, not file://, or has no + * basename, the uri itself is returned. + * + * Since: 0.5.7 + **/ + public static string get_basename_for_display (string uri) { + try { + string filename = Filename.from_uri (uri); + if(filename != null && filename != "") + return Path.get_basename (filename); + } catch (Error error) { } + return uri; + } + public string prepare_destination_uri (WebKit.Download download, string? folder) { string suggested_filename = get_suggested_filename (download); - string basename = File.new_for_uri (suggested_filename).get_basename (); + string basename = Path.get_basename (suggested_filename); string download_dir; if (folder == null) { download_dir = Paths.get_tmp_dir (); @@ -316,9 +339,13 @@ namespace Midori { } } - public static bool has_enough_space (WebKit.Download download, string uri) { + /** + * Returns whether it seems possible to save @download to the path specified by + * @destination_uri, considering space on disk and permissions + */ + public static bool has_enough_space (WebKit.Download download, string destination_uri) { #if !HAVE_WEBKIT2 - var folder = File.new_for_uri (uri).get_parent (); + var folder = File.new_for_uri (destination_uri).get_parent (); bool can_write; uint64 free_space; try { @@ -337,12 +364,12 @@ namespace Midori { string detailed_message; if (!can_write) { message = _("The file \"%s\" can't be saved in this folder.").printf ( - Path.get_basename (uri)); + Midori.Download.get_basename_for_display (destination_uri)); detailed_message = _("You don't have permission to write in this location."); } else if (free_space < download.total_size) { message = _("There is not enough free space to download \"%s\".").printf ( - Path.get_basename (uri)); + Midori.Download.get_basename_for_display (destination_uri)); detailed_message = _("The file needs %s but only %s are left.").printf ( format_size (download.total_size), format_size (free_space)); } diff --git a/midori/midori-extension.c b/midori/midori-extension.c index 48e899f0..4e9b46b3 100644 --- a/midori/midori-extension.c +++ b/midori/midori-extension.c @@ -563,6 +563,7 @@ midori_extension_load_from_folder (MidoriApp* app, g_assert (midori_extension_activate_gracefully (app, extension_path, "libapps." G_MODULE_SUFFIX, activate)); g_assert (midori_extension_activate_gracefully (app, extension_path, "libdelayed-load." G_MODULE_SUFFIX, activate)); g_assert (midori_extension_activate_gracefully (app, extension_path, "libtabby." G_MODULE_SUFFIX, activate)); + g_assert (midori_extension_activate_gracefully (app, extension_path, "libflummi." G_MODULE_SUFFIX, activate)); } else { @@ -674,13 +675,13 @@ midori_extension_add_to_list (MidoriApp* app, if (katze_array_get_item_index (extensions, extension) >= 0) return; /* FIXME need proper stock extension mechanism */ - if (!strcmp (filename, "libtransfers." G_MODULE_SUFFIX) - || !strcmp (filename, "libapps." G_MODULE_SUFFIX) - || !strcmp (filename, "libdelayed-load." G_MODULE_SUFFIX) - || !strcmp (filename, "libtabby." G_MODULE_SUFFIX)) - return; + if (strcmp (filename, "libtransfers." G_MODULE_SUFFIX) + && strcmp (filename, "libapps." G_MODULE_SUFFIX) + && strcmp (filename, "libdelayed-load." G_MODULE_SUFFIX) + && strcmp (filename, "libtabby." G_MODULE_SUFFIX) + && strcmp (filename, "libflummi." G_MODULE_SUFFIX)) + katze_array_add_item (extensions, extension); - katze_array_add_item (extensions, extension); g_object_unref (extensions); if (midori_paths_is_readonly ()) diff --git a/midori/midori-frontend.c b/midori/midori-frontend.c index 84882f13..bc24758c 100644 --- a/midori/midori-frontend.c +++ b/midori/midori-frontend.c @@ -207,7 +207,6 @@ midori_private_app_new (const gchar* config, midori_browser_set_action_visible (browser, "Tools", FALSE); midori_browser_set_action_visible (browser, "ClearPrivateData", FALSE); - midori_browser_set_action_visible (browser, "Panel", FALSE); #if GTK_CHECK_VERSION (3, 0, 0) g_object_set (gtk_widget_get_settings (GTK_WIDGET (browser)), "gtk-application-prefer-dark-theme", TRUE, @@ -368,12 +367,12 @@ midori_frontend_diagnostic_dialog (MidoriApp* app, gchar* crash_log = g_build_filename (midori_paths_get_runtime_dir (), "gdb.bt", NULL); if (g_access (crash_log, F_OK) == 0) { - GtkWidget* button = gtk_button_new_with_mnemonic (_("Show last crash _log")); - g_signal_connect_data (button, "clicked", + GtkWidget* log_button = gtk_button_new_with_mnemonic (_("Show last crash _log")); + g_signal_connect_data (log_button, "clicked", G_CALLBACK (midori_frontend_crash_log_cb), crash_log, (GClosureNotify)g_free, 0); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 4); + gtk_widget_show (log_button); + gtk_box_pack_start (GTK_BOX (box), log_button, FALSE, FALSE, 4); } else g_free (crash_log); @@ -381,11 +380,11 @@ midori_frontend_diagnostic_dialog (MidoriApp* app, gchar* gdb = g_find_program_in_path ("gdb"); if (gdb != NULL) { - GtkWidget* button = gtk_button_new_with_mnemonic (_("Run in _debugger")); + GtkWidget* gdb_button = gtk_button_new_with_mnemonic (_("Run in _debugger")); g_signal_connect (button, "clicked", G_CALLBACK (midori_frontend_debugger_cb), dialog); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 4); + gtk_widget_show (gdb_button); + gtk_box_pack_start (GTK_BOX (box), gdb_button, FALSE, FALSE, 4); } gtk_dialog_set_default_response (GTK_DIALOG (dialog), load_on_startup == MIDORI_STARTUP_HOMEPAGE diff --git a/midori/midori-history.c b/midori/midori-history.c index 11c18f07..bb717747 100644 --- a/midori/midori-history.c +++ b/midori/midori-history.c @@ -18,13 +18,16 @@ static void midori_history_clear_cb (KatzeArray* array, sqlite3* db) { - char* errmsg = NULL; - if (sqlite3_exec (db, "DELETE FROM history; DELETE FROM search", - NULL, NULL, &errmsg) != SQLITE_OK) + GError* error = NULL; + MidoriHistoryDatabase* database = midori_history_database_new (NULL, &error); + if (error == NULL) + midori_history_database_clear (database, 0, &error); + if (error != NULL) { - g_printerr (_("Failed to clear history: %s\n"), errmsg); - sqlite3_free (errmsg); + g_printerr (_("Failed to clear history: %s\n"), error->message); + g_error_free (error); } + g_object_unref (database); } KatzeArray* @@ -60,19 +63,16 @@ midori_history_on_quit (KatzeArray* array, MidoriWebSettings* settings) { gint max_history_age = katze_object_get_int (settings, "maximum-history-age"); - sqlite3* db = g_object_get_data (G_OBJECT (array), "db"); - char* errmsg = NULL; - gchar* sqlcmd = g_strdup_printf ( - "DELETE FROM history WHERE " - "(julianday(date('now')) - julianday(date(date,'unixepoch')))" - " >= %d", max_history_age); - if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) + GError* error = NULL; + MidoriHistoryDatabase* database = midori_history_database_new (NULL, &error); + if (error == NULL) + midori_history_database_clear (database, max_history_age, &error); + if (error != NULL) { /* i18n: Couldn't remove items that are older than n days */ - g_printerr (_("Failed to remove old history items: %s\n"), errmsg); - sqlite3_free (errmsg); + g_printerr (_("Failed to remove old history items: %s\n"), error->message); + g_error_free (error); } - g_free (sqlcmd); - sqlite3_close (db); + g_object_unref (database); } diff --git a/midori/midori-historydatabase.vala b/midori/midori-historydatabase.vala index 825f7e49..5f93bee2 100644 --- a/midori/midori-historydatabase.vala +++ b/midori/midori-historydatabase.vala @@ -39,8 +39,8 @@ namespace Midori { public HistoryDatabase (GLib.Object? app) throws DatabaseError { Object (path: "history.db"); init (); - string bookmarks_filename = Midori.Paths.get_config_filename_for_writing ("bookmarks_v2.db"); - exec ("ATTACH DATABASE '%s' AS bookmarks".printf (bookmarks_filename)); + Midori.BookmarksDatabase bookmarks_database = new Midori.BookmarksDatabase (); + exec ("ATTACH DATABASE '%s' AS bookmarks".printf (bookmarks_database.path)); try { exec ("SELECT day FROM history LIMIT 1"); @@ -49,61 +49,52 @@ namespace Midori { } } - public async List<HistoryItem>? query (string sqlcmd, string? filter, int day, int max_items, Cancellable cancellable) { + public async List<HistoryItem>? query (string sqlcmd, string? filter, int64 day, int64 max_items, Cancellable cancellable) { return_val_if_fail (db != null, null); - Sqlite.Statement stmt; - int result; + Midori.DatabaseStatement statement; - result = db.prepare_v2 (sqlcmd, -1, out stmt, null); - if (result != Sqlite.OK) { - critical (_("Failed to select from history: %s"), db.errmsg ()); - return null; - } - - if (":filter" in sqlcmd) { + try { string real_filter = "%" + filter.replace (" ", "%") + "%"; - stmt.bind_text (stmt.bind_parameter_index (":filter"), real_filter); - } - if (":day" in sqlcmd) - stmt.bind_int64 (stmt.bind_parameter_index (":day"), day); - if (":limit" in sqlcmd) - stmt.bind_int64 (stmt.bind_parameter_index (":limit"), max_items); - - result = stmt.step (); - if (!(result == Sqlite.DONE || result == Sqlite.ROW)) { - critical (_("Failed to select from history: %s"), db.errmsg ()); + statement = prepare (sqlcmd, + ":filter", typeof (string), real_filter, + ":day", typeof (int64), day, + ":limit", typeof (int64), max_items); + } catch (Error error) { + critical (_("Failed to select from history: %s"), error.message); return null; } var items = new List<HistoryItem> (); - while (result == Sqlite.ROW) { - int64 type = stmt.column_int64 (0); - int64 date = stmt.column_int64 (1); - switch (type) { - case 1: - string uri = stmt.column_text (2); - string title = stmt.column_text (3); - items.append (new HistoryWebsite (uri, title, date)); - break; - case 2: - string uri = stmt.column_text (2); - string title = stmt.column_text (3); - items.append (new HistorySearch (uri, title, date)); - break; - default: - warn_if_reached (); - break; + try { + while (statement.step ()) { + int64 type = statement.get_int64 ("type"); + int64 date = statement.get_int64 ("date"); + switch (type) { + case 1: + string uri = statement.get_string ("uri"); + string title = statement.get_string ("title"); + items.append (new HistoryWebsite (uri, title, date)); + break; + case 2: + string uri = statement.get_string ("uri"); + string title = statement.get_string ("title"); + items.append (new HistorySearch (uri, title, date)); + break; + default: + warn_if_reached (); + break; + } + + uint src = Idle.add (query.callback); + yield; + Source.remove (src); + + if (cancellable.is_cancelled ()) + return null; } - - uint src = Idle.add (query.callback); - yield; - Source.remove (src); - - if (cancellable.is_cancelled ()) - return null; - - result = stmt.step (); + } catch (Error error) { + critical (_("Failed to select from history: %s"), error.message); } if (cancellable.is_cancelled ()) @@ -127,5 +118,29 @@ namespace Midori { """; return yield query (sqlcmd, filter, 0, max_items, cancellable); } + + public bool insert (string uri, string title, int64 date, int64 day) throws DatabaseError { + unowned string sqlcmd = "INSERT INTO history (uri, title, date, day) VALUES (:uri, :title, :date, :day)"; + var statement = prepare (sqlcmd, + ":uri", typeof (string), uri, + ":title", typeof (string), title, + ":date", typeof (int64), date, + ":day", typeof (int64), day); + return statement.exec (); + } + + public bool clear (int64 maximum_age=0) throws DatabaseError { + unowned string sqlcmd = """ + DELETE FROM history WHERE + (julianday(date('now')) - julianday(date(date,'unixepoch'))) + >= :maximum_age; + DELETE FROM search WHERE + (julianday(date('now')) - julianday(date(date,'unixepoch'))) + >= :maximum_age; + """; + var statement = prepare (sqlcmd, + ":maximum_age", typeof (int64), maximum_age); + return statement.exec (); + } } } diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c index 949fbd0f..dc70765c 100644 --- a/midori/midori-locationaction.c +++ b/midori/midori-locationaction.c @@ -1322,22 +1322,22 @@ midori_location_action_cert_response_cb (GtkWidget* dialog, { /* FIXME: Would be nice if GcrCertificateExporter became public */ gchar* filename = g_strconcat (peer, ".crt", NULL); - GtkWidget* dialog = (GtkWidget*)midori_file_chooser_dialog_new (_("Export certificate"), + GtkWidget* export_dialog = (GtkWidget*)midori_file_chooser_dialog_new (_("Export certificate"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE); - gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), filename); + gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (export_dialog), TRUE); + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (export_dialog), filename); g_free (filename); - if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) + if (gtk_dialog_run (GTK_DIALOG (export_dialog)) == GTK_RESPONSE_OK) { gsize n_data; gconstpointer data = gcr_certificate_get_der_data (gcr_cert, &n_data); g_return_if_fail (data); - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (export_dialog)); g_file_set_contents (filename, data, n_data, NULL); g_free (filename); } - gtk_widget_destroy (dialog); + gtk_widget_destroy (export_dialog); } if (error != NULL) { @@ -1448,11 +1448,13 @@ midori_location_action_icon_released_cb (GtkWidget* widget, gint button, GtkAction* action) { - /* The dialog should "toggle" like a menu, as far as users go - FIXME: Half-working: the dialog closes but re-opens */ + /* The dialog should "toggle" like a menu, as far as users go */ static GtkWidget* dialog = NULL; if (icon_pos == GTK_ENTRY_ICON_PRIMARY && dialog != NULL) + { gtk_widget_destroy (dialog); + return; // Previously code was running on and the widget was being rebuilt + } if (icon_pos == GTK_ENTRY_ICON_PRIMARY) { diff --git a/midori/midori-notebook.vala b/midori/midori-notebook.vala new file mode 100644 index 00000000..eaeded52 --- /dev/null +++ b/midori/midori-notebook.vala @@ -0,0 +1,526 @@ +/* + Copyright (C) 2013 Christian Dywan <christian@twotoasts.de> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +namespace Midori { + protected class Tally : Gtk.EventBox { + public Midori.Tab tab { get; set; } + Gtk.Spinner spinner; + public Gtk.Label label; + Gtk.HBox box; + public Gtk.Image icon; + Gtk.Alignment align; + Gtk.Button close; + + public bool close_button_left { get; set; default = false; } + public bool close_button_visible { get; set; default = false; } + + protected Tally (Midori.Tab tab) { + this.tab = tab; + box = new Gtk.HBox (false, 1); + add (box); + + spinner = new Gtk.Spinner (); + spinner.active = true; + /* Ensure the spinner is the size of the icon */ + int icon_size = 16; + Gtk.icon_size_lookup_for_settings (get_settings (), + Gtk.IconSize.MENU, out icon_size, null); + spinner.set_size_request (icon_size, icon_size); + box.pack_start (spinner, false, false, 0); + label = new Gtk.Label (null); + label.set_alignment (0.0f, 0.5f); + label.set_padding (0, 0); + box.pack_start (label, true, true, 0); + close = new Gtk.Button (); + close.relief = Gtk.ReliefStyle.NONE; + close.focus_on_click = false; +#if !HAVE_GTK3 + close.name = "midori-close-button"; + close.style_set.connect (close_style_set); +#endif + icon = new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("window-close-symbolic"), Gtk.IconSize.MENU); + close.add (icon); + align = new Gtk.Alignment (1.0f, 0.5f, 0.0f, 0.0f); + align.add (close); + box.pack_start (align, false, false, 0); + close.clicked.connect (close_clicked); + icon = new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("text-html-symbolic"), Gtk.IconSize.MENU); + box.pack_start (icon, false, false, 0); + box.show_all (); + + tab.notify["uri"].connect (uri_changed); + tab.notify["title"].connect (title_changed); + tab.notify["icon"].connect (icon_changed); + tab.notify["minimized"].connect (minimized_changed); + tab.notify["progress"].connect (progress_changed); + tab.colors_changed.connect (colors_changed); + update_label (); + label.visible = !tab.minimized; + spinner.visible = tab.progress > 0.0; + icon.visible = !spinner.visible; + update_color (); + + notify["close-button-left"].connect (close_button_left_changed); + notify_property ("close-button-left"); + notify["close-button-visible"].connect (close_button_visible_changed); + notify_property ("close-button-visible"); + + Gtk.drag_dest_set (this, Gtk.DestDefaults.ALL, (Gtk.TargetEntry[])null, Gdk.DragAction.COPY); + Gtk.drag_dest_add_text_targets (this); + Gtk.drag_dest_add_uri_targets (this); + drag_data_received.connect (uri_dragged); + } + +#if !HAVE_GTK3 + void close_style_set (Gtk.Style? previous_style) { + Gtk.Requisition size; + close.child.size_request (out size); + close.set_size_request (size.width, size.height); + } +#endif + + void close_clicked () { + tab.destroy (); + } + + void uri_changed (GLib.ParamSpec pspec) { + label.label = tab.uri; + } + + void title_changed (GLib.ParamSpec pspec) { + update_label (); + } + + void update_label () { + string? title; + tab.get ("title", out title); + label.label = Midori.Tab.get_display_title (title, tab.uri); + /* Use computed label below! */ + label.ellipsize = Midori.Tab.get_display_ellipsize (label.label, tab.uri); + tooltip_text = label.label; + } + + void icon_changed (GLib.ParamSpec pspec) { + Icon? icon; + tab.get ("icon", out icon); + this.icon.set_from_gicon (icon, Gtk.IconSize.MENU); + } + + void colors_changed () { + update_color (); + } + + void update_color () { + visible_window = tab.fg_color != null || tab.bg_color != null; + label.modify_fg (Gtk.StateType.NORMAL, tab.fg_color); + label.modify_fg (Gtk.StateType.ACTIVE, tab.fg_color); + modify_bg (Gtk.StateType.NORMAL, tab.bg_color); + modify_bg (Gtk.StateType.ACTIVE, tab.bg_color); + } + + void close_button_left_changed (GLib.ParamSpec pspec) { + if (close_button_left) { + box.reorder_child (align, 0); + box.reorder_child (label, 1); + box.reorder_child (icon, 2); + box.reorder_child (spinner, 3); + } else { + box.reorder_child (spinner, 0); + box.reorder_child (icon, 1); + box.reorder_child (label, 2); + box.reorder_child (align, 3); + } + } + + void close_button_visible_changed (GLib.ParamSpec pspec) { + align.visible = !tab.minimized && close_button_visible; + } + + void minimized_changed (GLib.ParamSpec pspec) { + label.visible = !tab.minimized; + notify_property ("close-button-visible"); + } + + void progress_changed (GLib.ParamSpec pspec) { + spinner.visible = tab.progress > 0.0; + icon.visible = !spinner.visible; + } + + void uri_dragged (Gdk.DragContext context, int x, int y, Gtk.SelectionData data, uint ttype, uint timestamp) { + /* FIXME: Navigate to the URI + string[] uri = data.get_uris (); + if (uri != null) + tab.uri = uri[0]; + else + tab.uri = data.get_text (); + */ + } + } + + public class Notebook : Gtk.EventBox { + public Gtk.Notebook notebook; + int last_tab_size = 0; + +#if !HAVE_GTK3 + static const string style_fixup = """ + style "midori-close-button-style" + { + GtkWidget::focus-padding = 0 + GtkWidget::focus-line-width = 0 + xthickness = 0 + ythickness = 0 + } + widget "*.midori-close-button" style "midori-close-button-style" + """; +#endif + + /* Since: 0.5.7 */ + public uint count { get; private set; default = 0; } + /* Since: 0.5.7 */ + public int index { get; set; default = -1; } + /* Since: 0.5.7 */ + public Midori.Tab? tab { get; set; default = null; } + /* Since: 0.5.7 */ + private Midori.Tab? previous { get; set; default = null; } + + /* Since: 0.5.7 */ + public bool close_buttons_left { get; set; default = true; } + /* Since: 0.5.7 */ + public bool close_buttons_visible { get; set; default = true; } + /* Since: 0.5.7 */ + public bool labels_visible { get; set; default = true; } + + /* Since: 0.5.7 */ + public signal void tab_context_menu (Midori.Tab tab, ContextAction menu); + /* Since: 0.5.7 */ + public signal void context_menu (ContextAction menu); + /* The current tab is about to switch, but the old tab still has focus. + Since: 0.5.7 */ + public signal void tab_switched (Midori.Tab? old, Midori.Tab @new); + /* A tab is about to move to a new position. + Since: 0.5.7 */ + public signal void tab_moved (Midori.Tab tab, uint new_index); + /* A tab is being dragging out of the window. + Since: 0.5.7 */ + public signal void tab_detached (Midori.Tab tab, int x, int y); + /* Since: 0.5.7 */ + public signal void new_tab (); + + [CCode (type = "GtkWidget*")] + public Notebook () { + visible_window = false; + notebook = new Gtk.Notebook (); + notebook.visible = notebook.scrollable = true; + notebook.show_border = false; + notebook.set ("group-name", PACKAGE_NAME); + add (notebook); + +#if !HAVE_GTK3 + /* Remove the inner border between scrollbars and window border */ + Gtk.RcStyle rcstyle = new Gtk.RcStyle (); + rcstyle.xthickness = 0; + notebook.modify_style (rcstyle); + Gtk.rc_parse_string (style_fixup); +#endif + notify["index"].connect (index_changed); + notify["tab"].connect (tab_changed); + notify["labels-visible"].connect (labels_visible_changed); + notify["close-buttons-visible"].connect (close_buttons_visible_changed); + notify["close-buttons-left"].connect (close_buttons_left_changed); + + notebook.size_allocate.connect (size_allocated); + notebook.switch_page.connect (page_switched); + notebook.page_reordered.connect (page_moved); + notebook.create_window.connect (window_created); + + var add = new Gtk.Button (); + add.relief = Gtk.ReliefStyle.NONE; + add.add (new Gtk.Image.from_gicon (new ThemedIcon.with_default_fallbacks ("tab-new-symbolic"), Gtk.IconSize.MENU)); + add.show_all (); + notebook.set_action_widget (add, Gtk.PackType.START); + add.clicked.connect (()=>{ + new_tab (); + }); + + button_press_event.connect (button_pressed); + } + + ~Notebook () { + notebook.size_allocate.disconnect (size_allocated); + notebook.switch_page.disconnect (page_switched); + notebook.page_reordered.disconnect (page_moved); + notebook.create_window.disconnect (window_created); + } + + bool button_pressed (Gdk.EventButton event) { + /* Propagate events in logical label area */ + foreach (var child in notebook.get_children ()) { + var tally = notebook.get_tab_label (tab) as Tally; + Gtk.Allocation size; + tally.get_allocation (out size); + if (tally.get_mapped () + && event.x_root >= size.x + && event.x_root <= (size.x + size.width)) { + tally.button_press_event (event); + return true; + } + } + + if (event.type == Gdk.EventType.2BUTTON_PRESS && event.button == 1 + || event.button == 2) { + new_tab (); + return true; + } + else if (event.button == 3) { + var menu = new Midori.ContextAction ("NotebookContextMenu", null, null, null); + uint counter = 0; + foreach (var child in notebook.get_children ()) { + var tab = child as Midori.Tab; + var tally = notebook.get_tab_label (tab) as Tally; + var action = new Gtk.Action ("Tab%u".printf (counter), tally.label.label, null, null); + action.gicon = tally.icon.gicon; + action.activate.connect (()=>{ + notebook.set_current_page (notebook.page_num (tab)); + }); + menu.add (action); + counter++; + } + context_menu (menu); + var popup = menu.create_menu (null, false); + popup.show (); + popup.attach_to_widget (this, null); + popup.popup (null, null, null, event.button, event.time); + return true; + } + return false; + } + + public void insert (Midori.Tab tab, int index) { + var tally = new Tally (tab); + tally.close_button_left = close_buttons_left; + tally.close_button_visible = close_buttons_visible; + tally.button_press_event.connect (tab_button_pressed); + tally.show (); + tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1); + + /* Minimum requirements for any tab */ + tab.can_focus = tab.visible = true; + notebook.insert_page (tab, tally, index); + notebook.set_tab_reorderable (tab, true); + notebook.set_tab_detachable (tab, true); + tab.destroy.connect (tab_removed); + tab.notify["minimized"].connect (tab_minimized); + count++; + tab.ref (); + relayout (); + } + + void tab_removed () { + count--; + if (count > 0) + relayout (); + } + + void relayout () { + Gtk.Allocation size; + notebook.get_allocation (out size); + resize (size.width); + } + + bool tab_button_pressed (Gtk.Widget label, Gdk.EventButton event) { + Tally tally = label as Tally; + if (event.button == 1) { + /* Leave switching and dragging up to the notebook */ + return false; + } else if (event.button == 2) + tally.tab.destroy (); + else if (event.button == 3) { + var menu = new Midori.ContextAction ("TabContextMenu", null, null, null); + tab_context_menu (tally.tab, menu); + var action_window = new Midori.ContextAction ("TabWindowNew", _("Open in New _Window"), null, "window-new"); + action_window.activate.connect (()=>{ + tab_detached (tally.tab, 128, 128); + }); + menu.add (action_window); + var action_minimize = new Midori.ContextAction ("TabMinimize", tally.tab.minimized ? _("Show Tab _Label") : _("Show Tab _Icon Only"), null, null); + action_minimize.activate.connect (()=>{ + tally.tab.minimized = !tally.tab.minimized; + }); + menu.add (action_minimize); + var action_right = new Midori.ContextAction ("TabCloseRight", ngettext ("Close Tab to the R_ight", "Close Tabs to the R_ight", count - 1), null, null); + action_right.sensitive = count > 1; + action_right.activate.connect (()=>{ + bool found_tab = false; + foreach (var child in notebook.get_children ()) { + if (found_tab) + child.destroy (); + else + found_tab = child == tally.tab; + } + }); + menu.add (action_right); + var action_other = new Midori.ContextAction ("TabCloseOther", ngettext ("Close Ot_her Tab", "Close Ot_her Tabs", count - 1), null, null); + action_other.sensitive = count > 1; + action_other.activate.connect (()=>{ + foreach (var child in notebook.get_children ()) + if (child != tally.tab) + child.destroy (); + }); + menu.add (action_other); + var action_close = new Midori.ContextAction ("TabClose", null, null, Gtk.STOCK_CLOSE); + action_close.activate.connect (()=>{ + tally.tab.destroy (); + }); + menu.add (action_close); + var popup = menu.create_menu (null, false); + popup.show (); + popup.attach_to_widget (this, null); + popup.popup (null, null, null, event.button, event.time); + } + return true; + } + + public void move (Midori.Tab tab, int index) { + notebook.reorder_child (tab, index); + } + + /* Chain up drawing manually to circumvent parent checks */ +#if HAVE_GTK3 + public override bool draw (Cairo.Context cr) { + notebook.draw (cr); + return true; + } +#else + public override bool expose_event (Gdk.EventExpose event) { + notebook.expose_event (event); + return true; + } +#endif + + public override void forall_internal (bool include_internal, Gtk.Callback callback) { + if (include_internal) + callback (notebook); + foreach (var child in notebook.get_children ()) + callback (child); + } + + /* Can't override Gtk.Container.remove because it checks the parent */ + public new void remove (Midori.Tab tab) { + return_if_fail (notebook.get_children ().find (tab) != null); + + notebook.remove (tab); + tab.destroy.disconnect (tab_removed); + tab.notify["minimized"].disconnect (tab_minimized); + tab_removed (); + tab.unref (); + } + + void tab_minimized (GLib.ParamSpec pspec) { + var tally = notebook.get_tab_label (tab) as Tally; + tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1); + } + + public Midori.Tab get_nth_tab (int index) { + return notebook.get_nth_page (index) as Midori.Tab; + } + + public int get_tab_index (Midori.Tab tab) { + return notebook.page_num (tab); + } + + void index_changed (GLib.ParamSpec pspec) { + notebook.set_current_page (index); + } + + void tab_changed (GLib.ParamSpec pspec) { + notebook.set_current_page (notebook.page_num (tab)); + } + + void labels_visible_changed (GLib.ParamSpec pspec) { + notebook.show_tabs = labels_visible; + } + + void close_buttons_visible_changed (GLib.ParamSpec pspec) { + foreach (var child in notebook.get_children ()) { + var tally = notebook.get_tab_label (child) as Tally; + tally.close_button_visible = close_buttons_visible; + } + } + + void close_buttons_left_changed (GLib.ParamSpec pspec) { + foreach (var child in notebook.get_children ()) { + var tally = notebook.get_tab_label (child) as Tally; + tally.close_button_left = close_buttons_left; + } + } + +#if HAVE_GTK3 + void size_allocated (Gtk.Allocation allocation) { +#else + void size_allocated (Gdk.Rectangle allocation) { +#endif + if (labels_visible && count > 0) + resize (allocation.width); + } + +#if HAVE_GTK3 + void page_switched (Gtk.Widget new_tab, uint new_index) { +#else + void page_switched (Gtk.NotebookPage new_tab, uint new_index) { +#endif + tab_switched (previous, new_tab as Tab); + previous = (Midori.Tab)new_tab; + + notify["index"].disconnect (index_changed); + notify["tab"].disconnect (tab_changed); + index = (int)new_index; + tab = (Midori.Tab)new_tab; + notify["index"].connect (index_changed); + notify["tab"].connect (tab_changed); + } + + void page_moved (Gtk.Widget moving_tab, uint new_index) { + tab_moved (moving_tab as Midori.Tab, new_index); + /* Indices change, current tab is not in the same position */ + notify["index"].disconnect (index_changed); + index = (int)get_tab_index (tab); + notify["index"].connect (index_changed); + } + + unowned Gtk.Notebook window_created (Gtk.Widget tab, int x, int y) { + tab_detached (tab as Tab, x, y); + /* The API allows now, the cast is due to bindings not having ? */ + return (Gtk.Notebook)null; + } + + void resize (int new_size) { + int n = int.max (1, (int)count); + new_size /= n; + int icon_size = 16; + Gtk.icon_size_lookup_for_settings (get_settings (), + Gtk.IconSize.MENU, out icon_size, null); + int max_size = 150; + int min_size = icon_size; + if (close_buttons_visible) + min_size += icon_size; + new_size = new_size.clamp (min_size, max_size); + if ((new_size - last_tab_size).abs () < 3) + return; + + last_tab_size = new_size; + foreach (var child in notebook.get_children ()) { + var tab = child as Midori.Tab; + var tally = notebook.get_tab_label (child) as Tally; + tally.set_size_request (tab.minimized ? -1 : last_tab_size, -1); + } + } + } +} diff --git a/midori/midori-panel.c b/midori/midori-panel.c index 7a0cdf28..10e3b20a 100644 --- a/midori/midori-panel.c +++ b/midori/midori-panel.c @@ -536,6 +536,10 @@ static void midori_panel_action_activate_cb (GtkRadioAction* action, MidoriPanel* panel) { + MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (panel)); + GtkActionGroup* actions = midori_browser_get_action_group (browser); + GtkAction* panel_action = gtk_action_group_get_action (actions, "Panel"); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (panel_action), TRUE); GtkWidget* viewable = g_object_get_data (G_OBJECT (action), "viewable"); gint n = midori_panel_page_num (panel, viewable); diff --git a/midori/midori-preferences.c b/midori/midori-preferences.c index 70cca722..0f131ab6 100644 --- a/midori/midori-preferences.c +++ b/midori/midori-preferences.c @@ -399,7 +399,7 @@ midori_preferences_set_settings (MidoriPreferences* preferences, gchar* supports_web_gl = sokoke_js_script_eval (js_context, "!!window.WebGLRenderingContext", NULL); if (g_strcmp0 (supports_web_gl, "true")) - gtk_widget_set_sensitive (button, FALSE); + gtk_widget_hide (button); g_free (supports_web_gl); } #endif @@ -482,11 +482,6 @@ midori_preferences_set_settings (MidoriPreferences* preferences, button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL); gtk_button_set_label (GTK_BUTTON (button), _("Close Buttons on Tabs")); INDENTED_ADD (button); - #ifndef HAVE_GRANITE - button = katze_property_proxy (settings, "always-show-tabbar", NULL); - gtk_button_set_label (GTK_BUTTON (button), _("Always Show Tabbar")); - SPANNED_ADD (button); - #endif button = katze_property_proxy (settings, "open-tabs-next-to-current", NULL); gtk_button_set_label (GTK_BUTTON (button), _("Open Tabs next to Current")); gtk_widget_set_tooltip_text (button, _("Whether to open new tabs next to the current tab or after the last one")); @@ -515,7 +510,7 @@ midori_preferences_set_settings (MidoriPreferences* preferences, INDENTED_ADD (label); button = katze_property_proxy (settings, "proxy-type", NULL); SPANNED_ADD (button); - label = gtk_label_new (_("Hostname")); + label = gtk_label_new (_("URI")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); INDENTED_ADD (label); entry = katze_property_proxy (settings, "http-proxy", "address"); @@ -557,6 +552,7 @@ midori_preferences_set_settings (MidoriPreferences* preferences, gtk_widget_set_tooltip_text (label, _("The maximum size of cached pages on disk")); INDENTED_ADD (label); button = katze_property_proxy (settings, "maximum-cache-size", NULL); + gtk_spin_button_set_range (GTK_SPIN_BUTTON (button), 0, G_MAXINT); gtk_widget_set_tooltip_text (button, _("The maximum size of cached pages on disk")); SPANNED_ADD (button); label = gtk_label_new (_("MB")); @@ -633,7 +629,6 @@ midori_preferences_add_extension_category (KatzePreferences* preferences, MidoriApp* app) { KatzeArray* array; - gchar* extension_path; GtkWidget* scrolled; GtkWidget* addon; GList* children; diff --git a/midori/midori-privatedata.c b/midori/midori-privatedata.c index c95e7a0d..b87fb4d5 100644 --- a/midori/midori-privatedata.c +++ b/midori/midori-privatedata.c @@ -234,7 +234,6 @@ midori_clear_web_cookies_cb (void) MidoriWebSettings* settings = g_object_get_data (G_OBJECT (session), "midori-settings"); SoupSessionFeature* jar = soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR); GSList* cookies = soup_cookie_jar_all_cookies (SOUP_COOKIE_JAR (jar)); - SoupSessionFeature* feature; /* HTTP Cookies/ Web Cookies */ for (; cookies != NULL; cookies = g_slist_next (cookies)) diff --git a/midori/midori-searchaction.c b/midori/midori-searchaction.c index fccbe4a0..01a06096 100644 --- a/midori/midori-searchaction.c +++ b/midori/midori-searchaction.c @@ -422,8 +422,6 @@ midori_search_action_icon_released_cb (GtkWidget* entry, { KATZE_ARRAY_FOREACH_ITEM (item, search_engines) { - const gchar* icon_name; - menuitem = gtk_image_menu_item_new_with_label ( katze_item_get_name (item)); image = gtk_image_new (); @@ -1044,7 +1042,7 @@ midori_search_action_get_editor (MidoriSearchAction* search_action, GtkWidget* entry_uri; GtkWidget* entry_token; - toplevel = gtk_widget_get_toplevel (search_action->treeview); + toplevel = search_action->treeview ? gtk_widget_get_toplevel (search_action->treeview) : NULL; dialog = gtk_dialog_new_with_buttons ( new_engine ? _("Add search engine") : _("Edit search engine"), toplevel ? GTK_WINDOW (toplevel) : NULL, diff --git a/midori/midori-session.c b/midori/midori-session.c index 7c2e7636..a40ef692 100644 --- a/midori/midori-session.c +++ b/midori/midori-session.c @@ -316,8 +316,6 @@ midori_load_soup_session_full (gpointer settings) SoupCookieJar* jar; gchar* config_file; SoupSessionFeature* feature; - gboolean have_new_cookies; - SoupSessionFeature* feature_import; midori_load_soup_session (settings); diff --git a/midori/midori-settings.vala b/midori/midori-settings.vala index fbbe9467..387aafaa 100644 --- a/midori/midori-settings.vala +++ b/midori/midori-settings.vala @@ -153,6 +153,7 @@ namespace Midori { public bool close_buttons_on_tabs { get; set; default = true; } public bool open_tabs_in_the_background { get; set; default = true; } public bool open_tabs_next_to_current { get; set; default = true; } + // [Deprecated (since = "0.5.7")] public bool always_show_tabbar { get; set; default = true; } public string homepage { get; set; default = "about:search"; } diff --git a/midori/midori-speeddial.vala b/midori/midori-speeddial.vala index ff886e25..f069e131 100644 --- a/midori/midori-speeddial.vala +++ b/midori/midori-speeddial.vala @@ -32,8 +32,10 @@ namespace Midori { string filename; string? html = null; List<Spec> thumb_queue = null; +#if !HAVE_WEBKIT2 WebKit.WebView thumb_view = null; Spec? spec = null; +#endif public GLib.KeyFile keyfile; public bool close_buttons_left { get; set; default = false; } @@ -128,8 +130,7 @@ namespace Midori { } catch (KeyFileError error) { } } - if (&count != null) - count = slot_count; + count = slot_count; uint slot = 1; while (slot <= slot_count) { @@ -340,19 +341,19 @@ namespace Midori { refresh (); } - void load_status (GLib.Object thumb_view_, ParamSpec pspec) { #if !HAVE_WEBKIT2 + void load_status (GLib.Object thumb_view_, ParamSpec pspec) { if (thumb_view.load_status != WebKit.LoadStatus.FINISHED && thumb_view.load_status != WebKit.LoadStatus.FAILED) return; thumb_view.notify["load-status"].disconnect (load_status); /* Schedule an idle to give the offscreen time to draw */ Idle.add (save_thumbnail); -#endif } +#endif - bool save_thumbnail () { #if !HAVE_WEBKIT2 + bool save_thumbnail () { return_val_if_fail (spec != null, false); var offscreen = (thumb_view.parent as Gtk.OffscreenWindow); @@ -386,9 +387,9 @@ namespace Midori { thumb_view.notify["load-status"].connect (load_status); thumb_view.load_uri (spec.uri); } -#endif return false; } +#endif void get_thumb (string dial_id, string uri) { #if !HAVE_WEBKIT2 diff --git a/midori/midori-tab.vala b/midori/midori-tab.vala index 36c34ee2..a616e4bb 100644 --- a/midori/midori-tab.vala +++ b/midori/midori-tab.vala @@ -36,10 +36,6 @@ namespace Midori { public class Tab : Gtk.VBox { public WebKit.WebView web_view { get; private set; } - #if HAVE_GRANITE_CLUTTER - public Granite.Widgets.NavigationBox navigation_box { get; private set; } - #endif - private string current_uri = "about:blank"; public string uri { get { return current_uri; @@ -51,6 +47,9 @@ namespace Midori { /* Special is an error, blank or delayed page */ public bool special { get; protected set; default = false; } + /* Minimizing a tab indicates that only the icon should be shown. + Since: 0.1.8 */ + public bool minimized { get; set; default = false; } /* Since: 0.4.8 */ public string mime_type { get; protected set; default = "text/plain"; } /* Since: 0.1.2 */ @@ -58,8 +57,18 @@ namespace Midori { public LoadStatus load_status { get; protected set; default = LoadStatus.FINISHED; } public string? statusbar_text { get; protected set; default = null; } /* Since: 0.5.0 */ + public Gdk.Color? fg_color { get; protected set; default = null; } - public Gdk.Color? bg_color { get; protected set; default = null; } + private Gdk.Color? bg_color_ = null; + public Gdk.Color? bg_color { get { + return bg_color_; + } protected set { + bg_color_ = value; + colors_changed (); + } } + /* After fg_color and bg_color have changed. + Since: 0.5.7 */ + public signal void colors_changed (); /* Special pages don't convey progress */ private double current_progress = 0.0; @@ -105,10 +114,6 @@ namespace Midori { orientation = Gtk.Orientation.VERTICAL; #endif - #if HAVE_GRANITE_CLUTTER - navigation_box = new Granite.Widgets.NavigationBox (); - #endif - web_view = new WebKit.WebView (); /* Load something to avoid a bug where WebKit might not set a main frame */ web_view.load_uri (""); @@ -151,7 +156,7 @@ namespace Midori { #endif public bool can_view_source () { - if (is_blank () || special || view_source) + if (view_source) return false; string content_type = ContentType.from_mime_type (mime_type); #if HAVE_WIN32 @@ -221,9 +226,6 @@ namespace Midori { } public void go_forward () { - #if HAVE_GRANITE_CLUTTER - navigation_box.forward (); - #endif web_view.go_forward (); } diff --git a/midori/midori-view.c b/midori/midori-view.c index 56a836a0..88ad9b34 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -22,10 +22,6 @@ #include <config.h> -#ifdef HAVE_GRANITE -#include <granite.h> -#endif - #ifdef HAVE_GCR #define GCR_API_SUBJECT_TO_CHANGE #include <gcr/gcr.h> @@ -109,21 +105,13 @@ struct _MidoriView KatzeArray* news_feeds; gboolean open_tabs_in_the_background; - gboolean close_buttons_on_tabs; MidoriNewPage open_new_pages_in; gint find_links; gint alerts; + GtkWidget* tab_label; GtkWidget* menu_item; PangoEllipsizeMode ellipsize; - #ifdef HAVE_GRANITE - GraniteWidgetsTab* tab; - #else - GtkWidget* tab_label; - GtkWidget* tab_icon; - GtkWidget* tab_title; - GtkWidget* tab_close; - #endif KatzeItem* item; gint scrollh, scrollv; GtkWidget* scrolled_window; @@ -355,26 +343,6 @@ midori_view_class_init (MidoriViewClass* class) GDK_TYPE_PIXBUF, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - /** - * MidoriView:minimized: - * - * Whether the view is minimized or in normal state. - * - * Minimizing a view indicates that only the icon should - * be advertised rather than the full blown tab label and - * it might otherwise be presented specially. - * - * Since: 0.1.8 - */ - g_object_class_install_property (gobject_class, - PROP_MINIMIZED, - g_param_spec_boolean ( - "minimized", - "Minimized", - "Whether the view is minimized or in normal state", - FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (gobject_class, PROP_ZOOM_LEVEL, g_param_spec_float ( @@ -428,21 +396,6 @@ midori_view_set_title (MidoriView* view, const gchar* title) const gchar* uri = midori_tab_get_uri (MIDORI_TAB (view)); katze_assign (view->title, g_strdup (midori_tab_get_display_title (title, uri))); view->ellipsize = midori_tab_get_display_ellipsize (view->title, uri); - - #ifdef HAVE_GRANITE - if (view->tab) - g_object_set (view->tab, - "label", view->title, "ellipsize-mode", view->ellipsize, NULL); - #else - if (view->tab_label) - { - gtk_label_set_text (GTK_LABEL (view->tab_title), view->title); - gtk_widget_set_tooltip_text (view->tab_icon, view->title); - gtk_widget_set_tooltip_text (view->tab_title, view->title); - if (gtk_label_get_angle (GTK_LABEL (view->tab_title)) == 0.0) - gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), view->ellipsize); - } - #endif if (view->menu_item) gtk_label_set_text (GTK_LABEL (gtk_bin_get_child (GTK_BIN ( view->menu_item))), view->title); @@ -463,20 +416,6 @@ midori_view_apply_icon (MidoriView* view, katze_object_assign (view->icon, icon); g_object_notify (G_OBJECT (view), "icon"); - #ifdef HAVE_GRANITE - if (view->tab) - g_object_set (view->tab, "icon", icon, NULL); - #else - if (view->tab_icon) - { - if (icon_name && !strchr (icon_name, '/')) - katze_throbber_set_static_icon_name (KATZE_THROBBER (view->tab_icon), - icon_name); - else - katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon), - view->icon); - } - #endif if (view->menu_item) { GtkWidget* image = katze_item_get_image (view->item, view->web_view); @@ -541,23 +480,8 @@ static void midori_view_update_load_status (MidoriView* view, MidoriLoadStatus load_status) { - if (midori_tab_get_load_status (MIDORI_TAB (view)) == load_status) - return; - - midori_tab_set_load_status (MIDORI_TAB (view), load_status); - - #ifdef HAVE_GRANITE - if (view->tab) - { - g_object_set (view->tab, "working", - midori_view_get_progress (view) > 0.0, NULL); - g_object_set (view->tab, "menu", midori_view_get_tab_menu (view), NULL); - } - #else - if (view->tab_icon) - katze_throbber_set_animated (KATZE_THROBBER (view->tab_icon), - midori_view_get_progress (view) > 0.0); - #endif + if (midori_tab_get_load_status (MIDORI_TAB (view)) != load_status) + midori_tab_set_load_status (MIDORI_TAB (view), load_status); } #if defined (HAVE_LIBSOUP_2_29_91) @@ -755,11 +679,6 @@ midori_location_action_tls_flags_to_string (GTlsCertificateFlags flags); static void midori_view_load_committed (MidoriView* view) { - #ifdef HAVE_GRANITE_CLUTTER - GraniteWidgetsNavigationBox* navigation_box = midori_tab_get_navigation_box (MIDORI_TAB (view)); - granite_widgets_navigation_box_transition_ready (navigation_box); - #endif - katze_assign (view->icon_uri, NULL); GList* children = gtk_container_get_children (GTK_CONTAINER (view)); @@ -901,11 +820,6 @@ midori_view_web_view_resource_request_cb (WebKitWebView* web_view, GdkPixbuf* pixbuf; const gchar* icon_name = &uri[8] ? &uri[8] : ""; gint icon_size = GTK_ICON_SIZE_MENU; - GdkScreen* screen = gtk_widget_get_screen (GTK_WIDGET (view)); - GtkIconTheme* icon_theme = gtk_icon_theme_get_for_screen (screen); - gint real_icon_size; - GtkIconInfo* icon_info; - const gchar* icon_filename; static gint icon_size_large_dialog = 0; if (!icon_size_large_dialog) @@ -1165,13 +1079,13 @@ midori_view_set_html (MidoriView* view, uri = "about:blank"; #ifndef HAVE_WEBKIT2 WebKitWebFrame* main_frame = webkit_web_view_get_main_frame (web_view); + if (!web_frame) + web_frame = main_frame; if (web_frame == main_frame) { katze_item_set_uri (view->item, uri); midori_tab_set_special (MIDORI_TAB (view), TRUE); } - if (!web_frame) - web_frame = main_frame; webkit_web_frame_load_alternate_string ( web_frame, data, uri, uri); #else @@ -1206,6 +1120,13 @@ midori_view_display_error (MidoriView* view, const gchar* icon; gchar* favicon; gchar* result; + gboolean is_main_frame; + + #ifdef HAVE_WEBKIT2 + is_main_frame = TRUE; + #else + is_main_frame = web_frame && (webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)) == web_frame); + #endif #if !GTK_CHECK_VERSION (3, 0, 0) /* g_object_get_valist: object class `GtkSettings' has no property named `gtk-button-images' */ @@ -1233,6 +1154,7 @@ midori_view_display_error (MidoriView* view, "{tryagain}", try_again, "{uri}", uri, "{hide-button-images}", show_button_images ? "" : "display:none", + "{autofocus}", is_main_frame ? "autofocus=\"true\" " : "", NULL); g_free (favicon); g_free (title_escaped); @@ -1261,6 +1183,10 @@ webkit_web_view_load_error_cb (WebKitWebView* web_view, GError* error, MidoriView* view) { + /*in WebKit2's UIProcess/API/gtk/WebKitLoaderClient.cpp, + didFailProvisionalLoadWithErrorForFrame early-returns if the frame isn't + main, so we know that the pertinent frame here is the view's main frame--so + it's safe for midori_view_display_error to assume it fills in a main frame*/ #ifdef HAVE_WEBKIT2 void* web_frame = NULL; #endif @@ -1617,9 +1543,6 @@ midori_view_web_view_button_press_event_cb (WebKitWebView* web_view, GdkEventButton* event, MidoriView* view) { - GtkClipboard* clipboard; - gchar* uri; - gchar* new_uri; const gchar* link_uri; gboolean background; @@ -1685,7 +1608,8 @@ midori_view_web_view_button_press_event_cb (WebKitWebView* web_view, g_object_unref (result); if (!is_editable) { - clipboard = gtk_clipboard_get_for_display ( + gchar* uri; + GtkClipboard* clipboard = gtk_clipboard_get_for_display ( gtk_widget_get_display (GTK_WIDGET (view)), GDK_SELECTION_PRIMARY); if ((uri = gtk_clipboard_wait_for_text (clipboard))) @@ -1699,7 +1623,7 @@ midori_view_web_view_button_press_event_cb (WebKitWebView* web_view, /* Hold Alt to search for the selected word */ if (event->state & GDK_MOD1_MASK) { - new_uri = sokoke_magic_uri (uri, TRUE, FALSE); + gchar* new_uri = sokoke_magic_uri (uri, TRUE, FALSE); if (!new_uri) { gchar* search = katze_object_get_string ( @@ -1743,7 +1667,10 @@ midori_view_web_view_button_press_event_cb (WebKitWebView* web_view, return FALSE; break; case 3: + /* Older versions don't have the context-menu signal */ + #if WEBKIT_CHECK_VERSION (1, 10, 0) if (event->state & GDK_CONTROL_MASK) + #endif { /* Ctrl + Right-click suppresses javascript button handling */ GtkWidget* menu = gtk_menu_new (); @@ -2103,10 +2030,10 @@ midori_view_get_data_for_uri (MidoriView* view, const gchar* uri) { GList* resources = midori_view_get_resources (view); - GList* list; GString* result = NULL; #ifndef HAVE_WEBKIT2 + GList* list; for (list = resources; list; list = g_list_next (list)) { WebKitWebResource* resource = WEBKIT_WEB_RESOURCE (list->data); @@ -2211,6 +2138,7 @@ midori_web_view_menu_video_save_activate_cb (GtkAction* action, g_free (uri); } +#ifndef HAVE_WEBKIT2 static void midori_view_menu_open_email_activate_cb (GtkAction* action, gpointer user_data) @@ -2222,6 +2150,7 @@ midori_view_menu_open_email_activate_cb (GtkAction* action, uri, GDK_CURRENT_TIME, NULL); g_free (uri); } +#endif static void midori_view_menu_open_link_tab_activate_cb (GtkAction* action, @@ -2554,6 +2483,7 @@ midori_view_get_page_context_action (MidoriView* view, midori_context_action_add_by_name (menu, "AddSpeedDial"); midori_context_action_add_by_name (menu, "SaveAs"); midori_context_action_add_by_name (menu, "SourceView"); + midori_context_action_add_by_name (menu, "SourceViewDom"); if (!g_object_get_data (G_OBJECT (browser), "midori-toolbars-visible")) midori_context_action_add_by_name (menu, "Navigationbar"); if (state & GDK_WINDOW_STATE_FULLSCREEN) @@ -2601,6 +2531,7 @@ midori_view_populate_popup (MidoriView* view, midori_context_action_create_menu (context_action, GTK_MENU (menu), FALSE); } +#if WEBKIT_CHECK_VERSION (1, 10, 0) static gboolean midori_view_web_view_context_menu_cb (WebKitWebView* web_view, #ifdef HAVE_WEBKIT2 @@ -2629,6 +2560,7 @@ midori_view_web_view_context_menu_cb (WebKitWebView* web_view, #endif return FALSE; } +#endif #ifndef HAVE_WEBKIT2 static gboolean @@ -2646,7 +2578,7 @@ webkit_web_view_web_view_ready_cb (GtkWidget* web_view, MidoriNewView where = MIDORI_NEW_VIEW_TAB; GtkWidget* new_view = GTK_WIDGET (midori_view_get_for_widget (web_view)); - WebKitWebWindowFeatures* features = webkit_web_view_get_window_features (web_view); + WebKitWebWindowFeatures* features = webkit_web_view_get_window_features (WEBKIT_WEB_VIEW (web_view)); gboolean locationbar_visible, menubar_visible, toolbar_visible; gint width, height; g_object_get (features, @@ -3045,7 +2977,6 @@ midori_view_init (MidoriView* view) view->title = NULL; view->icon = NULL; view->icon_uri = NULL; - view->minimized = FALSE; view->hit_test = NULL; view->link_uri = NULL; view->selected_text = NULL; @@ -3118,16 +3049,6 @@ midori_view_set_property (GObject* object, view->minimized ? 1 : -1); g_signal_handlers_unblock_by_func (view->item, midori_view_item_meta_data_changed, view); - #ifdef HAVE_GRANITE - if (view->tab) - g_object_set (view->tab, - "fixed", view->minimized, - "label", midori_view_get_display_title (view), - NULL); - #else - if (view->tab_label) - sokoke_widget_set_visible (view->tab_title, !view->minimized); - #endif break; case PROP_ZOOM_LEVEL: midori_view_set_zoom_level (view, g_value_get_float (value)); @@ -3157,9 +3078,6 @@ midori_view_get_property (GObject* object, case PROP_ICON: g_value_set_object (value, view->icon); break; - case PROP_MINIMIZED: - g_value_set_boolean (value, view->minimized); - break; case PROP_ZOOM_LEVEL: g_value_set_float (value, midori_view_get_zoom_level (view)); break; @@ -3206,7 +3124,6 @@ _midori_view_set_settings (MidoriView* view, g_object_get (view->settings, "zoom-level", &zoom_level, "zoom-text-and-images", &zoom_text_and_images, - "close-buttons-on-tabs", &view->close_buttons_on_tabs, "open-new-pages-in", &view->open_new_pages_in, "open-tabs-in-the-background", &view->open_tabs_in_the_background, NULL); @@ -3268,8 +3185,8 @@ midori_view_new_with_item (KatzeItem* item, if (item) { katze_object_assign (view->item, katze_item_copy (item)); - view->minimized = katze_item_get_meta_string ( - view->item, "minimized") != NULL; + midori_tab_set_minimized (MIDORI_TAB (view), + katze_item_get_meta_string (view->item, "minimized") != NULL); } gtk_widget_show ((GtkWidget*)view); return (GtkWidget*)view; @@ -3297,14 +3214,6 @@ midori_view_settings_notify_cb (MidoriWebSettings* settings, g_value_get_boolean (&value)); } #endif - else if (name == g_intern_string ("close-buttons-on-tabs")) - { - view->close_buttons_on_tabs = g_value_get_boolean (&value); - #ifndef HAVE_GRANITE - sokoke_widget_set_visible (view->tab_close, - view->close_buttons_on_tabs); - #endif - } else if (name == g_intern_string ("open-tabs-in-the-background")) view->open_tabs_in_the_background = g_value_get_boolean (&value); else if (name == g_intern_string ("enable-javascript")) @@ -3395,8 +3304,6 @@ midori_view_web_inspector_construct_window (gpointer inspector, const gchar* label; GtkWidget* window; GtkWidget* toplevel; - GdkScreen* screen; - gint width, height; const gchar* icon_name; GtkIconTheme* icon_theme; GdkPixbuf* icon; @@ -3525,7 +3432,6 @@ midori_view_constructor (GType type, guint n_construct_properties, GObjectConstructParam* construct_properties) { - gpointer inspector; GObject* object = G_OBJECT_CLASS (midori_view_parent_class)->constructor ( type, n_construct_properties, construct_properties); MidoriView* view = MIDORI_VIEW (object); @@ -3580,8 +3486,10 @@ midori_view_constructor (GType type, webkit_web_view_hovering_over_link_cb, view, "signal::status-bar-text-changed", webkit_web_view_statusbar_text_changed_cb, view, + #if WEBKIT_CHECK_VERSION (1, 10, 0) "signal::context-menu", midori_view_web_view_context_menu_cb, view, + #endif "signal::console-message", webkit_web_view_console_message_cb, view, "signal::download-requested", @@ -3621,16 +3529,7 @@ midori_view_constructor (GType type, #if GTK_CHECK_VERSION(3, 2, 0) view->overlay = gtk_overlay_new (); gtk_widget_show (view->overlay); - #ifdef HAVE_GRANITE_CLUTTER - { - GraniteWidgetsNavigationBox* navigation_box = midori_tab_get_navigation_box (MIDORI_TAB (view)); - granite_widgets_navigation_box_add (navigation_box, GTK_WIDGET (view->scrolled_window)); - gtk_widget_show (GTK_WIDGET (view->scrolled_window)); - gtk_container_add (GTK_CONTAINER (view->overlay), GTK_WIDGET (navigation_box)); - } - #else gtk_container_add (GTK_CONTAINER (view->overlay), view->scrolled_window); - #endif gtk_box_pack_start (GTK_BOX (view), view->overlay, TRUE, TRUE, 0); /* Overlays must be created before showing GtkOverlay as of GTK+ 3.2 */ @@ -3661,7 +3560,7 @@ midori_view_constructor (GType type, #ifndef HAVE_WEBKIT2 gtk_container_add (GTK_CONTAINER (view->scrolled_window), view->web_view); - inspector = webkit_web_view_get_inspector ((WebKitWebView*)view->web_view); + gpointer inspector = webkit_web_view_get_inspector ((WebKitWebView*)view->web_view); g_object_connect (inspector, "signal::inspect-web-view", midori_view_web_inspector_inspect_web_view_cb, view, @@ -3891,7 +3790,7 @@ midori_view_set_uri (MidoriView* view, if (handled) return; - + if (!strcmp (uri, "about:new")) uri = midori_settings_get_tabhome (MIDORI_SETTINGS (view->settings)); if (!strcmp (uri, "about:home")) @@ -4385,14 +4284,6 @@ midori_view_get_proxy_menu_item (MidoriView* view) return view->menu_item; } -static void -midori_view_tab_label_menu_duplicate_tab_cb (GtkAction* action, - gpointer user_data) -{ - MidoriView* view = user_data; - midori_view_duplicate (view); -} - GtkWidget* midori_view_duplicate (MidoriView* view) { @@ -4405,37 +4296,6 @@ midori_view_duplicate (MidoriView* view) return new_view; } -static void -midori_view_tab_label_menu_close_other_tabs_cb (GtkAction* action, - gpointer user_data) -{ - GtkWidget* view = user_data; - MidoriBrowser* browser = midori_browser_get_for_widget (view); - GList* tabs = midori_browser_get_tabs (browser); - for (; tabs; tabs = g_list_next (tabs)) - { - if (tabs->data != view) - midori_browser_close_tab (browser, tabs->data); - } - g_list_free (tabs); -} - -static void -midori_view_tab_label_menu_minimize_tab_cb (GtkAction* action, - gpointer user_data) -{ - MidoriView* view = user_data; - g_object_set (view, "minimized", !view->minimized, NULL); -} - -static void -midori_view_tab_label_menu_close_cb (GtkAction* action, - gpointer user_data) -{ - GtkWidget* view = user_data; - midori_browser_close_tab (midori_browser_get_for_widget (view), view); -} - /** * midori_view_get_tab_menu: * @view: a #MidoriView @@ -4446,240 +4306,14 @@ midori_view_tab_label_menu_close_cb (GtkAction* action, * Return value: a #GtkMenu * * Since: 0.1.8 + * Deprecated: 0.5.7: Use MidoriNotebook API instead. **/ GtkWidget* midori_view_get_tab_menu (MidoriView* view) { g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); - MidoriBrowser* browser = midori_browser_get_for_widget (GTK_WIDGET (view)); - g_return_val_if_fail (browser != NULL, NULL); - - GtkActionGroup* actions = midori_browser_get_action_group (browser); - MidoriContextAction* menu = midori_context_action_new ("TabContextMenu", NULL, NULL, NULL); - midori_context_action_add_action_group (menu, actions); - gint pages = midori_browser_get_n_pages (browser); - - midori_context_action_add_by_name (menu, "TabNew"); - midori_context_action_add_by_name (menu, "UndoTabClose"); - midori_context_action_add (menu, NULL); - midori_context_action_add_simple (menu, "TabWindowNew", _("Open in New _Window"), NULL, STOCK_WINDOW_NEW, - midori_view_tab_label_menu_window_new_cb, view); - midori_context_action_add_simple (menu, "TabDuplicate", _("_Duplicate Tab"), NULL, NULL, - midori_view_tab_label_menu_duplicate_tab_cb, view); - midori_context_action_add_simple (menu, "TabMinimize", - view->minimized ? _("Show Tab _Label") : _("Show Tab _Icon Only"), NULL, NULL, - midori_view_tab_label_menu_minimize_tab_cb, view); - midori_context_action_add (menu, NULL); - GtkAction* action = gtk_action_new ("TabCloseOther", g_dngettext (NULL, "Close Ot_her Tab", "Close Ot_her Tabs", pages - 1), NULL, NULL); - g_signal_connect (action, "activate", G_CALLBACK (midori_view_tab_label_menu_close_other_tabs_cb), view); - gtk_action_set_sensitive (action, pages > 1); - midori_context_action_add (menu, action); - midori_context_action_add_simple (menu, "TabClose", NULL, NULL, GTK_STOCK_CLOSE, - midori_view_tab_label_menu_close_cb, view); - - return GTK_WIDGET (midori_context_action_create_menu (menu, NULL, FALSE)); -} - -#ifdef HAVE_GRANITE -GraniteWidgetsTab* -midori_view_get_tab (MidoriView* view) -{ - if (view->tab == NULL) - { - view->tab = granite_widgets_tab_new ( - midori_view_get_display_title (view), G_ICON (view->icon), GTK_WIDGET (view)); - g_object_set (view->tab, "fixed", view->minimized, NULL); - } - return view->tab; -} - -void -midori_view_set_tab (MidoriView* view, - GraniteWidgetsTab* tab) -{ - g_return_if_fail (MIDORI_IS_VIEW (view)); - - view->tab = tab; - g_object_set (tab, - "label", midori_view_get_display_title (view), - "icon", G_ICON (view->icon), - "page", GTK_WIDGET (view), - "fixed", view->minimized, - NULL); -} - -GtkWidget* -midori_view_get_proxy_tab_label (MidoriView* view) -{ - g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); - - GtkWidget* tab = GTK_WIDGET (midori_view_get_tab (view)); - return tab; -} - -#else -static gboolean -midori_view_tab_label_button_press_event (GtkWidget* tab_label, - GdkEventButton* event, - GtkWidget* widget) -{ - if (event->button == 2) - { - /* Close the widget on middle click */ - midori_browser_close_tab (midori_browser_get_for_widget (widget), widget); - return TRUE; - } - else if (MIDORI_EVENT_CONTEXT_MENU (event)) - { - /* Show a context menu on right click */ - GtkWidget* menu = midori_view_get_tab_menu (MIDORI_VIEW (widget)); - - katze_widget_popup (widget, GTK_MENU (menu), - event, KATZE_MENU_POSITION_CURSOR); - return TRUE; - } - - return FALSE; -} - -static void -midori_view_tab_close_clicked (GtkWidget* tab_close, - GtkWidget* widget) -{ - midori_browser_close_tab (midori_browser_get_for_widget (widget), widget); -} - -#if !GTK_CHECK_VERSION (3, 0, 0) -static void -midori_view_tab_icon_style_set_cb (GtkWidget* tab_close, - GtkStyle* previous_style) -{ - GtkRequisition size; - gtk_widget_size_request (gtk_bin_get_child (GTK_BIN (tab_close)), &size); - gtk_widget_set_size_request (tab_close, size.width, size.height); -} -#endif - -static void -midori_view_update_tab_title (MidoriView* view, - gdouble angle) -{ - if (angle == 0.0) - gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), view->ellipsize); - else - gtk_label_set_ellipsize (GTK_LABEL (view->tab_title), PANGO_ELLIPSIZE_NONE); - gtk_label_set_angle (GTK_LABEL (view->tab_title), angle); -} - -static void -gtk_box_repack (GtkBox* box, - GtkWidget* child) -{ - GtkWidget* old_box; - gboolean expand, fill; - guint padding; - GtkPackType pack_type; - - old_box = gtk_widget_get_parent (child); - g_return_if_fail (GTK_IS_BOX (old_box)); - - gtk_box_query_child_packing (GTK_BOX (old_box), child, - &expand, &fill, &padding, &pack_type); - - g_object_ref (child); - gtk_container_remove (GTK_CONTAINER (old_box), child); - if (pack_type == GTK_PACK_START) - gtk_box_pack_start (box, child, expand, fill, padding); - else - gtk_box_pack_end (box, child, expand, fill, padding); - g_object_unref (child); -} - -static void -midori_view_tab_label_parent_set (GtkWidget* tab_label, -#if GTK_CHECK_VERSION(3,0,0) - GObject* old_parent, -#else - GtkObject* old_parent, -#endif - MidoriView* view) -{ - GtkWidget* parent; - - /* FIXME: Disconnect orientation notification - if (old_parent) - ; */ - - if (!(parent = gtk_widget_get_parent (tab_label))) - return; - - if (GTK_IS_NOTEBOOK (parent)) - { - GtkPositionType pos; - gdouble old_angle, angle; - GtkWidget* box; - - pos = gtk_notebook_get_tab_pos (GTK_NOTEBOOK (parent)); - old_angle = gtk_label_get_angle (GTK_LABEL (view->tab_title)); - switch (pos) - { - case GTK_POS_LEFT: - angle = 90.0; - break; - case GTK_POS_RIGHT: - angle = 270.0; - break; - default: - angle = 0.0; - } - - if (old_angle != angle) - { - GtkWidget* align; - - if (angle == 0.0) - box = gtk_hbox_new (FALSE, 1); - else - box = gtk_vbox_new (FALSE, 1); - gtk_box_repack (GTK_BOX (box), view->tab_icon); - gtk_box_repack (GTK_BOX (box), view->tab_title); - align = gtk_widget_get_parent (view->tab_close); - gtk_box_repack (GTK_BOX (box), align); - - gtk_container_remove (GTK_CONTAINER (tab_label), - gtk_bin_get_child (GTK_BIN (tab_label))); - gtk_container_add (GTK_CONTAINER (tab_label), GTK_WIDGET (box)); - gtk_widget_show (box); - } - - midori_view_update_tab_title (view, angle); - - /* FIXME: Connect orientation notification */ - } -} - -static void midori_view_tab_label_data_received (GtkWidget* widget, - GdkDragContext* context, - gint x, - gint y, - GtkSelectionData* data, - guint ttype, - guint timestamp, - MidoriView* view) -{ - gchar** uri = gtk_selection_data_get_uris (data); - if (uri != NULL) - { - midori_view_set_uri (view, uri[0]); - g_strfreev (uri); - } - else - { - gchar* text = (gchar*) gtk_selection_data_get_text (data); - midori_view_set_uri (view, text); - g_free (text); - } + return gtk_menu_new (); } /** @@ -4689,115 +4323,22 @@ static void midori_view_tab_label_data_received (GtkWidget* widget, * Retrieves a proxy tab label that is typically used when * adding the view to a notebook. * - * Note that the label actually adjusts its orientation - * to the according tab position when used in a notebook. - * - * The label is created on the first call and will be updated to reflect - * changes of the loading progress and title. - * - * The label is valid until it is removed from its container. - * * Return value: the proxy #GtkEventBox + * + * Deprecated: 0.5.7: Don't use this label. **/ GtkWidget* midori_view_get_proxy_tab_label (MidoriView* view) { - GtkWidget* event_box; - GtkWidget* hbox; - #if !GTK_CHECK_VERSION (3, 0, 0) - static const gchar style_fixup[] = - "style \"midori-close-button-style\"\n" - "{\n" - "GtkWidget::focus-padding = 0\n" - "GtkWidget::focus-line-width = 0\n" - "xthickness = 0\n" - "ythickness = 0\n" - "}\n" - "widget \"*.midori-close-button\" style \"midori-close-button-style\""; - #endif - GtkWidget* image; - GtkWidget* align; - g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); if (!view->tab_label) { - view->tab_icon = katze_throbber_new (); - katze_throbber_set_static_pixbuf (KATZE_THROBBER (view->tab_icon), - midori_view_get_icon (view)); - - view->tab_title = gtk_label_new (midori_view_get_display_title (view)); - gtk_misc_set_alignment (GTK_MISC (view->tab_title), 0.0, 0.5); - gtk_misc_set_padding (GTK_MISC (view->tab_title), 0, 0); - - event_box = gtk_event_box_new (); - gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE); - hbox = gtk_hbox_new (FALSE, 1); - gtk_container_add (GTK_CONTAINER (event_box), GTK_WIDGET (hbox)); - midori_view_update_tab_title (view, 0.0); - - view->tab_close = gtk_button_new (); - gtk_button_set_relief (GTK_BUTTON (view->tab_close), GTK_RELIEF_NONE); - gtk_button_set_focus_on_click (GTK_BUTTON (view->tab_close), FALSE); - #if !GTK_CHECK_VERSION (3, 0, 0) - gtk_rc_parse_string (style_fixup); - gtk_widget_set_name (view->tab_close, "midori-close-button"); - g_signal_connect (view->tab_close, "style-set", - G_CALLBACK (midori_view_tab_icon_style_set_cb), NULL); - #endif - image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); - gtk_container_add (GTK_CONTAINER (view->tab_close), image); - align = gtk_alignment_new (1.0, 0.5, 0.0, 0.0); - gtk_container_add (GTK_CONTAINER (align), view->tab_close); - - if (katze_object_get_boolean (view->settings, "close-buttons-left")) - { - gtk_box_pack_end (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0); - gtk_box_pack_end (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0); - } - else - { - gtk_box_pack_start (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0); - } - gtk_widget_show_all (GTK_WIDGET (event_box)); - - if (view->minimized) - gtk_widget_hide (view->tab_title); - if (!view->close_buttons_on_tabs) - gtk_widget_hide (view->tab_close); - - g_signal_connect (event_box, "button-press-event", - G_CALLBACK (midori_view_tab_label_button_press_event), view); - g_signal_connect (view->tab_close, "button-press-event", - G_CALLBACK (midori_view_tab_label_button_press_event), view); - g_signal_connect (view->tab_close, "clicked", - G_CALLBACK (midori_view_tab_close_clicked), view); - - view->tab_label = event_box; - g_signal_connect (view->tab_icon, "destroy", - G_CALLBACK (gtk_widget_destroyed), - &view->tab_icon); - g_signal_connect (view->tab_label, "destroy", - G_CALLBACK (gtk_widget_destroyed), - &view->tab_label); - - g_signal_connect (view->tab_label, "parent-set", - G_CALLBACK (midori_view_tab_label_parent_set), - view); - gtk_drag_dest_set (view->tab_label, GTK_DEST_DEFAULT_ALL, NULL, - 0, GDK_ACTION_COPY); - gtk_drag_dest_add_text_targets (view->tab_label); - gtk_drag_dest_add_uri_targets (view->tab_label); - g_signal_connect (view->tab_label, "drag-data-received", - G_CALLBACK (midori_view_tab_label_data_received), - view); + view->tab_label = gtk_label_new ("dummy"); + gtk_widget_show (view->tab_label); } return view->tab_label; } -#endif /** * midori_view_get_label_ellipsize: @@ -4926,9 +4467,10 @@ midori_view_can_zoom_out (MidoriView* view) * Since: 0.4.4 **/ gchar* -midori_view_save_source (MidoriView* view, +midori_view_save_source (MidoriView* view, const gchar* uri, - const gchar* outfile) + const gchar* outfile, + gboolean use_dom) { #ifndef HAVE_WEBKIT2 WebKitWebFrame *frame; @@ -4942,8 +4484,24 @@ midori_view_save_source (MidoriView* view, g_return_val_if_fail (MIDORI_IS_VIEW (view), NULL); frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)); - data_source = webkit_web_frame_get_data_source (frame); - data = webkit_web_data_source_get_data (data_source); + + if (use_dom) + { + WebKitDOMDocument* doc; + + #if WEBKIT_CHECK_VERSION (1, 9, 5) + doc = webkit_web_frame_get_dom_document (frame); + #else + doc = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view->web_view)); + #endif + + WebKitDOMElement* root = webkit_dom_document_query_selector (doc, ":root", NULL); + const gchar* content = webkit_dom_html_element_get_outer_html (WEBKIT_DOM_HTML_ELEMENT (root)); + data = g_string_new (content); + } else { + data_source = webkit_web_frame_get_data_source (frame); + data = webkit_web_data_source_get_data (data_source); + } if (uri == NULL) uri = midori_view_get_display_uri (view); @@ -5043,11 +4601,6 @@ midori_view_go_back (MidoriView* view) { g_return_if_fail (MIDORI_IS_VIEW (view)); - #ifdef HAVE_GRANITE_CLUTTER - GraniteWidgetsNavigationBox* navigation_box = midori_tab_get_navigation_box (MIDORI_TAB (view)); - granite_widgets_navigation_box_back (navigation_box); - #endif - webkit_web_view_go_back (WEBKIT_WEB_VIEW (view->web_view)); /* Force the speed dial to kick in if going back to a blank page */ if (midori_view_is_blank (view)) @@ -5211,9 +4764,17 @@ midori_view_print (MidoriView* view) GtkPrintSettings* settings = gtk_print_settings_new (); webkit_print_operation_set_print_settings (operation, settings); g_object_unref (settings); - webkit_print_operation_run_dialog (operation, - GTK_WINDOW (midori_browser_get_for_widget (view->web_view))); + + if (katze_object_get_boolean (view->settings, "print-without-dialog")) { + webkit_print_operation_print (operation); + } + else { + webkit_print_operation_run_dialog (operation, + GTK_WINDOW (midori_browser_get_for_widget (view->web_view))); + } g_object_unref (operation); + + #else WebKitWebFrame* frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view->web_view)); GtkPrintOperation* operation = gtk_print_operation_new (); @@ -5222,8 +4783,15 @@ midori_view_print (MidoriView* view) g_signal_connect (operation, "create-custom-widget", G_CALLBACK (midori_view_print_create_custom_widget_cb), view); GError* error = NULL; - webkit_web_frame_print_full (frame, operation, - GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, &error); + + if (katze_object_get_boolean (view->settings, "print-without-dialog")) { + webkit_web_frame_print_full (frame, operation, + GTK_PRINT_OPERATION_ACTION_PRINT, &error); + } + else { + webkit_web_frame_print_full (frame, operation, + GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, &error); + } g_object_unref (operation); if (error) @@ -5385,60 +4953,22 @@ midori_view_get_for_widget (GtkWidget* web_view) #endif return MIDORI_VIEW (view); } - +/** + * midori_view_set_colors: + * @view: a #MidoriView + * @fg_color: a #GdkColor, or %NULL + * @bg_color: a #GdkColor, or %NULL + * + * Sets colors on the label. + * + * Deprecated: 0.5.7: Use fg_color/ bg_color on Midori.Tab. + **/ void midori_view_set_colors (MidoriView* view, GdkColor* fg_color, GdkColor* bg_color) { - /* - The proxy tab label is what's put in the notebook, - in all known cases a GtkEventBox - Contained can be a GtkLabel or a GtkBox including a GtkLabel - Granite as of this writing uses a GtkLabel (which may change) - */ - GtkWidget* box = midori_view_get_proxy_tab_label (view); - GtkWidget* event_box = box; - if (GTK_IS_BOX (box)) - { - GList* children = gtk_container_get_children (GTK_CONTAINER (box)); - for (; children != NULL; children = g_list_next (children)) - if (GTK_IS_EVENT_BOX (children->data)) - { - event_box = children->data; - break; - } - g_list_free (children); - } - - GtkWidget* label = gtk_bin_get_child (GTK_BIN (event_box)); - if (GTK_IS_BOX (label)) - { - GList* children = gtk_container_get_children (GTK_CONTAINER (label)); - for (; children != NULL; children = g_list_next (children)) - if (GTK_IS_LABEL (children->data)) - { - label = children->data; - break; - } - g_list_free (children); - } - midori_tab_set_fg_color (MIDORI_TAB (view), fg_color); midori_tab_set_bg_color (MIDORI_TAB (view), bg_color); - - gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), - fg_color != NULL || bg_color != NULL); - - gtk_widget_modify_fg (label, GTK_STATE_NORMAL, fg_color); - gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, fg_color); - - #if GTK_CHECK_VERSION (3, 0, 0) - gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, bg_color); - gtk_widget_modify_bg (event_box, GTK_STATE_ACTIVE, bg_color); - #else - gtk_widget_modify_bg (box, GTK_STATE_NORMAL, bg_color); - gtk_widget_modify_bg (box, GTK_STATE_ACTIVE, bg_color); - #endif } diff --git a/midori/midori-view.h b/midori/midori-view.h index 2c90eb74..81e33848 100644 --- a/midori/midori-view.h +++ b/midori/midori-view.h @@ -195,7 +195,8 @@ midori_view_can_view_source (MidoriView* view); gchar* midori_view_save_source (MidoriView* view, const gchar* uri, - const gchar* outfile); + const gchar* outfile, + gboolean use_dom); void midori_view_search_text (MidoriView* view, diff --git a/midori/midori-websettings.c b/midori/midori-websettings.c index 46e93a5b..a1e47c39 100644 --- a/midori/midori-websettings.c +++ b/midori/midori-websettings.c @@ -64,6 +64,7 @@ struct _MidoriWebSettings gchar* user_stylesheet_uri; gchar* user_stylesheet_uri_cached; GHashTable* user_stylesheets; + gboolean print_without_dialog; }; struct _MidoriWebSettingsClass @@ -99,6 +100,7 @@ enum PROP_ENABLE_DNS_PREFETCHING, PROP_ENFORCE_FONT_FAMILY, PROP_USER_STYLESHEET_URI, + PROP_PRINT_WITHOUT_DIALOG, }; GType @@ -492,6 +494,16 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class) flags)); g_object_class_install_property (gobject_class, + PROP_PRINT_WITHOUT_DIALOG, + g_param_spec_boolean ( + "print-without-dialog", + "Print without dialog", + "Print without showing a dialog box", + FALSE, + flags)); + + + g_object_class_install_property (gobject_class, PROP_USER_STYLESHEET_URI, g_param_spec_string ( "user-stylesheet-uri", @@ -870,11 +882,9 @@ sokoke_add_quality_value (const gchar *str, static gchar * sokoke_accept_languages (const gchar* const * lang_names) { - GArray *langs_garray = NULL; + GString* langs = NULL; char *cur_lang = NULL; char *prev_lang = NULL; - char **langs_array; - char *langs_str; float delta; int i, n_lang_names; @@ -883,7 +893,7 @@ sokoke_accept_languages (const gchar* const * lang_names) delta = 0.999 / (n_lang_names - 1); /* Build the array of languages */ - langs_garray = g_array_new (TRUE, FALSE, sizeof (char*)); + langs = g_string_sized_new (n_lang_names); for (i = 0; lang_names[i] != NULL; i++) { cur_lang = sokoke_posix_lang_to_rfc2616 (lang_names[i]); @@ -901,21 +911,17 @@ sokoke_accept_languages (const gchar* const * lang_names) /* Add the quality value and append it */ qv_lang = sokoke_add_quality_value (cur_lang, 1 - i * delta); - g_array_append_val (langs_garray, qv_lang); + if (langs->len > 0) + g_string_append_c (langs, ','); + g_string_append (langs, qv_lang); } } /* Fallback: add "en" if list is empty */ - if (langs_garray->len == 0) - { - gchar* fallback = g_strdup ("en"); - g_array_append_val (langs_garray, fallback); - } - - langs_array = (char **) g_array_free (langs_garray, FALSE); - langs_str = g_strjoinv (", ", langs_array); + if (langs->len == 0) + g_string_append (langs, "en"); - return langs_str; + return g_string_free (langs, FALSE); } @@ -1023,7 +1029,7 @@ midori_web_settings_set_property (GObject* object, case PROP_PROXY_TYPE: web_settings->proxy_type = g_value_get_enum (value); - break; + break; case PROP_IDENTIFY_AS: web_settings->identify_as = g_value_get_enum (value); if (web_settings->identify_as != MIDORI_IDENT_CUSTOM) @@ -1107,6 +1113,9 @@ midori_web_settings_set_property (GObject* object, midori_web_settings_process_stylesheets (web_settings, new_len - old_len); } break; + case PROP_PRINT_WITHOUT_DIALOG: + web_settings->print_without_dialog = g_value_get_boolean(value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1223,6 +1232,9 @@ midori_web_settings_get_property (GObject* object, WEB_SETTINGS_STRING ("user-stylesheet-uri"))); #endif break; + case PROP_PRINT_WITHOUT_DIALOG: + g_value_set_boolean (value, web_settings->print_without_dialog); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1527,7 +1539,7 @@ midori_settings_save_to_file (MidoriWebSettings* settings, } else if (type == G_TYPE_PARAM_UINT) { - gint integer; + guint integer; g_object_get (settings, property, &integer, NULL); if (integer != G_PARAM_SPEC_UINT (pspec)->default_value) g_key_file_set_integer (key_file, "settings", property, integer); @@ -1587,12 +1599,12 @@ midori_settings_save_to_file (MidoriWebSettings* settings, KATZE_ARRAY_FOREACH_ITEM (extension, extensions) if (midori_extension_is_active (extension)) { - const gchar* filename = g_object_get_data (G_OBJECT (extension), "filename"); - g_return_val_if_fail (filename != NULL, FALSE); - if (filename && strchr (filename, '/')) - g_warning ("%s: %s unexpected /", G_STRFUNC, filename); + const gchar* extension_filename = g_object_get_data (G_OBJECT (extension), "filename"); + g_return_val_if_fail (extension_filename != NULL, FALSE); + if (extension_filename && strchr (extension_filename, '/')) + g_warning ("%s: %s unexpected /", G_STRFUNC, extension_filename); gchar* key = katze_object_get_string (extension, "key"); - gchar* subname = key ? g_strdup_printf ("%s/%s", filename, key) : g_strdup (filename); + gchar* subname = key ? g_strdup_printf ("%s/%s", extension_filename, key) : g_strdup (extension_filename); g_key_file_set_boolean (key_file, "extensions", subname, TRUE); g_free (key); g_free (subname); diff --git a/midori/midori.vapi b/midori/midori.vapi index fdb53051..da71b207 100644 --- a/midori/midori.vapi +++ b/midori/midori.vapi @@ -31,6 +31,8 @@ namespace Midori { public static void set_instance_is_running (bool is_running); public Browser create_browser (); public GLib.List<weak Browser> get_browsers (); + public void send_notification (string title, string message); + public bool send_command ([CCode (array_length = false)] string[] command); [NoAccessorMethod] public string name { get; set; } @@ -49,13 +51,13 @@ namespace Midori { [NoAccessorMethod] public Katze.Array browsers { get; } public Browser? browser { get; } + public bool crashed { get; } [HasEmitter] public signal void add_browser (Browser browser); public signal void remove_browser (Browser browser); [HasEmitter] public signal void quit (); - public void send_notification (string title, string message); } [CCode (cheader_filename = "midori/midori.h")] @@ -197,7 +199,6 @@ namespace Midori { public string title { get; } public Gdk.Pixbuf icon { get; } - public bool minimized { get; } public float zoom_level { get; } public Katze.Array news_feeds { get; } [NoAccessorMethod] @@ -207,7 +208,7 @@ namespace Midori { [HasEmitter] public signal bool download_requested (WebKit.Download download); public signal bool about_content (string uri); - + public signal void new_view (Midori.View new_view, Midori.NewView where, bool user_initiated); } [CCode (cheader_filename = "midori/midori.h")] @@ -256,6 +257,7 @@ namespace Midori { [CCode (cheader_filename = "midori/sokoke.h", lower_case_cprefix = "sokoke_")] namespace Sokoke { + public static string magic_uri (string uri, bool allow_search, bool allow_relative); public static uint gtk_action_count_modifiers (Gtk.Action action); #if HAVE_WIN32 public static string get_win32_desktop_lnk_path_for_filename (string filename); diff --git a/midori/sokoke.c b/midori/sokoke.c index dc0f2815..03cc7a42 100644 --- a/midori/sokoke.c +++ b/midori/sokoke.c @@ -127,6 +127,7 @@ sokoke_message_dialog (GtkMessageType message_type, } +#ifndef G_OS_WIN32 static void sokoke_open_with_response_cb (GtkWidget* dialog, gint response, @@ -140,6 +141,7 @@ sokoke_open_with_response_cb (GtkWidget* dialog, } gtk_widget_destroy (dialog); } +#endif GAppInfo* sokoke_default_for_uri (const gchar* uri, @@ -859,12 +861,7 @@ sokoke_prefetch_uri (MidoriWebSettings* settings, GCallback callback, gpointer user_data) { - #define MAXHOSTS 50 - static gchar* hosts = NULL; - static gint host_count = G_MAXINT; gchar* hostname; - - #ifndef HAVE_WEBKIT2 SoupURI* soup_uri; SoupSession* session = webkit_get_default_session (); @@ -891,6 +888,10 @@ sokoke_prefetch_uri (MidoriWebSettings* settings, g_free (hostname); return FALSE; #else + #define MAXHOSTS 50 + static gchar* hosts = NULL; + static gint host_count = G_MAXINT; + if (!hosts || !g_regex_match_simple (hostname, hosts, G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY)) @@ -1093,6 +1094,8 @@ sokoke_create_win32_desktop_lnk (gchar* prefix, gchar* filename, gchar* uri) launcher_type = "-a"; else if (g_str_has_suffix (prefix, " -c ")) launcher_type = "-c"; + else + g_assert_not_reached (); argument = g_strdup_printf ("%s \"%s\"", launcher_type, uri); diff --git a/midori/wscript_build b/midori/wscript_build deleted file mode 100644 index be4d1fc9..00000000 --- a/midori/wscript_build +++ /dev/null @@ -1,58 +0,0 @@ -#! /usr/bin/env python -# WAF build script for midori -# This file is licensed under the terms of the expat license, see the file EXPAT. - -import Options -import platform -import os - -progressive = True -libs = 'M UNIQUE LIBSOUP GMODULE GTHREAD LIBIDN GIO GTK SQLITE ' \ - 'LIBNOTIFY WEBKIT JAVASCRIPTCOREGTK LIBXML X11 XSS WS2_32 ' \ - 'GCR GRANITE ZEITGEIST OLE32 UUID ' - -if Options.commands['build'] or Options.commands['check']: - blddir = str (bld.bldnode)[6:] # dir:// + absolute path - duplicate_vapi = blddir + '/default/midori/midori-core.vapi' - if os.path.exists (duplicate_vapi): - os.remove (duplicate_vapi) - -if progressive: - obj = bld.new_task_gen ('cc', 'staticlib') - obj.target = 'midori-core' - obj.find_sources_in_dirs ('../katze . ../panels ../toolbars', exts=['.vala']) - obj.env.append_value ('CCFLAGS', '-w') - obj.uselib = libs - obj.vapi_dirs = '../midori ../katze' - obj.packages = 'glib-2.0 gmodule-2.0 gio-2.0 libsoup-2.4 posix sqlite3' - if bld.env['HAVE_WEBKIT2']: - obj.packages += ' webkit2gtk-3.0' - else: - obj.packages += ' webkitgtk-3.0' - if bld.env['HAVE_GTK3']: - obj.packages += ' gtk+-3.0' - else: - obj.packages += ' gtk+-2.0' - if bld.env['HAVE_GRANITE']: - obj.packages += ' granite' - obj.install_path = None - bld.add_group () - - obj = bld.new_task_gen ('cc', 'staticlib') - obj.target = 'midori-c' - obj.includes = '.. ../katze . ../toolbars' - obj.find_sources_in_dirs ('../katze . ../panels ../toolbars', exts=['.c'], excludes=['main.c']) - obj.uselib = libs - obj.uselib_local = 'midori-core' - obj.add_marshal_file ('marshal.list', 'midori_cclosure_marshal') - obj.install_path = None - bld.add_group () - - obj = bld.new_task_gen ('cc', 'program') - obj.target = 'midori' - obj.includes = '.. ../katze . ../panels' - obj.source = './main.c' - obj.uselib = libs - obj.uselib_local = 'midori-c' - if bld.env['WINRC']: - obj.source += ' ../data/midori.rc' diff --git a/panels/midori-bookmarks.c b/panels/midori-bookmarks.c index 63c5f79b..91e27e5d 100644 --- a/panels/midori-bookmarks.c +++ b/panels/midori-bookmarks.c @@ -366,7 +366,6 @@ static void midori_bookmarks_add_item (KatzeItem* item, MidoriBookmarks* bookmarks) { - gint64 id = katze_item_get_meta_integer (item, "id"); gint64 parentid = katze_item_get_meta_integer (item, "parentid"); GtkTreeModel* model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); GtkTreeIter iter; @@ -649,9 +648,6 @@ static void midori_bookmarks_statusbar_update (MidoriBookmarks *bookmarks) { gchar* text = NULL; - GtkTreeModel* model; - GtkTreeIter iter; - gboolean selected; if (bookmarks->hovering_item) { diff --git a/panels/midori-history.c b/panels/midori-history.c index c3f1c340..5d6f2e65 100644 --- a/panels/midori-history.c +++ b/panels/midori-history.c @@ -662,7 +662,6 @@ midori_history_open_in_tab_activate_cb (GtkWidget* menuitem, { KatzeItem* item; const gchar* uri; - guint n; item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); if (KATZE_ITEM_IS_FOLDER (item)) diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 7af351a4..74202341 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -9,12 +9,16 @@ if (GETTEXT_FOUND) endif () message(STATUS "gettext found: ${LANGUAGES}") string(REPLACE " " ";" LANGUAGES ${LANGUAGES}) - foreach(LANG ${LANGUAGES}) - GETTEXT_PROCESS_PO_FILES(${LANG} ALL) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo" - DESTINATION "${CMAKE_INSTALL_FULL_LOCALEDIR}/${LANG}/LC_MESSAGES" - RENAME "${GETTEXT_PACKAGE}.mo") - endforeach () + if ("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.8") + GETTEXT_CREATE_TRANSLATIONS("${CMAKE_CURRENT_SOURCE_DIR}/midori.pot" ALL ${POTFILES}) + else() + foreach(LANG ${LANGUAGES}) + GETTEXT_PROCESS_PO_FILES(${LANG} ALL PO_FILES ${LANG}.po) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo" + DESTINATION "${CMAKE_INSTALL_FULL_LOCALEDIR}/${LANG}/LC_MESSAGES" + RENAME "${GETTEXT_PACKAGE}.mo") + endforeach () + endif() else () message(STATUS "gettext not found") endif () diff --git a/po/POTFILES.in b/po/POTFILES.in index 34c326de..b1cfc8aa 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -5,6 +5,7 @@ data/midori-private.desktop.in midori/main.c midori/midori-app.c midori/midori-array.c +midori/midori-bookmarksdatabase.vala midori/midori-browser.c midori/midori-database.vala midori/midori-extension.c @@ -13,6 +14,7 @@ midori/midori-panel.c midori/midori-settings.vala midori/midori-websettings.c midori/midori-tab.vala +midori/midori-notebook.vala midori/midori-view.c midori/midori-download.vala midori/midori-speeddial.vala @@ -27,7 +29,6 @@ panels/midori-bookmarks.c panels/midori-extensions.c panels/midori-history.c katze/katze-http-auth.c -katze/katze-throbber.c katze/katze-utils.c katze/katze-item.c katze/katze-array.c @@ -89,3 +90,4 @@ extensions/cookie-permissions/main.c extensions/apps.vala extensions/transfers.vala extensions/tabby.vala +extensions/flummi.vala @@ -8,16 +8,16 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-30 07:51+0000\n" -"Last-Translator: WebKit Team <Unknown>\n" +"PO-Revision-Date: 2014-01-02 13:18+0000\n" +"Last-Translator: Mohammed Shammout <fdsmohammed@gmail.com>\n" "Language-Team: Arabic <herr.linux88@gmail.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" -"X-Launchpad-Export-Date: 2013-08-31 04:45+0000\n" -"X-Generator: Launchpad (build 16750)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "X-Poedit-Country: MOROCCO\n" "Language: ar\n" "X-Poedit-Language: Arabic\n" @@ -25,19 +25,19 @@ msgstr "" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 msgid "Midori" -msgstr "ميدوري" +msgstr "" #: ../data/midori.desktop.in.h:2 msgid "Web Browser" -msgstr "متصفح الوب" +msgstr "مُتصفح شبكه المعلومات" #: ../data/midori.desktop.in.h:3 msgid "Midori Web Browser" -msgstr "مستعرض الويب ميدوري" +msgstr "ميدورى مُتصفح شبكه المعلومات" #: ../data/midori.desktop.in.h:4 msgid "Browse the Web" -msgstr "تصفّح الإنترنت" +msgstr "تصفح شبكه المعلومات" #: ../data/midori.desktop.in.h:5 msgid "Internet;WWW;Explorer" @@ -45,19 +45,19 @@ msgstr "شبكة الإنترنت؛WWW؛إكسبلورر" #: ../data/midori.desktop.in.h:6 ../midori/midori-browser.c:1425 msgid "New Tab" -msgstr "تبويب جديد" +msgstr "لسان جديد" #: ../data/midori.desktop.in.h:7 ../midori/midori-browser.c:1422 msgid "New Window" -msgstr "نافذة جديدة" +msgstr "نافذه جديده" #: ../data/midori.desktop.in.h:8 msgid "New Private Browsing Window" -msgstr "نافذة التصفح الخاص الجديدة" +msgstr "نافذه تصفح خاص جديده" #: ../data/midori-private.desktop.in.h:1 msgid "Midori Private Browsing" -msgstr "متصفح ميدوري الخاص" +msgstr "مُتصفح ميدورى الخاص" #: ../data/midori-private.desktop.in.h:2 ../midori/midori-view.c:4106 msgid "Private Browsing" @@ -65,12 +65,12 @@ msgstr "التصفح الخاص" #: ../data/midori-private.desktop.in.h:3 msgid "Open a new private browsing window" -msgstr "فتح نافذة تصفح خاصة الجديدة" +msgstr "فتح نافذه تصفح خاص جديده" #: ../midori/main.c:52 #, c-format msgid "Snapshot saved to: %s\n" -msgstr "حفظ لقطة في : %s\n" +msgstr "حُفظت اللقطه فى : %s\n" #: ../midori/main.c:79 msgid "Run ADDRESS as a web application" @@ -78,31 +78,32 @@ msgstr "شغل العنوان كتطبيق وب" #: ../midori/main.c:79 msgid "ADDRESS" -msgstr "عنوان" +msgstr "العنوان" #: ../midori/main.c:81 msgid "Use FOLDER as configuration folder" -msgstr "إستعمل المجلد كمجلد إعدادات" +msgstr "إستعمل المُجلد كـ مُجلد إعدادات" #: ../midori/main.c:81 msgid "FOLDER" -msgstr "مجلد" +msgstr "المُجلد" #: ../midori/main.c:83 msgid "Private browsing, no changes are saved" -msgstr "التصفح الخاص ، لا يتم حفظ أية تغييرات" +msgstr "فى التصفح الخاص ، لا تُحفظ اى تغيرات" #: ../midori/main.c:86 msgid "Portable mode, all runtime files are stored in one place" -msgstr "وضع المحمولة، كل ملفات وقت التشغيل يتم تخزينها في مكان واحد" +msgstr "" +"فى وضع الجولنه ، جميع الملفات التى تنشئ فى وقت التشغيل تُخزن فى مكان واحد" #: ../midori/main.c:89 msgid "Plain GTK+ window with WebKit, akin to GtkLauncher" -msgstr "نافذة GTK+ خالية مع أدوات، أقرب إلى مطلق GTK" +msgstr "" #: ../midori/main.c:91 msgid "Show a diagnostic dialog" -msgstr "عرض حوار التشخيص" +msgstr "إظهار صندوق التشخيص" #: ../midori/main.c:93 msgid "Run within gdb and save a backtrace on crash" @@ -126,11 +127,11 @@ msgstr "قائمة الأوامر المتوفرة لتنفيذ مع -e/ --execu #: ../midori/main.c:103 msgid "Display program version" -msgstr "إظهار نسخة البرنامج" +msgstr "إظهر إصدار البرنامج" #: ../midori/main.c:105 msgid "Addresses" -msgstr "عناوين" +msgstr "العناوين" #: ../midori/main.c:107 msgid "Block URIs according to regular expression PATTERN" @@ -297,11 +298,11 @@ msgstr "حرر المجلد" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "مرجعية جديدة" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" -msgstr "" +msgstr "تعديل الإشارة" #: ../midori/midori-browser.c:973 msgid "Type a name for this bookmark, and choose where to keep it." @@ -527,9 +528,12 @@ msgstr "" "\n" "Launchpad Contributions:\n" " Abdallah Ali Hassan https://launchpad.net/~abdallah-ali-hassan\n" +" Fathallah Wael https://launchpad.net/~fathallahwael80\n" " Julian James https://launchpad.net/~reallyhungryhippo\n" " Karim Oulad Chalha https://launchpad.net/~herr-linux\n" +" Mohammed Shammout https://launchpad.net/~fdsmohammed\n" " WebKit Team https://launchpad.net/~webkit-team\n" +" abdXelrhman https://launchpad.net/~popo49-abdo\n" " محمد الحرقان https://launchpad.net/~malham1-gmail" #: ../midori/midori-browser.c:5243 @@ -881,7 +885,7 @@ msgstr "عرض العلامات المحفوظة" #: ../midori/midori-browser.c:6137 msgid "_Tabs" -msgstr "" +msgstr "_التبويبات" #: ../midori/midori-browser.c:6139 msgid "Show a list of all open tabs" @@ -1001,7 +1005,7 @@ msgstr "أظهر أخر تبويب بدون تحميل" #: ../midori/midori-websettings.c:129 msgid "Show Blank Page" -msgstr "" +msgstr "أظهر صفحة فارغة" #: ../midori/midori-websettings.c:131 msgid "Show default Search Engine" @@ -1163,7 +1167,7 @@ msgstr "تأكد من ان إعدادات الشبكة صحبحة" #: ../midori/midori-view.c:1261 msgid "Try Again" -msgstr "" +msgstr "أعِد المحاولة" #: ../midori/midori-view.c:1386 #, c-format @@ -1869,7 +1873,7 @@ msgstr "لا يمكن تشغيل البرنامج الخارجي." #: ../midori/sokoke.c:552 msgid "Invalid URI" -msgstr "" +msgstr "عنوان غير صحيح" #. i18n: A panel at the bottom, to search text in pages #: ../toolbars/midori-findbar.c:233 @@ -1917,7 +1921,7 @@ msgstr[1] "" #: ../panels/midori-bookmarks.c:534 #, c-format msgid "Empty folder" -msgstr "" +msgstr "مجلد فارغ" #. i18n: Folder containing [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:537 @@ -1953,7 +1957,7 @@ msgstr "" #: ../panels/midori-bookmarks.c:575 #, c-format msgid "%s and %s" -msgstr "" +msgstr "%s و %s" #: ../panels/midori-bookmarks.c:627 #, c-format @@ -2928,7 +2932,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:707 #: ../extensions/cookie-permissions/cookie-permission-manager.c:1112 msgid "Accept" -msgstr "" +msgstr "موافق" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:250 #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:709 @@ -2940,7 +2944,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:711 #: ../extensions/cookie-permissions/cookie-permission-manager.c:1114 msgid "Block" -msgstr "" +msgstr "حظر" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:300 #: ../extensions/cookie-permissions/cookie-permission-manager.c:151 @@ -2995,11 +2999,11 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:740 #: ../extensions/cookie-permissions/cookie-permission-manager.c:552 msgid "Domain" -msgstr "" +msgstr "النطاق" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:748 msgid "Policy" -msgstr "" +msgstr "سياسة" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:777 msgid "Delete _all" @@ -3022,7 +3026,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:100 msgid "Reason" -msgstr "" +msgstr "السبب" #: ../extensions/cookie-permissions/cookie-permission-manager.c:140 #, c-format @@ -3067,7 +3071,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:527 msgid "_Accept" -msgstr "" +msgstr "_قبول" #: ../extensions/cookie-permissions/cookie-permission-manager.c:528 msgid "Accept for this _session" @@ -3083,11 +3087,11 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:559 msgid "Path" -msgstr "" +msgstr "المسار" #: ../extensions/cookie-permissions/cookie-permission-manager.c:573 msgid "Value" -msgstr "" +msgstr "القيمة" #: ../extensions/cookie-permissions/cookie-permission-manager.c:584 msgid "Expire date" @@ -3137,7 +3141,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1111 msgid "Undetermined" -msgstr "" +msgstr "غير محدّد" #: ../extensions/cookie-permissions/main.c:62 msgid "Cookie Security Manager" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:20+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -16,8 +16,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -16,8 +16,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Launchpad-Export-Date: 2013-08-06 04:46+0000\n" -"X-Generator: Launchpad (build 16718)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: bg\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -16,8 +16,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -11,15 +11,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-07-13 09:34+0000\n" +"PO-Revision-Date: 2013-11-25 10:06+0000\n" "Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Catalan\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: Catalan\n" "X-Poedit-Language: Catalan\n" "X-Poedit-SourceCharset: utf-8\n" @@ -39,7 +39,7 @@ msgstr "Navegador web Midori" #: ../data/midori.desktop.in.h:4 msgid "Browse the Web" -msgstr "Navega la web" +msgstr "Navegueu pel web" #: ../data/midori.desktop.in.h:5 msgid "Internet;WWW;Explorer" @@ -47,11 +47,11 @@ msgstr "Internet;WWW;Explorador" #: ../data/midori.desktop.in.h:6 ../midori/midori-browser.c:1425 msgid "New Tab" -msgstr "Nova pestanya" +msgstr "Pestanya nova" #: ../data/midori.desktop.in.h:7 ../midori/midori-browser.c:1422 msgid "New Window" -msgstr "Nova finestra" +msgstr "Finestra nova" #: ../data/midori.desktop.in.h:8 msgid "New Private Browsing Window" @@ -76,7 +76,7 @@ msgstr "S'ha desat una captura a: %s\n" #: ../midori/main.c:79 msgid "Run ADDRESS as a web application" -msgstr "Executa ADREÇA com una aplicació web" +msgstr "Executa ADREÇA com a una aplicació web" #: ../midori/main.c:79 msgid "ADDRESS" @@ -97,6 +97,7 @@ msgstr "Navegació privada, els canvis no es desaran" #: ../midori/main.c:86 msgid "Portable mode, all runtime files are stored in one place" msgstr "" +"Modalitat portable, tots els fitxers executables es desen a un sol lloc" #: ../midori/main.c:89 msgid "Plain GTK+ window with WebKit, akin to GtkLauncher" @@ -104,7 +105,7 @@ msgstr "" #: ../midori/main.c:91 msgid "Show a diagnostic dialog" -msgstr "Mostra el diàleg de diagnosis" +msgstr "Mostra el diàleg de diagnòstic" #: ../midori/main.c:93 msgid "Run within gdb and save a backtrace on crash" @@ -116,15 +117,15 @@ msgstr "Executa el fitxer especificat com a javascript" #: ../midori/main.c:97 msgid "Take a snapshot of the specified URI" -msgstr "Fes una captura de la ubicació especificada" +msgstr "Fes una captura de l'URI especificat" #: ../midori/main.c:99 msgid "Execute the specified command" -msgstr "Executar la comanda especificada" +msgstr "Executa l'ordre especificada" #: ../midori/main.c:101 msgid "List available commands to execute with -e/ --execute" -msgstr "Llista de comandes disponibles per a executar amb -e/--execute" +msgstr "Llista d'ordres disponibles per executar amb -e/--execute" #: ../midori/main.c:103 msgid "Display program version" @@ -136,7 +137,7 @@ msgstr "Adreces" #: ../midori/main.c:107 msgid "Block URIs according to regular expression PATTERN" -msgstr "Bloquejar URIs segons l'expressió regular PATRÓ" +msgstr "Bloqueja els URIs segons l'expressió regular PATRÓ" #: ../midori/main.c:107 msgid "PATTERN" @@ -145,7 +146,7 @@ msgstr "PATRÓ" #. i18n: CLI: Close tabs, clear private data, open starting page #: ../midori/main.c:111 msgid "Reset Midori after SECONDS seconds of inactivity" -msgstr "Reiniciar Midori després de SEGONS d'activitat" +msgstr "Reinicia el Midori després de SEGONS segons d'activitat" #: ../midori/main.c:111 msgid "SECONDS" @@ -153,7 +154,7 @@ msgstr "SEGONS" #: ../midori/main.c:136 msgid "Error: \"gdb\" can't be found\n" -msgstr "" +msgstr "Error: no s'ha pogut trobar «gdb»\n" #: ../midori/main.c:162 msgid "Please report comments, suggestions and bugs to:" @@ -161,7 +162,7 @@ msgstr "Envieu comentaris, suggeriments i informes d'error a:" #: ../midori/main.c:164 msgid "Check for new versions at:" -msgstr "Comprova si hi ha noves versions a:" +msgstr "Comproveu si hi ha versions noves a:" #: ../midori/main.c:358 msgid "An unknown error occured" @@ -173,7 +174,7 @@ msgstr "_Adreces d'interès" #: ../midori/midori-app.c:1341 msgid "Add Boo_kmark" -msgstr "Afegeix adreça d'_interès" +msgstr "Afegeix una adreça d'_interès" #: ../midori/midori-app.c:1342 msgid "_Extensions" @@ -194,7 +195,7 @@ msgstr "E_stils personals" #: ../midori/midori-app.c:1346 msgid "New _Tab" -msgstr "Nova _pestanya" +msgstr "Pes_tanya nova" #: ../midori/midori-app.c:1347 msgid "_Transfers" @@ -202,7 +203,7 @@ msgstr "_Transferències" #: ../midori/midori-app.c:1348 msgid "Netscape p_lugins" -msgstr "_Connectors de Netscape" +msgstr "_Connectors del Netscape" #: ../midori/midori-app.c:1349 msgid "_Closed Tabs" @@ -210,11 +211,11 @@ msgstr "Pestanyes _tancades" #: ../midori/midori-app.c:1350 ../midori/midori-browser.c:5245 msgid "New _Window" -msgstr "Nova _finestra" +msgstr "_Finestra nova" #: ../midori/midori-app.c:1351 msgid "New _Folder" -msgstr "Nova _carpeta" +msgstr "_Carpeta nova" #: ../midori/midori-app.c:1400 ../midori/midori-app.c:1403 #: ../midori/midori-app.c:1406 @@ -228,7 +229,7 @@ msgstr "No s'ha trobat el fitxer." #: ../midori/midori-array.c:574 ../midori/midori-array.c:613 #: ../midori/midori-array.c:637 ../midori/midori-array.c:647 msgid "Malformed document." -msgstr "Document format erròniament." +msgstr "El document està format erròniament." #: ../midori/midori-array.c:656 msgid "Unrecognized bookmark format." @@ -246,7 +247,7 @@ msgstr "Avança al apartat següent de la pàgina" #: ../midori/midori-browser.c:345 msgid "Web Search…" -msgstr "" +msgstr "Cerca en el web…" #: ../midori/midori-browser.c:449 ../midori/midori-browser.c:5326 #: ../midori/midori-browser.c:5335 @@ -266,7 +267,7 @@ msgstr "No s'ha pogut actualitzar el títol: %s\n" #: ../midori/midori-browser.c:632 ../midori/midori-websettings.c:1449 #, c-format msgid "Value '%s' is invalid for %s" -msgstr "El valor «%s» no és vàlid per %s" +msgstr "El valor «%s» no és vàlid per a %s" #: ../midori/midori-browser.c:581 ../midori/midori-browser.c:652 #: ../midori/midori-browser.c:6890 @@ -291,27 +292,27 @@ msgstr "Adreces d'interès" #: ../midori/midori-browser.c:949 msgid "New Folder" -msgstr "" +msgstr "Carpeta nova" #: ../midori/midori-browser.c:949 msgid "Edit Folder" -msgstr "" +msgstr "Edita la carpeta" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "Adreça d'interès nova" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" -msgstr "" +msgstr "Edita l'adreça d'interès" #: ../midori/midori-browser.c:973 msgid "Type a name for this bookmark, and choose where to keep it." -msgstr "" +msgstr "Escriviu un nom per aquesta adreça d'interès i trieu on desar-la." #: ../midori/midori-browser.c:975 msgid "Type a name for this folder, and choose where to keep it." -msgstr "" +msgstr "Escriviu un nom per aquesta carpeta i trieu on desar-la." #: ../midori/midori-browser.c:1030 msgid "Add to _Speed Dial" @@ -319,15 +320,15 @@ msgstr "Afegeix al _velocímetre" #: ../midori/midori-browser.c:1039 msgid "Show in Bookmarks _Bar" -msgstr "" +msgstr "Mostrar la _barra de les adreces d'interès" #: ../midori/midori-browser.c:1047 msgid "Run as _web application" -msgstr "Executa com una aplicació _web" +msgstr "Executa com a una aplicació _web" #: ../midori/midori-browser.c:1160 ../midori/midori-browser.c:4523 msgid "Save file as" -msgstr "Anomena i desa" +msgstr "Anomena i desa el fitxer" #: ../midori/midori-browser.c:1170 msgid "Save associated _resources" @@ -335,7 +336,7 @@ msgstr "Desa els _recursos associats" #: ../midori/midori-browser.c:1422 msgid "A new window has been opened" -msgstr "Una nova finestra s'ha obert" +msgstr "S'ha obert una finestra nova" #: ../midori/midori-browser.c:1425 msgid "A new tab has been opened" @@ -347,11 +348,12 @@ msgstr "S'ha produït un error al obrir la imatge!" #: ../midori/midori-browser.c:1444 msgid "Can not open selected image in a default viewer." -msgstr "No s'ha pogut obrir la imatge seleccionada en el visor per defecte." +msgstr "" +"No s'ha pogut obrir la imatge seleccionada en el visor predeterminat." #: ../midori/midori-browser.c:1450 msgid "Error downloading the image!" -msgstr "Error en descarregar la imatge!" +msgstr "S'ha produït un error en baixar la imatge." #: ../midori/midori-browser.c:1451 msgid "Can not download selected image." @@ -373,16 +375,16 @@ msgid "" "Aggregator. Next time you click the news feed icon, it will be added " "automatically." msgstr "" -"Per a usar l'URI que hi ha a dalt, obriu un agregador de notícies. " -"Normalment hi ha un botó de \"Nova suscripció\", \"Noves notícies\" o " -"similar.\n" -"Alternativament, aneu a Preferències/Aplicacions a Midori i seleccioneu " -"agregador de notícies. El proper cop que cliqueu a la icona de les notícies, " -"s'agregarà automàticament." +"Per utilitzar l'URI que hi ha a dalt, obriu un agregador de notícies. " +"Normalment hi ha un botó de «Nova subscripció», «Noves notícies» o " +"similars.\n" +"Alternativament, aneu a «Preferències»/«Aplicacions» al Midori i seleccioneu " +"un agregador de notícies. El proper cop que cliqueu a la icona de les " +"notícies, s'agregarà automàticament." #: ../midori/midori-browser.c:2589 ../extensions/feed-panel/main.c:349 msgid "New feed" -msgstr "Nou canal" +msgstr "Canal web nou" #: ../midori/midori-browser.c:2620 ../midori/midori-browser.c:5401 #: ../panels/midori-bookmarks.c:678 @@ -394,7 +396,7 @@ msgstr "Afegeix una adreça d'interès" #. FIXME: granite: should return GtkWidget* like GTK+ #: ../midori/midori-browser.c:2669 ../midori/midori-browser.c:5277 msgid "Share this page" -msgstr "" +msgstr "Comparteix aquesta pàgina" #: ../midori/midori-browser.c:3149 ../midori/midori-searchaction.c:450 msgid "Empty" @@ -419,17 +421,17 @@ msgstr "_Activa navegació mitjançant símbol d'intercalació" #: ../midori/midori-browser.c:3930 ../midori/midori-browser.c:5849 #, c-format msgid "Failed to insert new history item: %s\n" -msgstr "No s'ha pogut afegir un element nou de l'historial: %s\n" +msgstr "No s'ha pogut afegir un element nou a l'historial: %s\n" #: ../midori/midori-browser.c:4251 ../panels/midori-bookmarks.c:994 #: ../panels/midori-history.c:739 msgid "Open all in _Tabs" -msgstr "Obre-ho tot en _pestanyes" +msgstr "Obre-ho tot en pes_tanyes" #: ../midori/midori-browser.c:4260 ../panels/midori-bookmarks.c:1002 #: ../panels/midori-history.c:745 ../extensions/feed-panel/feed-panel.c:503 msgid "Open in New _Tab" -msgstr "Obre l'enllaç en una _pestanya nova" +msgstr "Obre en una pes_tanya nova" #: ../midori/midori-browser.c:4263 ../midori/midori-view.c:2654 #: ../midori/midori-view.c:4580 ../panels/midori-bookmarks.c:1004 @@ -482,11 +484,11 @@ msgstr "_Aplicació:" #: ../midori/midori-browser.c:4457 msgid "Import from XBEL or HTML file" -msgstr "Importa d'unn fitxer XBEL o HTML" +msgstr "Importa d'un fitxer XBEL o HTML" #: ../midori/midori-browser.c:4485 msgid "Import from a file" -msgstr "Importar d'un fitxer" +msgstr "Importa des d'un fitxer" #: ../midori/midori-browser.c:4497 msgid "Failed to import bookmarks" @@ -498,11 +500,11 @@ msgstr "Adreces d'interès XBEL" #: ../midori/midori-browser.c:4533 msgid "Netscape Bookmarks" -msgstr "Adreces d'interés Netscape" +msgstr "Adreces d'interés del Netscape" #: ../midori/midori-browser.c:4547 msgid "Midori can only export to XBEL (*.xbel) and Netscape (*.html)" -msgstr "Midori només pot exportar a XBEL (*.xbel) i Netscape (*.html)" +msgstr "El Midori només pot exportar a XBEL (*.xbel) i Netscape (*.html)" #: ../midori/midori-browser.c:4562 msgid "Failed to export bookmarks" @@ -514,7 +516,7 @@ msgstr "Un navegador de pàgines web lleuger." #: ../midori/midori-browser.c:4753 msgid "See about:version for version info." -msgstr "Vegeu Quant a:version per a informació de la versió." +msgstr "Vegeu about:version per a més informació sobre la versió." #: ../midori/midori-browser.c:4755 msgid "" @@ -537,10 +539,12 @@ msgstr "" "Launchpad Contributions:\n" " Alfredo Hernández https://launchpad.net/~aldomann\n" " Carles Munoz Gorriz https://launchpad.net/~carlesmu\n" +" Marc https://launchpad.net/~noviluni\n" " Paul Garden https://launchpad.net/~kiari62\n" " WebKit Team https://launchpad.net/~webkit-team\n" " Xan https://launchpad.net/~dxpublica\n" -" mid-kid https://launchpad.net/~esteve-varela" +" mid-kid https://launchpad.net/~esteve-varela\n" +" xavi ballestar https://launchpad.net/~xballestar" #: ../midori/midori-browser.c:5243 msgid "_File" @@ -556,7 +560,7 @@ msgstr "Obre una pestanya nova" #: ../midori/midori-browser.c:5251 msgid "New P_rivate Browsing Window" -msgstr "Nova finestra de navegació p_rivada" +msgstr "Finestra de navegació p_rivada nova" #: ../midori/midori-browser.c:5255 msgid "Open a file" @@ -568,7 +572,7 @@ msgstr "_Desa pàgina com…" #: ../midori/midori-browser.c:5258 msgid "Save to a file" -msgstr "Desa en un fitxer" +msgstr "Desa a un fitxer" #: ../midori/midori-browser.c:5260 msgid "Add to Speed _dial" @@ -576,7 +580,7 @@ msgstr "Afegeix al _velocímetre" #: ../midori/midori-browser.c:5263 msgid "Subscribe to News _feed" -msgstr "Subscriure's a un _canal de notícies" +msgstr "Subscriu-te al _canal de notícies" #: ../midori/midori-browser.c:5269 msgid "_Close Tab" @@ -628,15 +632,15 @@ msgstr "Canvia les preferències de l'aplicació" #: ../midori/midori-browser.c:5322 msgid "_View" -msgstr "_Visualitza" +msgstr "Vi_sualitza" #: ../midori/midori-browser.c:5323 msgid "_Toolbars" -msgstr "Barres d'e_ines" +msgstr "_Barres d'eines" #: ../midori/midori-browser.c:5328 msgid "Reload page without caching" -msgstr "Carrega la pàgina sense emmagatzematge en memòria cau" +msgstr "Recarrega la pàgina sense llegir la memòria cau" #: ../midori/midori-browser.c:5338 msgid "Increase the zoom level" @@ -652,7 +656,7 @@ msgstr "_Codificació" #: ../midori/midori-browser.c:5347 msgid "View So_urce" -msgstr "Veure codi _font" +msgstr "Mostra el codi _font" #: ../midori/midori-browser.c:5350 msgid "Ca_ret Browsing" @@ -684,7 +688,7 @@ msgstr "_Llegible" #: ../midori/midori-browser.c:5371 msgid "_Go" -msgstr "Vé_s" +msgstr "_Vés" #: ../midori/midori-browser.c:5374 msgid "Go back to the previous page" @@ -705,7 +709,7 @@ msgstr "Va a la vostre pàgina d'inici" #: ../midori/midori-browser.c:5393 msgid "Empty Trash" -msgstr "Buida la paperera" +msgstr "Buida les pestanyes tancades recentment" #: ../midori/midori-browser.c:5396 msgid "Undo _Close Tab" @@ -713,15 +717,15 @@ msgstr "Desfés _tanca pestanya" #: ../midori/midori-browser.c:5403 msgid "Add a new _folder" -msgstr "Afegeix una _carpeta" +msgstr "Afegeix una _carpeta nova" #: ../midori/midori-browser.c:5406 msgid "_Import bookmarks…" -msgstr "" +msgstr "_Importa les adreces d'interès…" #: ../midori/midori-browser.c:5409 msgid "_Export bookmarks…" -msgstr "" +msgstr "_Exporta les adreces d'interès…" #: ../midori/midori-browser.c:5412 msgid "_Manage Search Engines…" @@ -729,7 +733,7 @@ msgstr "" #: ../midori/midori-browser.c:5415 msgid "_Clear Private Data…" -msgstr "" +msgstr "_Neteja les dades privades…" #: ../midori/midori-browser.c:5418 msgid "_Inspect Page" @@ -745,7 +749,7 @@ msgstr "_Següent pestanya" #: ../midori/midori-browser.c:5427 msgid "Move Tab to _first position" -msgstr "" +msgstr "Mou la pestanya a la posició _inicial" #: ../midori/midori-browser.c:5429 msgid "Move Tab _Backward" @@ -757,7 +761,7 @@ msgstr "_Mou la Pestanya Endavant" #: ../midori/midori-browser.c:5433 msgid "Move Tab to _last position" -msgstr "" +msgstr "Mou la pestanya a la posició _final" #: ../midori/midori-browser.c:5436 msgid "Focus _Current Tab" @@ -765,7 +769,7 @@ msgstr "Enfoca la pestanya _actual" #: ../midori/midori-browser.c:5439 msgid "Focus _Next view" -msgstr "Enfoca la _Següent vista" +msgstr "Enfoca la vista _següent" #: ../midori/midori-browser.c:5442 msgid "Only show the Icon of the _Current Tab" @@ -891,7 +895,7 @@ msgstr "Mostra les adreces d'interès desades" #: ../midori/midori-browser.c:6137 msgid "_Tabs" -msgstr "" +msgstr "Pes_tanyes" #: ../midori/midori-browser.c:6139 msgid "Show a list of all open tabs" @@ -987,7 +991,7 @@ msgstr "Connexió oberta i sense encriptació" #: ../midori/midori-panel.c:314 ../midori/midori-panel.c:316 #: ../midori/midori-panel.c:480 ../midori/midori-panel.c:483 msgid "Align sidepanel to the right" -msgstr "Alinear el panell lateral a la dreta" +msgstr "Alinea el quadre lateral a la dreta" #: ../midori/midori-panel.c:326 ../midori/midori-panel.c:327 msgid "Close panel" @@ -995,11 +999,11 @@ msgstr "Tanca el quadre" #: ../midori/midori-panel.c:481 ../midori/midori-panel.c:484 msgid "Align sidepanel to the left" -msgstr "Alinear el panell lateral a l'esquerra" +msgstr "Alinea el quadre lateral a l'esquerra" #: ../midori/midori-websettings.c:111 ../midori/midori-websettings.c:132 msgid "Show Speed Dial" -msgstr "Mostra el velocímetre" +msgstr "Mostra el marcador ràpid" #: ../midori/midori-websettings.c:112 ../midori/midori-websettings.c:130 msgid "Show Homepage" @@ -1015,15 +1019,15 @@ msgstr "Mostra les darreres pestanyes sense carregar-les" #: ../midori/midori-websettings.c:129 msgid "Show Blank Page" -msgstr "" +msgstr "Mostra una pàgina en blanc" #: ../midori/midori-websettings.c:131 msgid "Show default Search Engine" -msgstr "" +msgstr "Mostra el motor de cerca predeterminat" #: ../midori/midori-websettings.c:133 msgid "Show custom page" -msgstr "" +msgstr "Mostra una pàgina personalitzada" #: ../midori/midori-websettings.c:150 msgid "Japanese (SHIFT_JIS)" @@ -1031,11 +1035,11 @@ msgstr "Japonès (Shift_JIS)" #: ../midori/midori-websettings.c:170 msgid "New tab" -msgstr "Nova pestanya" +msgstr "Pestanya nova" #: ../midori/midori-websettings.c:171 msgid "New window" -msgstr "Nova finestra" +msgstr "Finestra nova" #: ../midori/midori-websettings.c:172 msgid "Current tab" @@ -1043,7 +1047,7 @@ msgstr "Pestanya actual" #: ../midori/midori-websettings.c:187 msgid "Default" -msgstr "Per defecte" +msgstr "Predeterminat" #: ../midori/midori-websettings.c:188 msgid "Icons" @@ -1119,7 +1123,7 @@ msgstr "No s'ha pogut carregar la configuració: %s\n" #: ../midori/midori-websettings.c:1454 ../midori/midori-websettings.c:1572 #, c-format msgid "Invalid configuration value '%s'" -msgstr "Valor de configuració «%s» no és vàlid" +msgstr "El valor de configuració «%s» no és vàlid" #: ../midori/midori-tab.vala:121 #, c-format @@ -1145,7 +1149,7 @@ msgstr "_Denegar" #: ../midori/midori-view.c:1088 ../midori/midori-view.c:1119 msgid "_Allow" -msgstr "_Permetre" +msgstr "_Permet" #: ../midori/midori-view.c:1115 #, c-format @@ -1160,7 +1164,7 @@ msgstr "" #: ../midori/midori-view.c:1251 #, c-format msgid "The page '%s' couldn't be loaded:" -msgstr "" +msgstr "No s'ha pogut carregar la pàgina «%s»:" #: ../midori/midori-view.c:1255 msgid "Check the address for typos" @@ -1171,6 +1175,8 @@ msgid "" "Make sure that an ethernet cable is plugged in or the wireless card is " "activated" msgstr "" +"Assegureu-vos que el cable de xarxa està endollat o que la targeta de " +"connexió inalàmbrica està activada." #: ../midori/midori-view.c:1257 msgid "Verify that your network settings are correct" @@ -1178,17 +1184,17 @@ msgstr "" #: ../midori/midori-view.c:1261 msgid "Try Again" -msgstr "" +msgstr "Torneu-ho a provar" #: ../midori/midori-view.c:1386 #, c-format msgid "Oops - %s" -msgstr "" +msgstr "Ostres - %s" #: ../midori/midori-view.c:1387 #, c-format msgid "Something went wrong with '%s'." -msgstr "" +msgstr "Alguna cosa ha anat malament amb '%s'" #: ../midori/midori-view.c:1389 msgid "Try again" @@ -1197,7 +1203,7 @@ msgstr "Torneu-ho a provar" #: ../midori/midori-view.c:1527 ../midori/midori-view.c:2595 #, c-format msgid "Send a message to %s" -msgstr "Enviar un missatge a %s" +msgstr "Envia un missatge a %s" #: ../midori/midori-view.c:2378 msgid "Add _search engine..." @@ -1213,7 +1219,7 @@ msgstr "" #: ../midori/midori-view.c:2478 msgid "Open Link in New _Tab" -msgstr "Obre l'enllaç en una nova _pestanya" +msgstr "Obre l'enllaç en una pes_tanya nova" #: ../midori/midori-view.c:2482 msgid "Open Link in _Foreground Tab" @@ -1225,7 +1231,7 @@ msgstr "Obre l'enllaç en una nova pestanya _no activa" #: ../midori/midori-view.c:2486 msgid "Open Link in New _Window" -msgstr "Obre l'enllaç a una nova _finestra" +msgstr "Obre l'enllaç en una _finestra nova" #: ../midori/midori-view.c:2491 msgid "Copy Link de_stination" @@ -1233,19 +1239,19 @@ msgstr "_Copia la destinació de l'enllaç" #: ../midori/midori-view.c:2497 msgid "Save _As…" -msgstr "" +msgstr "_Anomena i desa…" #: ../midori/midori-view.c:2507 msgid "Open _Image in New Window" -msgstr "" +msgstr "Obre la _imatge en una finestra nova" #: ../midori/midori-view.c:2508 msgid "Open _Image in New Tab" -msgstr "Obre la _imatge en una nova pestanya" +msgstr "Obre la _imatge en una pestanya nova" #: ../midori/midori-view.c:2512 msgid "Copy Im_age" -msgstr "" +msgstr "Copia la im_atge" #: ../midori/midori-view.c:2515 msgid "Save I_mage" @@ -1265,7 +1271,7 @@ msgstr "Desa el _vídeo" #: ../midori/midori-view.c:2528 msgid "Download _Video" -msgstr "Descarrega el _vídeo" +msgstr "Baixa el _vídeo" #: ../midori/midori-view.c:2554 msgid "Search _with" @@ -1273,11 +1279,11 @@ msgstr "Cerca _amb" #: ../midori/midori-view.c:2583 msgid "_Search the Web" -msgstr "_Cerca la Web" +msgstr "_Cerca al web" #: ../midori/midori-view.c:2603 msgid "Open Address in New _Tab" -msgstr "Obre l'adreça en una nova _pestanya" +msgstr "Obre l'adreça en una pes_tanya nova" #: ../midori/midori-view.c:2650 msgid "Open _Frame in New Tab" @@ -1326,11 +1332,11 @@ msgstr "No s'ha instaŀlat la documentació" #: ../midori/midori-view.c:4107 msgid "Midori doesn't store any personal data:" -msgstr "Midori no desa cap informació personal:" +msgstr "El Midori no desa cap informació personal:" #: ../midori/midori-view.c:4108 msgid "No history or web cookies are being saved." -msgstr "No es desa ni l'historial ni les galetes." +msgstr "No es desen ni l'historial ni les galetes." #: ../midori/midori-view.c:4109 msgid "Extensions are disabled." @@ -1339,12 +1345,12 @@ msgstr "Les extensions estan deshabilitades." #: ../midori/midori-view.c:4110 msgid "HTML5 storage, local database and application caches are disabled." msgstr "" -"Emmagatzematge HTML5, base de dades local i memòria cau d'aplicacions " -"deshabilitades." +"L'emmagatzematge HTML5, les bases de dades locals i la memòria cau de " +"l'aplicació estan desactivats." #: ../midori/midori-view.c:4111 msgid "Midori prevents websites from tracking the user:" -msgstr "Midori evita que els llocs webs controlin l'usiari:" +msgstr "El Midori evita que els llocs webs controlin l'usuari:" #: ../midori/midori-view.c:4112 msgid "Referrer URLs are stripped down to the hostname." @@ -1361,7 +1367,7 @@ msgstr "L'idioma i la zona horària no són visibles als llocs webs." #: ../midori/midori-view.c:4115 msgid "Flash and other Netscape plugins cannot be listed by websites." msgstr "" -"El Flash i altres connectors de Netscape no es poden llistar als llocs webs." +"El Flash i altres connectors del Netscape no es poden llistar als llocs webs." #: ../midori/midori-view.c:4158 msgid "Version numbers in brackets show the version used at runtime." @@ -1381,7 +1387,7 @@ msgstr "" #: ../midori/midori-view.c:4211 msgid "Load Page" -msgstr "Carregar pàgina" +msgstr "Carrega la pàgina" #: ../midori/midori-view.c:4376 msgid "Blank page" @@ -1473,15 +1479,15 @@ msgstr " (%s/s)" #: ../midori/midori-download.vala:218 msgid "The downloaded file is erroneous." -msgstr "El fitxer descarregat conté errors." +msgstr "El fitxer baixat conté errors." #: ../midori/midori-download.vala:219 msgid "" "The checksum provided with the link did not match. This means the file is " "probably incomplete or was modified afterwards." msgstr "" -"El checksum proveït a l'enllaç no coincideix. Això vol dir que l'arxiu " -"probablement està incomplet o ha sigut modificat posteriorment." +"La suma de verificació proveïda a l'enllaç no coincideix. Això vol dir que " +"el fitxer probablement està incomplet o ha estat modificat posteriorment." #: ../midori/midori-download.vala:339 #, c-format @@ -1490,17 +1496,17 @@ msgstr "No es pot desar el fitxer «%s» en aquesta carpeta." #: ../midori/midori-download.vala:341 msgid "You don't have permission to write in this location." -msgstr "No teniu permís per a escriure en aquesta ubicació." +msgstr "No teniu permís per escriure en aquesta ubicació." #: ../midori/midori-download.vala:344 #, c-format msgid "There is not enough free space to download \"%s\"." -msgstr "No hi ha prou espai lliure per descarregat «%s»." +msgstr "No hi ha prou espai lliure per baixar «%s»." #: ../midori/midori-download.vala:346 #, c-format msgid "The file needs %s but only %s are left." -msgstr "Al fitxer li cal %s però només resten %s lliures." +msgstr "El fitxer necessita %s però només resten %s lliures." #: ../midori/midori-speeddial.vala:187 msgid "Speed Dial" @@ -1508,7 +1514,7 @@ msgstr "Velocímetre" #: ../midori/midori-speeddial.vala:188 ../midori/midori-speeddial.vala:268 msgid "Click to add a shortcut" -msgstr "Feu clic per a afegir una drecera" +msgstr "Feu clic per afegir una drecera" #: ../midori/midori-speeddial.vala:189 msgid "Enter shortcut address" @@ -1520,7 +1526,7 @@ msgstr "Introduïu un títol per a la drecera" #: ../midori/midori-speeddial.vala:191 msgid "Are you sure you want to delete this shortcut?" -msgstr "Esteu segur d'esborrar aquesta drecera?" +msgstr "Esteu segur que voleu suprimir aquesta drecera?" #: ../midori/midori-preferences.c:297 msgid "Startup" @@ -1528,7 +1534,7 @@ msgstr "Inicialització" #: ../midori/midori-preferences.c:299 msgid "When Midori starts:" -msgstr "Quan Midori s'inicia:" +msgstr "Quan el Midori s'inicia:" #: ../midori/midori-preferences.c:304 msgid "Homepage:" @@ -1554,11 +1560,11 @@ msgstr "Família de tipus de lletra proporcional" #: ../midori/midori-preferences.c:331 msgid "The default font family used to display text" msgstr "" -"La família de tipus de lletra per defecte emprada per mostrar el text" +"La família de tipus de lletra predeterminada emprada per mostrar el text" #: ../midori/midori-preferences.c:334 msgid "The default font size used to display text" -msgstr "La mida del tipus de lletra per defecte emprada per mostrar el text" +msgstr "La mida del tipus de lletra predeterminat emprat per mostrar el text" #: ../midori/midori-preferences.c:336 msgid "Fixed-width Font Family" @@ -1566,11 +1572,11 @@ msgstr "Família de tipus de lletra d'amplada fixa" #: ../midori/midori-preferences.c:340 msgid "The font family used to display fixed-width text" -msgstr "La família de fonts per a mostrar text de mida fixa" +msgstr "La família de tipus de lletra emprat per mostrar textos de mida fixa" #: ../midori/midori-preferences.c:343 msgid "The font size used to display fixed-width text" -msgstr "La mida de la font usada per a mostrar text de mida fixa" +msgstr "La mida del tipus de lletra emprat per mostrar textos de mida fixa" #: ../midori/midori-preferences.c:345 msgid "Minimum Font Size" @@ -1578,7 +1584,7 @@ msgstr "Mida mínima del tipus de lletra" #: ../midori/midori-preferences.c:349 msgid "The minimum font size used to display text" -msgstr "La mida mínima del tipus de lletra emprada per mostrar text" +msgstr "La mida mínima del tipus de lletra emprat per mostrar textos" #: ../midori/midori-preferences.c:353 msgid "Preferred Encoding" @@ -1595,23 +1601,23 @@ msgstr "Carrega les imatges automàticament" #: ../midori/midori-preferences.c:366 msgid "Enable Spell Checking" -msgstr "Habilita el corrector ortogràfic" +msgstr "Activa la comprovació ortogràfica" #: ../midori/midori-preferences.c:380 ../extensions/statusbar-features.c:165 msgid "Enable scripts" -msgstr "Habilita els scripts" +msgstr "Activa els scripts" #: ../midori/midori-preferences.c:383 msgid "Enable WebGL support" -msgstr "Habilita la compatibilitat WebGL" +msgstr "Activa la compatibilitat amb el WebGL" #: ../midori/midori-preferences.c:400 msgid "Zoom Text and Images" -msgstr "Ampliar text i imatges" +msgstr "Amplia texts i imatges" #: ../midori/midori-preferences.c:403 msgid "Allow scripts to open popups" -msgstr "Permetre als scripts obrir finestres emergents" +msgstr "Permet als scripts d'obrir finestres emergents" #: ../midori/midori-preferences.c:404 msgid "Whether scripts are allowed to open popup windows automatically" @@ -1639,7 +1645,7 @@ msgstr "" #: ../midori/midori-preferences.c:420 msgid "Save downloaded files to:" -msgstr "Desar els fitxers descarregats a:" +msgstr "Desa els fitxers baixats a:" #. Page "Interface" #: ../midori/midori-preferences.c:427 @@ -1652,11 +1658,11 @@ msgstr "Estil de la barra d'eines:" #: ../midori/midori-preferences.c:433 msgid "Open new pages in:" -msgstr "Obre les noves pàgines a:" +msgstr "Obre les pàgines noves a:" #: ../midori/midori-preferences.c:437 msgid "New tab behavior:" -msgstr "" +msgstr "Comportament de les pestanyes noves:" #: ../midori/midori-preferences.c:442 msgid "Close Buttons on Tabs" @@ -1674,7 +1680,8 @@ msgstr "Obre les pestanyes al costat de l'actual" msgid "" "Whether to open new tabs next to the current tab or after the last one" msgstr "" -"Si obrir les noves pestanyes al costat de la pestanya actual o de l'última" +"Si s'han d'obrir les pestanyes noves al costat de la pestanya actual o al " +"costat de la darrera" #: ../midori/midori-preferences.c:454 msgid "Open tabs in the background" @@ -1712,7 +1719,7 @@ msgstr "" #. TODO: Preserve page icons of search engines and merge privacy items #: ../midori/midori-preferences.c:515 ../midori/midori-privatedata.c:323 msgid "Web Cache" -msgstr "Memòria cau Web" +msgstr "Memòria cau del web" #: ../midori/midori-preferences.c:516 ../midori/midori-preferences.c:519 msgid "The maximum size of cached pages on disk" @@ -1733,11 +1740,11 @@ msgstr "Privacitat" #: ../midori/midori-preferences.c:544 msgid "Delete old Cookies after:" -msgstr "Esborrar les galetes antigues després de:" +msgstr "Suprimeix les galetes antigues després de:" #: ../midori/midori-preferences.c:546 ../midori/midori-preferences.c:549 msgid "The maximum number of days to save cookies for" -msgstr "El nombre màxim de dies que es guardaran les galetes" +msgstr "El nombre màxim de dies que es desaran les galetes" #: ../midori/midori-preferences.c:553 msgid "Only accept Cookies from sites you visit" @@ -1757,11 +1764,11 @@ msgstr "" #: ../midori/midori-preferences.c:566 msgid "Enable offline web application cache" -msgstr "Habilita la memòria cau d'aplicació de fora de línia" +msgstr "Activa la memòria cau local d'aplicacions web" #: ../midori/midori-preferences.c:569 msgid "Enable HTML5 local storage support" -msgstr "Habilita l'emmagatzematge local HTML5" +msgstr "Activa l'emmagatzematge local HTML5" #. i18n: Reworded: Shorten details propagated when going to another page #: ../midori/midori-preferences.c:573 @@ -1772,11 +1779,11 @@ msgstr "Treu la informació de referència enviada als llocs webs" #: ../midori/midori-preferences.c:575 msgid "Whether the \"Referer\" header should be shortened to the hostname" msgstr "" -"Si la capçalera \"Referer\" hauria d'haver estat escurçada al nom del host" +"Si la capçalera «Referer» ha de ser escurçada al nom de l'ordinador central" #: ../midori/midori-preferences.c:578 msgid "Delete pages from history after:" -msgstr "Esborra les pàgines de l'historia després de:" +msgstr "Suprimeix les pàgines de l'historial després de:" #: ../midori/midori-preferences.c:580 ../midori/midori-preferences.c:583 msgid "The maximum number of days to save the history for" @@ -1820,7 +1827,7 @@ msgstr "Gestiona els ginys de cerca" #: ../midori/midori-searchaction.c:1506 msgid "Use as _default" -msgstr "Empra'l per _defecte" +msgstr "Empra'l com a pre_determinat" #: ../midori/midori-searchaction.c:1617 #, c-format @@ -1830,7 +1837,7 @@ msgstr "No s'han pogut carregar els motors de cerca. %s\n" #: ../midori/midori-searchaction.c:1672 #, c-format msgid "The search engines couldn't be saved. %s" -msgstr "No es pot desar les enginys de cerca. %s" +msgstr "No s'han pogut desar les enginys de cerca. %s" #: ../midori/midori-historycompletion.vala:17 msgid "Bookmarks and History" @@ -1850,7 +1857,7 @@ msgstr "" #: ../midori/midori-historycompletion.vala:83 #, c-format msgid "Search for %s" -msgstr "Cercar %s" +msgstr "Cerca %s" #: ../midori/midori-searchcompletion.vala:20 #: ../midori/midori-searchcompletion.vala:57 @@ -1878,7 +1885,7 @@ msgstr "No s'ha pogut executar el programa extern." #: ../midori/sokoke.c:552 msgid "Invalid URI" -msgstr "" +msgstr "L'URI no és vàlid" #. i18n: A panel at the bottom, to search text in pages #: ../toolbars/midori-findbar.c:233 @@ -1904,47 +1911,47 @@ msgstr "Tanca la barra de cerques" #: ../panels/midori-bookmarks.c:312 #, c-format msgid "Failed to add bookmark item: %s\n" -msgstr "No s'ha pogut afegir un ítem a les adreces d'interès: %s\n" +msgstr "No s'ha pogut afegir l'element a les adreces d'interès: %s\n" #. i18n: [n] bookmark(s) #: ../panels/midori-bookmarks.c:496 #, c-format msgid "%d bookmark" msgid_plural "%d bookmarks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d adreça d'interès" +msgstr[1] "%d adreces d'interès" #. i18n: [n] subfolder(s) #: ../panels/midori-bookmarks.c:506 #, c-format msgid "%d subfolder" msgid_plural "%d subfolders" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d subcarpeta" +msgstr[1] "%d subcarpetes" #. i18n: Empty folder #: ../panels/midori-bookmarks.c:534 #, c-format msgid "Empty folder" -msgstr "" +msgstr "Carpeta buida" #. i18n: Folder containing [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:537 #, c-format msgid "Folder containing %s and no bookmark" -msgstr "" +msgstr "La carpeta conté %s i cap adreça d'interès" #. i18n: Folder containing [[n] bookmark(s)] #: ../panels/midori-bookmarks.c:541 #, c-format msgid "Folder containing %s" -msgstr "" +msgstr "La carpeta conté %s" #. i18n: Folder containing [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:544 #, c-format msgid "Folder containing %s and %s" -msgstr "" +msgstr "La carpeta conté %s i %s" #. i18n: Bookmark leading to: [bookmark uri] #: ../panels/midori-bookmarks.c:555 @@ -1962,7 +1969,7 @@ msgstr "" #: ../panels/midori-bookmarks.c:575 #, c-format msgid "%s and %s" -msgstr "" +msgstr "%s i %s" #: ../panels/midori-bookmarks.c:627 #, c-format @@ -1996,7 +2003,7 @@ msgstr "Historial" #: ../panels/midori-history.c:133 msgid "Today" -msgstr "Avuí" +msgstr "Avui" #: ../panels/midori-history.c:135 msgid "Yesterday" @@ -2016,11 +2023,11 @@ msgstr "Setmana passada" #: ../panels/midori-history.c:185 #, c-format msgid "Failed to remove history item: %s\n" -msgstr "No s'ha pogut eliminar un element de l'historial: %s\n" +msgstr "No s'ha pogut suprimir un element de l'historial: %s\n" #: ../panels/midori-history.c:312 msgid "Are you sure you want to remove all history items?" -msgstr "Voleu esborrar tots els elements de l’historial?" +msgstr "Esteu segur que voleu suprimir tots els elements de l’historial?" #: ../panels/midori-history.c:358 msgid "Bookmark the selected history item" @@ -2028,7 +2035,7 @@ msgstr "Afegeix l'element seleccionat de l'historial a les adreces d'interès" #: ../panels/midori-history.c:367 msgid "Delete the selected history item" -msgstr "Esborra l'element de l'historial seleccionat" +msgstr "Suprimeix l'element de l'historial seleccionat" #: ../panels/midori-history.c:375 msgid "Clear the entire history" @@ -2049,7 +2056,7 @@ msgid "" "to open this location:" msgstr "" "És necessari un nom d'usuari i una contrasenya\n" -"per a obrir aquesta ubicació:" +"per obrir aquesta ubicació:" #: ../katze/katze-http-auth.c:240 msgid "Username" @@ -2066,12 +2073,12 @@ msgstr "_Recorda la contrasenya" #: ../katze/katze-throbber.c:889 #, c-format msgid "Named icon '%s' couldn't be loaded" -msgstr "La icona amb nom «%s» no s'ha pogut carregar" +msgstr "No s'ha pogut carregar la icona amb nom «%s»" #: ../katze/katze-throbber.c:902 #, c-format msgid "Stock icon '%s' couldn't be loaded" -msgstr "La icona «%s» no s'ha pogut carregar" +msgstr "No s'ha pogut carregar la icona «%s»" #: ../katze/katze-utils.c:385 msgid "None" @@ -2085,11 +2092,11 @@ msgstr "La propietat «%s» no és vàlida per a %s" #: ../katze/katze-utils.c:565 ../katze/katze-utils.c:594 #: ../extensions/addons.c:308 msgid "Choose file" -msgstr "Seleccioneu fitxer" +msgstr "Seleccioneu un fitxer" #: ../katze/katze-utils.c:580 msgid "Choose folder" -msgstr "Seleccioneu carpeta" +msgstr "Seleccioneu una carpeta" #: ../katze/katze-utils.c:744 msgid "1 hour" @@ -2136,8 +2143,8 @@ msgid "" "Type the address of a preconfigured filter list in the text entry and click " "\"Add\" to add it to the list. You can find more lists at %s." msgstr "" -"Escriu l'adreça d'una llista de filtres preconfigurada a l'entrada de text i " -"premeu \"Afegir\" per a afegir-ho a la llista. Podeu trobar més llistes a %s." +"Escriviu l'adreça d'una llista de filtres preconfigurada a l'entrada de text " +"i premeu «Afegeix» per afegir-lo a la llista. Podeu trobar més llistes a %s." #: ../extensions/adblock.c:917 msgid "Edit rule" @@ -2171,7 +2178,7 @@ msgstr "Sembla que aquesta pàgina té un script d'usuari. El voleu instaŀlar?" #: ../extensions/addons.c:223 msgid "_Install user script" -msgstr "_Instalŀa l'script d'usuari" +msgstr "Instal·la l'script d'usuari" #. i18n: An infobar shows up when viewing a style on userstyles.org #: ../extensions/addons.c:228 @@ -2197,7 +2204,7 @@ msgstr "Estils d'usuari" #: ../extensions/addons.c:370 ../extensions/addons.c:449 #: ../extensions/feed-panel/main.c:114 msgid "Error" -msgstr "Error" +msgstr "S'ha produït un error" #: ../extensions/addons.c:411 #, c-format @@ -2215,7 +2222,7 @@ msgstr "Suprimeix l'estil d'usuari" #: ../extensions/addons.c:421 #, c-format msgid "The file <b>%s</b> will be permanently deleted." -msgstr "El fitxer «<b>%s</b>» s'esborrarà de forma permanent." +msgstr "El fitxer «<b>%s</b>» se suprimirà permanentment." #: ../extensions/addons.c:563 ../extensions/addons.c:639 msgid "Open in Text Editor" @@ -2227,15 +2234,15 @@ msgstr "Obre la carpeta destí" #: ../extensions/addons.c:630 msgid "Add new addon" -msgstr "Afegeix un nou afegitó" +msgstr "Afegeix un complement nou" #: ../extensions/addons.c:656 msgid "Remove selected addon" -msgstr "Suprimeix l'afegitó seleccionat" +msgstr "Suprimeix el complement seleccionat" #: ../extensions/addons.c:1681 ../extensions/addons.c:1897 msgid "User addons" -msgstr "Afegitons de l'usuari" +msgstr "Complements de l'usuari" #: ../extensions/addons.c:1811 #, c-format @@ -2268,8 +2275,8 @@ msgid "" "Deletes all shown cookies. If a filter is set, only those cookies are " "deleted which match the filter." msgstr "" -"Esborra totes les galetes mostrades. Si hi ha un filtre establert, només " -"aquelles galetes que coincideixin amb el filtre s'esborraran." +"Suprimeix totes les galetes mostrades. Si hi ha un filtre establert, només " +"aquelles galetes que coincideixin amb el filtre se suprimiran." #: ../extensions/cookie-manager/cookie-manager-page.c:116 msgid "Expand All" @@ -2281,7 +2288,7 @@ msgstr "Colapsa-ho tot" #: ../extensions/cookie-manager/cookie-manager-page.c:571 msgid "Do you really want to delete all cookies?" -msgstr "Voleu eliminar totes les galetes?" +msgstr "Esteu segur que voleu suprimir totes les galetes?" #: ../extensions/cookie-manager/cookie-manager-page.c:573 msgid "Question" @@ -2289,11 +2296,11 @@ msgstr "Qüestió" #: ../extensions/cookie-manager/cookie-manager-page.c:584 msgid "Only cookies which match the filter will be deleted." -msgstr "Només s'esborraran les galetes que coincideixin amb el filtre." +msgstr "Només se suprimiran les galetes que coincideixin amb el filtre." #: ../extensions/cookie-manager/cookie-manager-page.c:668 msgid "At the end of the session" -msgstr "Al finalitzar la sessió" +msgstr "En finalitzar la sessió" #: ../extensions/cookie-manager/cookie-manager-page.c:671 #, c-format @@ -2349,7 +2356,7 @@ msgstr "Cerca galetes per nom o domini" #: ../extensions/cookie-manager/main.c:36 msgid "List, view and delete cookies" -msgstr "Llista, mostra i borra galetes" +msgstr "Llista, mostra i suprimeix galetes" #: ../extensions/copy-tabs.c:39 msgid "Copy Tab _Addresses" @@ -2370,11 +2377,12 @@ msgstr "" #: ../extensions/delayed-load.vala:49 msgid "Delay in seconds until loading the page:" -msgstr "" +msgstr "Retard en segons fins que es carregui la pàgina:" #: ../extensions/delayed-load.vala:213 msgid "Delay page load until you actually use the tab." msgstr "" +"Retarda la càrrega de la pàgina fins que realment utilitzeu la pestanya." #: ../extensions/external-download-manager.vala:124 msgid "" @@ -2400,12 +2408,12 @@ msgstr "" #: ../extensions/external-download-manager.vala:249 msgid "Command:" -msgstr "" +msgstr "Ordre:" #: ../extensions/external-download-manager.vala:304 #, c-format msgid "Download files with \"%s\" or a custom command" -msgstr "" +msgstr "Baixa els fitxers amb «%s» o una ordre personalitzada" #: ../extensions/external-download-manager.vala:320 msgid "External Download Manager - CommandLine" @@ -2413,11 +2421,11 @@ msgstr "" #: ../extensions/feed-panel/feed-atom.c:208 msgid "Failed to find required Atom \"entry\" elements in XML data." -msgstr "No s'han pogut trobar elements Atom \"entry\" en les dades XML." +msgstr "No s'han pogut trobar elements Atom «entry» en les dades XML." #: ../extensions/feed-panel/feed-atom.c:314 msgid "Failed to find required Atom \"feed\" elements in XML data." -msgstr "No s'han pogut trobar elements Atom \"feed\" en les dades XML." +msgstr "No s'han pogut trobar elements Atom «feed» en les dades XML." #. i18n: The local date a feed was last updated #: ../extensions/feed-panel/feed-panel.c:367 @@ -2432,11 +2440,11 @@ msgstr "Canals" #: ../extensions/feed-panel/feed-panel.c:672 msgid "Add new feed" -msgstr "Afegeix un nou canal" +msgstr "Afegeix un canal web nou" #: ../extensions/feed-panel/feed-panel.c:679 msgid "Delete feed" -msgstr "Suprimeix el canal" +msgstr "Suprimeix el canal web" #: ../extensions/feed-panel/feed-panel.c:758 msgid "_Feeds" @@ -2445,7 +2453,8 @@ msgstr "_Canals" #: ../extensions/feed-panel/feed-parse.c:195 #, c-format msgid "Failed to find root element in feed XML data." -msgstr "No s'ha pogut trobar l'element arrel en les dades XML." +msgstr "" +"No s'ha pogut trobar l'element arrel en les dades XML dels canals web." #: ../extensions/feed-panel/feed-parse.c:237 #, c-format @@ -2455,11 +2464,11 @@ msgstr "Format de canal no compatible." #: ../extensions/feed-panel/feed-parse.c:267 #, c-format msgid "Failed to parse XML feed: %s" -msgstr "No s'ha pogut analitzar el canal XML: %s" +msgstr "No s'ha pogut analitzar el canal web XML: %s" #: ../extensions/feed-panel/feed-rss.c:50 msgid "Failed to find \"channel\" element in RSS XML data." -msgstr "No s'ha pogut trobar l'element \"channel\" en les dades RSS XML." +msgstr "No s'ha pogut trobar l'element «channel» en les dades RSS XML." #: ../extensions/feed-panel/feed-rss.c:55 msgid "Unsupported RSS version found." @@ -2467,11 +2476,11 @@ msgstr "Versió RSS no compatible." #: ../extensions/feed-panel/feed-rss.c:152 msgid "Failed to find required RSS \"item\" elements in XML data." -msgstr "No s'ha pogut trobar els elements RSS \"item\" en les dades XML." +msgstr "No s'han pogut trobar els elements RSS «item» en les dades XML." #: ../extensions/feed-panel/feed-rss.c:252 msgid "Failed to find required RSS \"channel\" elements in XML data." -msgstr "No s'ha pogut trobar els elements RSS \"channel\" en les dades XML." +msgstr "No s'han pogut trobar els elements RSS «channel» en les dades XML." #: ../extensions/feed-panel/main.c:116 #, c-format @@ -2481,7 +2490,7 @@ msgstr "El canal «%s» ja existeix." #: ../extensions/feed-panel/main.c:192 #, c-format msgid "Error loading feed '%s'" -msgstr "Error en carregar el canal «%s»" +msgstr "S'ha produït un error en carregar el canal «%s»" #: ../extensions/feed-panel/main.c:499 msgid "Feed Panel" @@ -2542,7 +2551,7 @@ msgstr "No s'ha pogut obrir la base de dades: %s\n" #: ../extensions/formhistory/formhistory.c:524 #, c-format msgid "Failed to execute database statement: %s\n" -msgstr "No s'ha pogut executar la comanda a la base de dades: %s\n" +msgstr "No s'ha pogut executar l'ordre a la base de dades: %s\n" #: ../extensions/formhistory/formhistory.c:611 msgid "Only activate form history via hotkey (Ctrl+Shift+F) per tab" @@ -2559,7 +2568,7 @@ msgstr "Emmagatzema l'historial de les dades introduïdes als formularis" #: ../extensions/formhistory/formhistory-gdom-frontend.c:222 #, c-format msgid "Failed to select suggestions\n" -msgstr "No s'ha pogut seleccionar suggeriments\n" +msgstr "No s'han pogut seleccionar els suggeriments\n" #: ../extensions/history-list.vala:252 msgid "There are no unvisited tabs" @@ -2592,19 +2601,19 @@ msgstr "Flaix a la finestra per les pestanyes inactives" #: ../extensions/history-list.vala:499 msgid "Next new Tab (History List)" -msgstr "Nova pestanya següent (Llista de l'historial)" +msgstr "Pestanya nova següent (llista de l'historial)" #: ../extensions/history-list.vala:500 msgid "Next new tab from history" -msgstr "Nova pestanya següent de l'historial" +msgstr "Pestanya nova següent de l'historial" #: ../extensions/history-list.vala:509 msgid "Previous new Tab (History List)" -msgstr "Nova pestanya anterior (Llista de l'historial)" +msgstr "Pestanya nova anterior (Llista de l'historial)" #: ../extensions/history-list.vala:510 msgid "Previous new tab from history" -msgstr "Nova pestanya anterior de l'historial" +msgstr "Pestanya nova anterior de l'historial" #: ../extensions/history-list.vala:519 msgid "Display tab in background (History List)" @@ -2621,7 +2630,7 @@ msgstr "Llista de l'historial" #: ../extensions/history-list.vala:650 msgid "Move to the last used tab when switching or closing tabs" msgstr "" -"Mou a la ultima pestanya utilitzada quan es canvien o tanquen pestanyes" +"Mou a la darrera pestanya utilitzada quan es canvien o tanquen pestanyes" #: ../extensions/mouse-gestures.c:513 msgid "Mouse Gestures" @@ -2629,11 +2638,11 @@ msgstr "Gesticulacions de ratolí" #: ../extensions/mouse-gestures.c:514 msgid "Control Midori by moving the mouse" -msgstr "Controla Midori usant el ratolí" +msgstr "Controleu el Midori emprant el ratolí" #: ../extensions/shortcuts.c:109 msgid "Reload page or stop loading" -msgstr "Carrega la pàgina de nou o atura la càrrega" +msgstr "Recarrega la pàgina o atura la càrrega" #: ../extensions/shortcuts.c:168 msgid "Customize Keyboard shortcuts" @@ -2657,7 +2666,7 @@ msgstr "Rellotge a la barra d'estat" #: ../extensions/status-clock.c:169 msgid "Display date and time in the statusbar" -msgstr "Mostrar la data i l'hora a la barra d'estat" +msgstr "Mostra la data i l'hora a la barra d'estat" #: ../extensions/statusbar-features.c:152 msgid "Images" @@ -2669,11 +2678,11 @@ msgstr "Scripts" #: ../extensions/statusbar-features.c:174 msgid "Netscape plugins" -msgstr "Connectors de Netscape" +msgstr "Connectors del Netscape" #: ../extensions/statusbar-features.c:177 msgid "Enable Netscape plugins" -msgstr "Habilita els connectors de netscape" +msgstr "Activa els connectors del Netscape" #: ../extensions/statusbar-features.c:259 msgid "Statusbar Features" @@ -2681,7 +2690,7 @@ msgstr "Característiques de la la barra d'estat" #: ../extensions/statusbar-features.c:260 msgid "Easily toggle features on web pages on and off" -msgstr "Activa o desactiva fàcilment funcionalitats en planes web" +msgstr "Activa o desactiva fàcilment funcionalitats en les pàgines web" #: ../extensions/tab-panel.c:588 ../extensions/tab-panel.c:677 msgid "Tab Panel" @@ -2697,22 +2706,22 @@ msgstr "Mostra les pestanyes en un quadre vertical" #: ../extensions/tabs-minimized.c:76 msgid "Only Icons on Tabs by default" -msgstr "Per defecte només icones a les pestanyes" +msgstr "Utilitza només icones a les com a predeterminat" #: ../extensions/tabs-minimized.c:77 msgid "New tabs have no label by default" -msgstr "Les noves pestanyes no tenen etiqueta per defecte" +msgstr "Les pestanyes noves no tenen cap etiqueta predeterminada" #: ../extensions/toolbar-editor.c:401 msgid "Customize Toolbar" -msgstr "_Personalitza la barra d'eines" +msgstr "Personalitza la barra d'eines" #: ../extensions/toolbar-editor.c:417 msgid "" "Select items to be displayed on the toolbar. Items can be reordered by drag " "and drop." msgstr "" -"Selecciona els elements mostrats a la barra d'eines. Els elements poden ser " +"Seleccioneu els elements mostrats a la barra d'eines. Els elements poden ser " "ordenats arrossegant-los." #: ../extensions/toolbar-editor.c:433 @@ -2733,7 +2742,7 @@ msgstr "Editor de la barra d'eines" #: ../extensions/toolbar-editor.c:641 msgid "Easily edit the toolbar layout" -msgstr "Edita fàcilment la distribució de la barra d'eines" +msgstr "Edita la disposició de la barra d'eines" #: ../katze/katze-http-cookies-sqlite.c:129 #, c-format @@ -2756,16 +2765,16 @@ msgstr "Neteja les següents dades" #: ../midori/midori-privatedata.c:169 msgid "Last open _tabs" -msgstr "Mostra les darreres _pestanyes obertes" +msgstr "Mostra les darreres pes_tanyes obertes" #: ../midori/midori-privatedata.c:195 msgid "Clear private data when _quitting Midori" -msgstr "Neteja les dades provades al _sortir de Midori" +msgstr "Neteja les dades provades al _sortir del Midori" #. i18n: Logins and passwords in websites and web forms #: ../midori/midori-privatedata.c:318 msgid "Saved logins and _passwords" -msgstr "Noms d'usuari i contra_senyes guardats" +msgstr "Noms d'usuari i _contrasenyes desats" #: ../midori/midori-privatedata.c:320 msgid "Cookies and Website data" @@ -2773,11 +2782,11 @@ msgstr "Galetes i informació de llocs web" #: ../midori/midori-privatedata.c:325 msgid "Website icons" -msgstr "Icones de llocs webs" +msgstr "Icones dels llocs web" #: ../midori/midori-viewcompletion.vala:18 msgid "Open tabs" -msgstr "" +msgstr "Obre pestanyes" #: ../midori/midori-viewcompletion.vala:80 msgid "More open tabs…" @@ -2792,7 +2801,7 @@ msgstr "No s'ha pogut buidar l'historial: %s\n" #: ../midori/midori-history.c:122 #, c-format msgid "Failed to remove old history items: %s\n" -msgstr "No s'han pogut eliminar els elements antics de l'historial: %s\n" +msgstr "No s'han pogut suprimir els elements antics de l'historial: %s\n" #: ../midori/midori-bookmarks.c:60 #, c-format @@ -2861,7 +2870,7 @@ msgstr "No s'ha pogut desar la sessió. %s" #: ../midori/midori-frontend.c:126 #, c-format msgid "The trash couldn't be saved. %s" -msgstr "No s'han pogut desar les escombraries. %s" +msgstr "No s'han pogut desar les pestanyes tancades recentment. %s" #: ../midori/midori-frontend.c:334 #, c-format @@ -2871,19 +2880,19 @@ msgstr "" #: ../midori/midori-frontend.c:343 msgid "Modify _preferences" -msgstr "Modificació de les _preferències" +msgstr "Modifica les _preferències" #: ../midori/midori-frontend.c:347 msgid "Disable all _extensions" -msgstr "Inhabilita totes les _extensions" +msgstr "Desactiva totes les _extensions" #: ../midori/midori-frontend.c:356 msgid "Show a dialog after Midori crashed" -msgstr "Mostra un diàleg quan Midori falli" +msgstr "Mostra un diàleg quan el Midori falli" #: ../midori/midori-frontend.c:361 msgid "Discard old tabs" -msgstr "Descarta pestanyes velles" +msgstr "Descarta les pestanyes velles" #: ../midori/midori-frontend.c:369 msgid "Show last crash _log" @@ -2895,17 +2904,18 @@ msgstr "" #: ../midori/midori-frontend.c:460 msgid "An instance of Midori is already running but not responding.\n" -msgstr "Ja s'està executant una altra instància de Midori, però no respon.\n" +msgstr "" +"Ja s'està executant una altra instància del Midori, però no respon.\n" #: ../midori/midori-frontend.c:493 #, c-format msgid "Bookmarks couldn't be loaded: %s\n" -msgstr "No s'ha pogut carregar les adreces d'interès: %s\n" +msgstr "No s'han pogut carregar les adreces d'interès: %s\n" #: ../midori/midori-frontend.c:524 #, c-format msgid "The trash couldn't be loaded: %s\n" -msgstr "No s'han pogut carregar les escombraries: %s\n" +msgstr "No s'han pogut carregar les pestanyes tancades recentment. %s\n" #: ../midori/midori-frontend.c:532 #, c-format @@ -2933,7 +2943,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:707 #: ../extensions/cookie-permissions/cookie-permission-manager.c:1112 msgid "Accept" -msgstr "" +msgstr "Accepta" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:250 #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:709 @@ -2945,7 +2955,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:711 #: ../extensions/cookie-permissions/cookie-permission-manager.c:1114 msgid "Block" -msgstr "" +msgstr "Bloqueja" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:300 #: ../extensions/cookie-permissions/cookie-permission-manager.c:151 @@ -3000,15 +3010,15 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:740 #: ../extensions/cookie-permissions/cookie-permission-manager.c:552 msgid "Domain" -msgstr "" +msgstr "Domini" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:748 msgid "Policy" -msgstr "" +msgstr "Polítiques" #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:777 msgid "Delete _all" -msgstr "" +msgstr "Suprimeix-ho _tot" #. Add "ask-for-unknown-policy" checkbox #: ../extensions/cookie-permissions/cookie-permission-manager-preferences-window.c:786 @@ -3027,7 +3037,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:100 msgid "Reason" -msgstr "" +msgstr "Motiu" #: ../extensions/cookie-permissions/cookie-permission-manager.c:140 #, c-format @@ -3072,7 +3082,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:527 msgid "_Accept" -msgstr "" +msgstr "_Accepta" #: ../extensions/cookie-permissions/cookie-permission-manager.c:528 msgid "Accept for this _session" @@ -3088,11 +3098,11 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:559 msgid "Path" -msgstr "" +msgstr "Ruta" #: ../extensions/cookie-permissions/cookie-permission-manager.c:573 msgid "Value" -msgstr "" +msgstr "Valor" #: ../extensions/cookie-permissions/cookie-permission-manager.c:584 msgid "Expire date" @@ -3142,7 +3152,7 @@ msgstr "" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1111 msgid "Undetermined" -msgstr "" +msgstr "Sense determinar" #: ../extensions/cookie-permissions/main.c:62 msgid "Cookie Security Manager" @@ -3190,7 +3200,7 @@ msgstr "" #: ../extensions/apps.vala:144 #, c-format msgid "Midori (%s)" -msgstr "" +msgstr "Midori (%s)" #: ../extensions/apps.vala:149 msgid "New _App" @@ -3235,7 +3245,7 @@ msgstr "Copia la _localització de l'enllaç" #: ../extensions/transfers.vala:431 #, c-format msgid "The file '<b>%s</b>' has been downloaded." -msgstr "S'ha descarregat el fitxer «<b>%s</b>»." +msgstr "S'ha baixat el fitxer «<b>%s</b>»." #: ../extensions/transfers.vala:433 #, c-format @@ -3248,15 +3258,15 @@ msgstr "Transferència finalitzada" #: ../extensions/transfers.vala:484 ../extensions/transfers.vala:485 msgid "Some files are being downloaded" -msgstr "S'estan descarregant fitxers" +msgstr "S'estan baixant fitxers" #: ../extensions/transfers.vala:487 msgid "_Quit Midori" -msgstr "_Sortir de Midori" +msgstr "_Surt del Midori" #: ../extensions/transfers.vala:489 msgid "The transfers will be cancelled if Midori quits." -msgstr "Les transferències es cancel·laran si se surt de Midori." +msgstr "Les transferències es cancel·laran si surtiu del Midori." #: ../extensions/transfers.vala:538 msgid "Transfer Manager" @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "X-Poedit-Country: CZECH REPUBLIC\n" "Language: \n" "X-Poedit-Language: Czech\n" @@ -16,8 +16,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? " "2 : 3;\n" -"X-Launchpad-Export-Date: 2013-09-06 04:49+0000\n" -"X-Generator: Launchpad (build 16760)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-30 04:37+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "X-Poedit-Country: Denmark\n" "Language: da\n" "X-Poedit-Language: Danish\n" @@ -9,15 +9,15 @@ msgstr "" "Project-Id-Version: midori 0.3.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-24 19:12+0000\n" -"Last-Translator: Alexander Wilms <Unknown>\n" +"PO-Revision-Date: 2014-01-22 10:26+0000\n" +"Last-Translator: WebKit Team <Unknown>\n" "Language-Team: German <de@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-25 04:36+0000\n" -"X-Generator: Launchpad (build 16738)\n" +"X-Launchpad-Export-Date: 2014-01-23 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: de\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -31,7 +31,7 @@ msgstr "Web-Browser" #: ../data/midori.desktop.in.h:3 msgid "Midori Web Browser" -msgstr "Midori Web-Browser" +msgstr "Midori Webbrowser" #: ../data/midori.desktop.in.h:4 msgid "Browse the Web" @@ -542,11 +542,13 @@ msgstr "" " Eduard Gotwig https://launchpad.net/~gotwig\n" " Ghenrik https://launchpad.net/~ghenrik-deactivatedaccount\n" " Mathias Dietrich https://launchpad.net/~theghost\n" +" Moritz Gehlhaar https://launchpad.net/~geoextra\n" " Phillip Sz https://launchpad.net/~phillip-sz\n" " Pierre Bender https://launchpad.net/~pierre-bender\n" " Sebastian Schlatow https://launchpad.net/~buzz-dee\n" " Simeon https://launchpad.net/~simeon5\n" " Thomas Pitlik https://launchpad.net/~thomaspitlik\n" +" Tobias Bannert https://launchpad.net/~toba\n" " WebKit Team https://launchpad.net/~webkit-team\n" " grrrk https://launchpad.net/~grrrk" @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-26 04:38+0000\n" -"X-Generator: Launchpad (build 16738)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "X-Poedit-Country: GREECE\n" "Language: el\n" "X-Poedit-Language: Greek\n" diff --git a/po/en_AU.po b/po/en_AU.po index 904190f7..c1a8b739 100644 --- a/po/en_AU.po +++ b/po/en_AU.po @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-16 04:47+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 diff --git a/po/en_CA.po b/po/en_CA.po index 54c3ed69..9a54d950 100644 --- a/po/en_CA.po +++ b/po/en_CA.po @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-24 04:37+0000\n" -"X-Generator: Launchpad (build 16738)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 diff --git a/po/en_GB.po b/po/en_GB.po index 92ffa082..1a52eafd 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-12 04:36+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: \n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: eo\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -13,15 +13,15 @@ msgstr "" "Project-Id-Version: midori 0.1.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-15 08:02+0000\n" -"Last-Translator: jesusiniesta <jesus.iniesta.03@gmail.com>\n" +"PO-Revision-Date: 2013-12-11 12:57+0000\n" +"Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Spanish <xfce-i18n@xfce.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-16 04:47+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: es\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -114,7 +114,7 @@ msgstr "Ejecutar con gdb y guardar una traza inversa cuando ocurra un fallo" #: ../midori/main.c:95 msgid "Run the specified filename as javascript" -msgstr "Ejecutar el nombre de archivo especificado como JavaScript" +msgstr "Ejecutar el archivo especificado como JavaScript" #: ../midori/main.c:97 msgid "Take a snapshot of the specified URI" @@ -540,16 +540,18 @@ msgstr "" "Abel Martín <abel.martin.ruiz@gmail.com>\n" "\n" "Launchpad Contributions:\n" -" Adolfo Jayme Barrientos https://launchpad.net/~fitoschido\n" +" Adolfo Jayme https://launchpad.net/~fitoschido\n" " Alfredo Hernández https://launchpad.net/~aldomann\n" " Andres Sanchez https://launchpad.net/~afsanchez93-deactivatedaccount\n" " Carkis https://launchpad.net/~carlosdark\n" " Chipong Luo https://launchpad.net/~chipong-l\n" " Christopher https://launchpad.net/~cdhornb\n" +" Derek Basaletti https://launchpad.net/~derek-basaletti\n" " Diego Prieto https://launchpad.net/~bboyastalamuerte\n" " Ezequiel Sapo https://launchpad.net/~ezesapo\n" " Ivan Diaz https://launchpad.net/~saisyukusanagi\n" " Jeferson Mendoza https://launchpad.net/~jefex93\n" +" Jesús David García Madriz https://launchpad.net/~jesusgarciamadriz\n" " Juan David Angarita https://launchpad.net/~jangarita11\n" " Kalprestito@Yahoo.Es https://launchpad.net/~kalprestito\n" " Kern Goldstein https://launchpad.net/~kern-goldstein\n" @@ -558,6 +560,7 @@ msgstr "" " R. Santana https://launchpad.net/~robermad1986\n" " Sergio https://launchpad.net/~oigres200-o\n" " Walter Beckerleg https://launchpad.net/~spayk-99\n" +" WebKit Team https://launchpad.net/~webkit-team\n" " dbinary https://launchpad.net/~luis-luimarin\n" " ghas https://launchpad.net/~agghas\n" " jesusiniesta https://launchpad.net/~jesus-iniesta" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-17 04:35+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: Estonian\n" "X-Poedit-Language: Estonian\n" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-08-21 04:38+0000\n" -"X-Generator: Launchpad (build 16731)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-14 04:39+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -21,8 +21,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Launchpad-Export-Date: 2013-08-29 04:39+0000\n" -"X-Generator: Launchpad (build 16738)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: fr\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: midori 0.3.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-05-20 13:24+0000\n" +"PO-Revision-Date: 2013-09-30 07:48+0000\n" "Last-Translator: Christian Dywan <christian@twotoasts.de>\n" "Language-Team: German <de@li.org>\n" "MIME-Version: 1.0\n" @@ -17,8 +17,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " "(n > 2 && n < 20) ? 2 : 3;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: de\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -533,7 +533,7 @@ msgstr "" "\n" "Launchpad Contributions:\n" " Christian Dywan https://launchpad.net/~kalikiana\n" -" alasdair caimbeul https://launchpad.net/~alexd" +" alasdair caimbeul https://launchpad.net/~alexd-deactivatedaccount" #: ../midori/midori-browser.c:5243 msgid "_File" @@ -18,8 +18,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-10 04:42+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: gl\n" "X-Poedit-Language: Galician\n" @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: he\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: Midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-02 11:58+0000\n" +"PO-Revision-Date: 2013-10-30 09:57+0000\n" "Last-Translator: zvacet <ikoli@yahoo.com>\n" "Language-Team: Croatian <>\n" "MIME-Version: 1.0\n" @@ -17,8 +17,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: hr\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -60,7 +60,7 @@ msgstr "Midori privatno pretraživanje" #: ../data/midori-private.desktop.in.h:2 ../midori/midori-view.c:4106 msgid "Private Browsing" -msgstr "(Privatno pretraživanje)" +msgstr "Privatno pretraživanje" #: ../data/midori-private.desktop.in.h:3 msgid "Open a new private browsing window" @@ -113,7 +113,7 @@ msgstr "Pokreni naznačeno ime datoteke kao javascript" #: ../midori/main.c:97 msgid "Take a snapshot of the specified URI" -msgstr "" +msgstr "Uzmi snimku navedenog URI" #: ../midori/main.c:99 msgid "Execute the specified command" @@ -288,15 +288,15 @@ msgstr "Zabilješke" #: ../midori/midori-browser.c:949 msgid "New Folder" -msgstr "" +msgstr "Novi Direktorij" #: ../midori/midori-browser.c:949 msgid "Edit Folder" -msgstr "" +msgstr "Uredi Direktorij" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "Nova zabilješka" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" @@ -304,11 +304,11 @@ msgstr "" #: ../midori/midori-browser.c:973 msgid "Type a name for this bookmark, and choose where to keep it." -msgstr "" +msgstr "Ime za ovu zabilješku, i izaberite gdje će te je držati." #: ../midori/midori-browser.c:975 msgid "Type a name for this folder, and choose where to keep it." -msgstr "" +msgstr "Upišite ime za ovu mapu, i odaberite gdje ćete je držati." #: ../midori/midori-browser.c:1030 msgid "Add to _Speed Dial" @@ -316,7 +316,7 @@ msgstr "Dodaj u _brzo biranje" #: ../midori/midori-browser.c:1039 msgid "Show in Bookmarks _Bar" -msgstr "" +msgstr "Pokaži u kartici _zabilješki" #: ../midori/midori-browser.c:1047 msgid "Run as _web application" @@ -518,6 +518,8 @@ msgstr "" "\n" "Launchpad Contributions:\n" " Karlo Horvat https://launchpad.net/~karlo-puselj\n" +" WebKit Team https://launchpad.net/~webkit-team\n" +" freedomrun https://launchpad.net/~freedomrun\n" " gogo https://launchpad.net/~trebelnik-stefina\n" " nuker https://launchpad.net/~molkusinoki\n" " zvacet https://launchpad.net/~ivicakolic" @@ -528,7 +530,7 @@ msgstr "_Datoteka" #: ../midori/midori-browser.c:5246 msgid "Open a new window" -msgstr "Otvori u novom prozoru" +msgstr "" #: ../midori/midori-browser.c:5249 msgid "Open a new tab" @@ -697,19 +699,19 @@ msgstr "Dodaj novu _mapu" #: ../midori/midori-browser.c:5406 msgid "_Import bookmarks…" -msgstr "" +msgstr "_Uvezi zabilješke..." #: ../midori/midori-browser.c:5409 msgid "_Export bookmarks…" -msgstr "" +msgstr "_Izvezi zabilješke..." #: ../midori/midori-browser.c:5412 msgid "_Manage Search Engines…" -msgstr "" +msgstr "_Upravljaj tražilicama..." #: ../midori/midori-browser.c:5415 msgid "_Clear Private Data…" -msgstr "" +msgstr "_Očisti privatne podatke..." #: ../midori/midori-browser.c:5418 msgid "_Inspect Page" @@ -1129,12 +1131,12 @@ msgstr "%s želi znati vašu lokaciju." #: ../midori/midori-view.c:1250 #, c-format msgid "'%s' can't be found" -msgstr "" +msgstr "'%s' ne može biti nađen" #: ../midori/midori-view.c:1251 #, c-format msgid "The page '%s' couldn't be loaded:" -msgstr "" +msgstr "Stranica '%s' se ne može učitati:" #: ../midori/midori-view.c:1255 msgid "Check the address for typos" @@ -1148,7 +1150,7 @@ msgstr "" #: ../midori/midori-view.c:1257 msgid "Verify that your network settings are correct" -msgstr "" +msgstr "Provjerite da su vaše mrežne postavke ispravne" #: ../midori/midori-view.c:1261 msgid "Try Again" @@ -1183,7 +1185,7 @@ msgstr "" #: ../midori/midori-view.c:2472 msgid "Open _Link" -msgstr "" +msgstr "Otvori _poveznicu" #: ../midori/midori-view.c:2478 msgid "Open Link in New _Tab" @@ -1799,7 +1801,7 @@ msgstr "Tražilice ne mogu biti spremljene. %s" #: ../midori/midori-historycompletion.vala:17 msgid "Bookmarks and History" -msgstr "" +msgstr "Zabilješke i povijest" #: ../midori/midori-historycompletion.vala:54 #, c-format @@ -1876,16 +1878,18 @@ msgstr "Neuspjeh u dodavanju stavki zabilješki: %s\n" #, c-format msgid "%d bookmark" msgid_plural "%d bookmarks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d zabilješka" +msgstr[1] "%d zabilješke" +msgstr[2] "%d zabilješki" #. i18n: [n] subfolder(s) #: ../panels/midori-bookmarks.c:506 #, c-format msgid "%d subfolder" msgid_plural "%d subfolders" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d pšodmapa" +msgstr[1] "%d podmape" +msgstr[2] "%d podmapa" #. i18n: Empty folder #: ../panels/midori-bookmarks.c:534 @@ -1897,19 +1901,19 @@ msgstr "" #: ../panels/midori-bookmarks.c:537 #, c-format msgid "Folder containing %s and no bookmark" -msgstr "" +msgstr "Mapa sadrži %s i njednu zabilješku" #. i18n: Folder containing [[n] bookmark(s)] #: ../panels/midori-bookmarks.c:541 #, c-format msgid "Folder containing %s" -msgstr "" +msgstr "Mapa sadrži %s" #. i18n: Folder containing [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:544 #, c-format msgid "Folder containing %s and %s" -msgstr "" +msgstr "Mapa sadrži %s i %s" #. i18n: Bookmark leading to: [bookmark uri] #: ../panels/midori-bookmarks.c:555 @@ -1932,7 +1936,7 @@ msgstr "" #: ../panels/midori-bookmarks.c:627 #, c-format msgid "Failed to update bookmark: %s\n" -msgstr "" +msgstr "Neuspjelo ažuriranje zabilješki: %s\n" #: ../panels/midori-bookmarks.c:686 msgid "Edit the selected bookmark" @@ -2704,7 +2708,7 @@ msgstr "Jednostavno uređivanje izgleda alatnih traka" #: ../katze/katze-http-cookies-sqlite.c:129 #, c-format msgid "Failed to load cookies\n" -msgstr "" +msgstr "Neuspjelo učitavanje kolačića\n" #. FIXME: granite: should return GtkWidget* like GTK+ #. i18n: Dialog: Clear Private Data, in the Tools menu @@ -2747,7 +2751,7 @@ msgstr "Otvori kartice" #: ../midori/midori-viewcompletion.vala:80 msgid "More open tabs…" -msgstr "" +msgstr "Još otvorenih kartica..." #: ../midori/midori-history.c:25 #, c-format @@ -2763,7 +2767,7 @@ msgstr "Neuspjelo uklanjanje starih stavki povijesti: %s\n" #: ../midori/midori-bookmarks.c:60 #, c-format msgid "Failed to remove bookmark item: %s\n" -msgstr "" +msgstr "Neuspjelo uklanjanje stavke zabilješke:%s\n" #: ../midori/midori-bookmarks.c:106 msgid "failed to ATTACH old db" @@ -3125,7 +3129,7 @@ msgstr "" #: ../extensions/apps.vala:84 msgid "Launcher created" -msgstr "" +msgstr "Pokretač je napravljrn" #: ../extensions/apps.vala:85 #, c-format @@ -3135,11 +3139,11 @@ msgstr "" #: ../extensions/apps.vala:88 ../extensions/apps.vala:90 #, c-format msgid "Failed to create new launcher: %s" -msgstr "" +msgstr "Neuspjelo stvaranje novog pokretača:%s" #: ../extensions/apps.vala:89 msgid "Error creating launcher" -msgstr "" +msgstr "Greška pri stvaranju pokretača" #: ../extensions/apps.vala:126 msgid "Applications" @@ -3147,20 +3151,20 @@ msgstr "_Programi" #: ../extensions/apps.vala:134 msgid "New _Profile" -msgstr "" +msgstr "Novi _profil" #: ../extensions/apps.vala:135 msgid "Creates a new, independant profile and a launcher" -msgstr "" +msgstr "Stvara novi, nezavisni profil i pokretač" #: ../extensions/apps.vala:144 #, c-format msgid "Midori (%s)" -msgstr "" +msgstr "Midori (%s)" #: ../extensions/apps.vala:149 msgid "New _App" -msgstr "" +msgstr "Novi _program" #: ../extensions/apps.vala:150 msgid "Creates a new app for a specific site" @@ -3168,7 +3172,7 @@ msgstr "" #: ../extensions/apps.vala:175 msgid "Error launching" -msgstr "" +msgstr "Greška pri pokretanju" #: ../extensions/apps.vala:384 msgid "Create _Launcher" @@ -3206,7 +3210,7 @@ msgstr "Datoteka '<b>%s</b>' je preuzeta." #: ../extensions/transfers.vala:433 #, c-format msgid "'<b>%s</b>' and %d other files have been downloaded." -msgstr "" +msgstr "'<b>%s</b>' i %d ostale datoteke su preuzete." #: ../extensions/transfers.vala:434 msgid "Transfer completed" @@ -9,15 +9,15 @@ msgstr "" "Project-Id-Version: midori master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-02 11:54+0000\n" -"Last-Translator: Christian Dywan <christian@twotoasts.de>\n" +"PO-Revision-Date: 2013-12-29 11:34+0000\n" +"Last-Translator: Úr Balázs <urbalazs@gmail.com>\n" "Language-Team: Magyar <gnome-hu-list at gnome dot org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: \n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -51,7 +51,7 @@ msgstr "Új ablak" #: ../data/midori.desktop.in.h:8 msgid "New Private Browsing Window" -msgstr "Új privát böngészési ablak megnyitása" +msgstr "Új privát böngészési ablak" #: ../data/midori-private.desktop.in.h:1 msgid "Midori Private Browsing" @@ -106,6 +106,7 @@ msgstr "Diagnosztikai ablak megjelenítése" #: ../midori/main.c:93 msgid "Run within gdb and save a backtrace on crash" msgstr "" +"Futtatás a gdb-ben és a visszakövetési információk mentése összeomláskor" #: ../midori/main.c:95 msgid "Run the specified filename as javascript" @@ -243,7 +244,7 @@ msgstr "Ugrás a következő aloldalra" #: ../midori/midori-browser.c:345 msgid "Web Search…" -msgstr "" +msgstr "Keresés a weben…" #: ../midori/midori-browser.c:449 ../midori/midori-browser.c:5326 #: ../midori/midori-browser.c:5335 @@ -288,27 +289,28 @@ msgstr "Könyvjelzők" #: ../midori/midori-browser.c:949 msgid "New Folder" -msgstr "" +msgstr "Új mappa" #: ../midori/midori-browser.c:949 msgid "Edit Folder" -msgstr "" +msgstr "Mappa szerkesztése" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "Új könyvjelző" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" -msgstr "" +msgstr "Könyvjelző szerkesztése" #: ../midori/midori-browser.c:973 msgid "Type a name for this bookmark, and choose where to keep it." msgstr "" +"Adjon nevet a könyvjelzőnek, és válassza ki, hogy hol szeretné tárolni." #: ../midori/midori-browser.c:975 msgid "Type a name for this folder, and choose where to keep it." -msgstr "" +msgstr "Adjon nevet a mappának, és válassza ki, hogy hol szeretné tárolni." #: ../midori/midori-browser.c:1030 msgid "Add to _Speed Dial" @@ -316,7 +318,7 @@ msgstr "Felvétel a _gyorstárcsázásba" #: ../midori/midori-browser.c:1039 msgid "Show in Bookmarks _Bar" -msgstr "" +msgstr "Megjelenítés a _könyvjelzősávon" #: ../midori/midori-browser.c:1047 msgid "Run as _web application" @@ -531,12 +533,17 @@ msgstr "" "Kelemen Gábor <kelemeng at gnome dot hu>\n" "\n" "Launchpad Contributions:\n" +" Balazs Varga https://launchpad.net/~thebalu1\n" " Chipong Luo https://launchpad.net/~chipong-l\n" " Christian Dywan https://launchpad.net/~kalikiana\n" " Cody Garver https://launchpad.net/~codygarver\n" " Gabor Kelemen https://launchpad.net/~kelemeng\n" " Gergely Szarka https://launchpad.net/~gszarka\n" -" Rafael Ferreira https://launchpad.net/~rafael-f-f1" +" Gyönki Bendegúz https://launchpad.net/~gyonkibendeguz\n" +" Laszlo Espadas https://launchpad.net/~kardi-web\n" +" Rafael Ferreira https://launchpad.net/~rafael-f-f1\n" +" moonwatcher https://launchpad.net/~moonwatcher2k1\n" +" Úr Balázs https://launchpad.net/~urbalazs" #: ../midori/midori-browser.c:5243 msgid "_File" @@ -713,19 +720,19 @@ msgstr "Új mappa _hozzáadása" #: ../midori/midori-browser.c:5406 msgid "_Import bookmarks…" -msgstr "" +msgstr "_Könyvjelzők importálása…" #: ../midori/midori-browser.c:5409 msgid "_Export bookmarks…" -msgstr "" +msgstr "_Könyvjelzők exportálása…" #: ../midori/midori-browser.c:5412 msgid "_Manage Search Engines…" -msgstr "" +msgstr "Kereső_motorok kezelése…" #: ../midori/midori-browser.c:5415 msgid "_Clear Private Data…" -msgstr "" +msgstr "_Személyes adatok törlése…" #: ../midori/midori-browser.c:5418 msgid "_Inspect Page" @@ -1150,40 +1157,42 @@ msgstr "%s tudni szeretné az Ön tartózkodási helyét." #: ../midori/midori-view.c:1250 #, c-format msgid "'%s' can't be found" -msgstr "" +msgstr "„%s” nem található" #: ../midori/midori-view.c:1251 #, c-format msgid "The page '%s' couldn't be loaded:" -msgstr "" +msgstr "A(z) „%s” oldal nem tölthető be:" #: ../midori/midori-view.c:1255 msgid "Check the address for typos" -msgstr "" +msgstr "Ellenőrizze, hogy jól írta-e be a címet" #: ../midori/midori-view.c:1256 msgid "" "Make sure that an ethernet cable is plugged in or the wireless card is " "activated" msgstr "" +"Győződjön meg arról, hogy van-e ethernet kábel csatlakoztatva vagy a vezeték " +"nélküli kártya aktiválva van-e" #: ../midori/midori-view.c:1257 msgid "Verify that your network settings are correct" -msgstr "" +msgstr "Ellenőrizze, hogy a hálózati beállítások helyesek-e" #: ../midori/midori-view.c:1261 msgid "Try Again" -msgstr "" +msgstr "Próbálja újra" #: ../midori/midori-view.c:1386 #, c-format msgid "Oops - %s" -msgstr "" +msgstr "Upsz - %s" #: ../midori/midori-view.c:1387 #, c-format msgid "Something went wrong with '%s'." -msgstr "" +msgstr "Valami probléma van a következővel: „%s”." #: ../midori/midori-view.c:1389 msgid "Try again" @@ -1204,7 +1213,7 @@ msgstr "Elem _vizsgálata" #: ../midori/midori-view.c:2472 msgid "Open _Link" -msgstr "" +msgstr "_Hivatkozás megnyitása" #: ../midori/midori-view.c:2478 msgid "Open Link in New _Tab" @@ -1232,7 +1241,7 @@ msgstr "_Mentés másként…" #: ../midori/midori-view.c:2507 msgid "Open _Image in New Window" -msgstr "" +msgstr "_Kép megnyitása új ablakban" #: ../midori/midori-view.c:2508 msgid "Open _Image in New Tab" @@ -1366,7 +1375,7 @@ msgstr "" #: ../midori/midori-view.c:4208 msgid "Page loading delayed:" -msgstr "" +msgstr "Oldalbetöltés késleltetve:" #: ../midori/midori-view.c:4209 msgid "Loading delayed either due to a recent crash or startup preferences." @@ -1615,11 +1624,11 @@ msgstr "A parancsfájlok megnyithatnak-e automatikusan felugró ablakokat" #: ../midori/midori-preferences.c:406 msgid "Default Zoom Level" -msgstr "" +msgstr "Alapértelmezett nagyítási szint" #: ../midori/midori-preferences.c:410 msgid "Initial factor to enlarge newly opened tabs by" -msgstr "" +msgstr "Az újonnan megnyitott lapok kezdeti nagyítási tényezője" #: ../midori/midori-preferences.c:414 msgid "Preferred languages" @@ -1703,7 +1712,7 @@ msgstr "Port" #: ../midori/midori-preferences.c:497 msgid "Supported proxy types:" -msgstr "" +msgstr "Támogatott proxytípusok:" #. TODO: Preserve page icons of search engines and merge privacy items #: ../midori/midori-preferences.c:515 ../midori/midori-privatedata.c:323 @@ -1829,7 +1838,7 @@ msgstr "A keresőmotorok nem menthetők. %s" #: ../midori/midori-historycompletion.vala:17 msgid "Bookmarks and History" -msgstr "" +msgstr "Könyvjelzők és előzmények" #: ../midori/midori-historycompletion.vala:54 #, c-format @@ -1906,63 +1915,63 @@ msgstr "A könyvjelzőelem hozzáadása meghiúsult: %s\n" #, c-format msgid "%d bookmark" msgid_plural "%d bookmarks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d könyvjelző" +msgstr[1] "%d könyvjelző" #. i18n: [n] subfolder(s) #: ../panels/midori-bookmarks.c:506 #, c-format msgid "%d subfolder" msgid_plural "%d subfolders" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d almappa" +msgstr[1] "%d almappa" #. i18n: Empty folder #: ../panels/midori-bookmarks.c:534 #, c-format msgid "Empty folder" -msgstr "" +msgstr "Üres mapa" #. i18n: Folder containing [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:537 #, c-format msgid "Folder containing %s and no bookmark" -msgstr "" +msgstr "A mappa tartalma %s és nincs könyvjelző" #. i18n: Folder containing [[n] bookmark(s)] #: ../panels/midori-bookmarks.c:541 #, c-format msgid "Folder containing %s" -msgstr "" +msgstr "A mappa tartalma %s" #. i18n: Folder containing [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:544 #, c-format msgid "Folder containing %s and %s" -msgstr "" +msgstr "A mappa tartalma %s és %s" #. i18n: Bookmark leading to: [bookmark uri] #: ../panels/midori-bookmarks.c:555 #, c-format msgid "Bookmark leading to: %s" -msgstr "" +msgstr "A könyvjelző erre mutat: %s" #. i18n: [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:569 #, c-format msgid "%s and no bookmark" -msgstr "" +msgstr "%s és nincs könyvjelző" #. i18n: [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:575 #, c-format msgid "%s and %s" -msgstr "" +msgstr "%s és %s" #: ../panels/midori-bookmarks.c:627 #, c-format msgid "Failed to update bookmark: %s\n" -msgstr "" +msgstr "Nem sikerült a könyvjelző frissítése: %s\n" #: ../panels/midori-bookmarks.c:686 msgid "Edit the selected bookmark" @@ -2640,7 +2649,7 @@ msgstr "Gyorsbillentyűk személyre szabása" #: ../extensions/shortcuts.c:275 msgid "Customize Sh_ortcuts…" -msgstr "" +msgstr "_Gyorsbillentyűk személyre szabása…" #: ../extensions/shortcuts.c:312 msgid "Shortcuts" @@ -2796,7 +2805,7 @@ msgstr "A régi előzményelemek eltávolítása meghiúsult: %s\n" #: ../midori/midori-bookmarks.c:60 #, c-format msgid "Failed to remove bookmark item: %s\n" -msgstr "" +msgstr "Nem sikerült a könyvjelző eltávolítása: %s\n" #: ../midori/midori-bookmarks.c:106 msgid "failed to ATTACH old db" @@ -2817,7 +2826,7 @@ msgstr "sikertelen LEVÁLASZTÁS " #: ../midori/midori-bookmarks.c:257 #, c-format msgid "Couldn't setup bookmarks: %s\n" -msgstr "" +msgstr "Nem sikerült beállítani a könyvjelzőket: %s\n" #: ../midori/midori-bookmarks.c:271 #, c-format @@ -2867,6 +2876,8 @@ msgstr "A Kuka nem menthető. %s" msgid "" "Midori crashed the last time it was opened. You can report the problem at %s." msgstr "" +"A Midori összeomlott a legutóbbi megnyitáskor. Itt jelentheti a problémát: " +"%s." #: ../midori/midori-frontend.c:343 msgid "Modify _preferences" @@ -2886,11 +2897,11 @@ msgstr "Régi lapok eldobása" #: ../midori/midori-frontend.c:369 msgid "Show last crash _log" -msgstr "" +msgstr "A legutóbbi összeomlási _napló megjelenítése" #: ../midori/midori-frontend.c:382 msgid "Run in _debugger" -msgstr "" +msgstr "Futtatás a _hibakeresőben" #: ../midori/midori-frontend.c:460 msgid "An instance of Midori is already running but not responding.\n" @@ -3085,7 +3096,7 @@ msgstr "Meg_tagadás" #: ../extensions/cookie-permissions/cookie-permission-manager.c:530 msgid "Deny _this time" -msgstr "" +msgstr "Megtagadás _erre az alkalomra" #: ../extensions/cookie-permissions/cookie-permission-manager.c:559 msgid "Path" @@ -3105,7 +3116,7 @@ msgstr "Kiterjesztés példány" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1008 msgid "The Midori extension instance for this extension" -msgstr "" +msgstr "A Midori kiterjesztés példány ehhez a kiterjesztéshez" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1014 msgid "Application instance" @@ -3113,7 +3124,7 @@ msgstr "Alkalmazás példány" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1015 msgid "The Midori application instance this extension belongs to" -msgstr "" +msgstr "Ehhez a kiterjesztéshez tartozó Midori alkalmazás példány" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1021 msgid "Database instance" @@ -3122,14 +3133,16 @@ msgstr "Adatbázis példány" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1022 msgid "Pointer to sqlite database instance used by this extension" msgstr "" +"Ezen kiterjesztés által használt mutató az sqlite adatbázis példányra" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1027 msgid "Database path" -msgstr "" +msgstr "Adatbázis útvonala" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1028 msgid "Path to sqlite database instance used by this extension" msgstr "" +"Ezen kiterjesztés által használt útvonal az sqlite adatbázis példányhoz" #: ../extensions/cookie-permissions/cookie-permission-manager.c:1034 msgid "Ask for unknown policy" @@ -3156,54 +3169,55 @@ msgstr "Sütijogosultság kezelése oldalanként" #: ../extensions/apps.vala:58 #, c-format msgid "Failed to fetch application icon in %s: %s" -msgstr "" +msgstr "Nem sikerült letölteni az alkalmazásikont itt: %s: %s" #: ../extensions/apps.vala:84 msgid "Launcher created" -msgstr "" +msgstr "Gyorsindító létrehozva" #: ../extensions/apps.vala:85 #, c-format msgid "You can now run <b>%s</b> from your launcher or menu" msgstr "" +"Most már lehetséges <b>%s</b> futtatása a gyorsindítóból vagy a menüből" #: ../extensions/apps.vala:88 ../extensions/apps.vala:90 #, c-format msgid "Failed to create new launcher: %s" -msgstr "" +msgstr "Nem sikerült az új gyorsindító létrehozása: %s" #: ../extensions/apps.vala:89 msgid "Error creating launcher" -msgstr "" +msgstr "Hiba a gyorsindító létrehozásakor" #: ../extensions/apps.vala:126 msgid "Applications" -msgstr "" +msgstr "Alkalmazások" #: ../extensions/apps.vala:134 msgid "New _Profile" -msgstr "" +msgstr "Új _profil" #: ../extensions/apps.vala:135 msgid "Creates a new, independant profile and a launcher" -msgstr "" +msgstr "Új, önálló profilt és egy gyorsindítót hoz létre" #: ../extensions/apps.vala:144 #, c-format msgid "Midori (%s)" -msgstr "" +msgstr "Midori (%s)" #: ../extensions/apps.vala:149 msgid "New _App" -msgstr "" +msgstr "Új _alkalmazás" #: ../extensions/apps.vala:150 msgid "Creates a new app for a specific site" -msgstr "" +msgstr "Egy új alkalmazást hoz létre egy megadott oldalhoz" #: ../extensions/apps.vala:175 msgid "Error launching" -msgstr "" +msgstr "Hiba az indításkor" #: ../extensions/apps.vala:384 msgid "Create _Launcher" @@ -3211,11 +3225,11 @@ msgstr "_Parancsikon létrehozása" #: ../extensions/apps.vala:430 msgid "Web App Manager" -msgstr "" +msgstr "Webalkalmazás kezelő" #: ../extensions/apps.vala:431 msgid "Manage websites installed as applications" -msgstr "" +msgstr "Alkalmazásként telepített weboldalak kezelése" #: ../extensions/transfers.vala:98 msgid "Transfers" @@ -3241,7 +3255,7 @@ msgstr "A(z) „<b>%s</b>” fájl letöltve." #: ../extensions/transfers.vala:433 #, c-format msgid "'<b>%s</b>' and %d other files have been downloaded." -msgstr "" +msgstr "„<b>%s</b>” és %d egyéb fájl került letöltésre." #: ../extensions/transfers.vala:434 msgid "Transfer completed" @@ -3261,8 +3275,8 @@ msgstr "Az átvitel meg fog szakadni, ha kilép a Midoriból." #: ../extensions/transfers.vala:538 msgid "Transfer Manager" -msgstr "" +msgstr "Átvitelkezelő" #: ../extensions/transfers.vala:539 msgid "View downloaded files" -msgstr "" +msgstr "Letöltött fájlok megtekintése" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:21+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-07-28 07:51+0000\n" -"Last-Translator: Viko Adi Rahmawan <Unknown>\n" +"PO-Revision-Date: 2013-11-12 09:34+0000\n" +"Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: id\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -530,6 +530,7 @@ msgstr "" " Dani Pratomo https://launchpad.net/~daneepee\n" " Reza Faiz A Rahman https://launchpad.net/~ylpmiskrad\n" " Risman Rangga Pratama https://launchpad.net/~imanrp\n" +" Rizal Muttaqin https://launchpad.net/~sundaralinux\n" " Viko Adi Rahmawan https://launchpad.net/~vikoadi\n" " WebKit Team https://launchpad.net/~webkit-team\n" " padmawan https://launchpad.net/~andhika-padmawan" @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: midori 0.1.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-16 08:16+0000\n" +"PO-Revision-Date: 2013-12-11 12:34+0000\n" "Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Italian <xfce-it-translators@googlegroups.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-17 04:35+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: it\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -541,6 +541,7 @@ msgstr "" " Cristian Marchi https://launchpad.net/~cri-penta\n" " Cristian Marchi https://launchpad.net/~cri79\n" " Fabio Gaudenzi https://launchpad.net/~bafio-fruges-c\n" +" Filippo Vicentini https://launchpad.net/~filippovicentini\n" " Lorenzo Bracci https://launchpad.net/~lore-bracci\n" " Marchi Cristian https://launchpad.net/~cri-penta-8\n" " Michael Moroni https://launchpad.net/~airon90\n" @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: Midori 0.1.9\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-02 11:58+0000\n" +"PO-Revision-Date: 2013-11-12 09:29+0000\n" "Last-Translator: Masato HASHIMOTO <cabezon.hashimoto@gmail.com>\n" "Language-Team: Japanese <xfce-users-jp@googlegroups.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: ja\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -300,27 +300,27 @@ msgstr "ブックマーク" #: ../midori/midori-browser.c:949 msgid "New Folder" -msgstr "" +msgstr "新しいフォルダー" #: ../midori/midori-browser.c:949 msgid "Edit Folder" -msgstr "" +msgstr "フォルダーの編集" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "新しいブックマーク" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" -msgstr "" +msgstr "ブックマークの編集" #: ../midori/midori-browser.c:973 msgid "Type a name for this bookmark, and choose where to keep it." -msgstr "" +msgstr "このブックマークの名前を入力し、追加先を選択してください。" #: ../midori/midori-browser.c:975 msgid "Type a name for this folder, and choose where to keep it." -msgstr "" +msgstr "このフォルダーの名前を入力し、追加先を選択してください。" #: ../midori/midori-browser.c:1030 msgid "Add to _Speed Dial" @@ -328,7 +328,7 @@ msgstr "スピードダイアルに追加(_S)" #: ../midori/midori-browser.c:1039 msgid "Show in Bookmarks _Bar" -msgstr "" +msgstr "ブックマークバーに表示する(_B)" #: ../midori/midori-browser.c:1047 msgid "Run as _web application" @@ -517,7 +517,7 @@ msgstr "軽快なウェブブラウザー" #: ../midori/midori-browser.c:4753 msgid "See about:version for version info." -msgstr "バージョン情報は about:version をご覧ください。" +msgstr "詳しいバージョン情報は about:version をご覧ください。" #: ../midori/midori-browser.c:4755 msgid "" @@ -535,6 +535,7 @@ msgstr "" "Masato Hashimoto <hashimo@xfce.org>\n" "\n" "Launchpad Contributions:\n" +" Hiroshi Yamamoto https://launchpad.net/~higon\n" " Joji Bronner https://launchpad.net/~jojiinchrist\n" " Masato HASHIMOTO https://launchpad.net/~hashimo" @@ -727,19 +728,19 @@ msgstr "新しいフォルダーの追加(_F)" #: ../midori/midori-browser.c:5406 msgid "_Import bookmarks…" -msgstr "" +msgstr "ブックマークのインポート(_I)…" #: ../midori/midori-browser.c:5409 msgid "_Export bookmarks…" -msgstr "" +msgstr "ブックマークのエクスポート(_E)…" #: ../midori/midori-browser.c:5412 msgid "_Manage Search Engines…" -msgstr "" +msgstr "検索エンジンの管理(_M)…" #: ../midori/midori-browser.c:5415 msgid "_Clear Private Data…" -msgstr "" +msgstr "プライベートデータのクリア(_C)…" #: ../midori/midori-browser.c:5418 msgid "_Inspect Page" @@ -1168,30 +1169,30 @@ msgstr "%s はあなたの場所を知ろうとしています。" #: ../midori/midori-view.c:1250 #, c-format msgid "'%s' can't be found" -msgstr "" +msgstr "'%s' が見つかりませんでした" #: ../midori/midori-view.c:1251 #, c-format msgid "The page '%s' couldn't be loaded:" -msgstr "" +msgstr "ページ '%s' を読み込めませんでした:" #: ../midori/midori-view.c:1255 msgid "Check the address for typos" -msgstr "" +msgstr "アドレスに誤りがないか確認してください" #: ../midori/midori-view.c:1256 msgid "" "Make sure that an ethernet cable is plugged in or the wireless card is " "activated" -msgstr "" +msgstr "LAN ケーブルが接続されているかどうか、または無線 LAN カードが有効になっているか確認してください" #: ../midori/midori-view.c:1257 msgid "Verify that your network settings are correct" -msgstr "" +msgstr "ネットワークが正しく設定されているか確認してください" #: ../midori/midori-view.c:1261 msgid "Try Again" -msgstr "" +msgstr "再試行" #: ../midori/midori-view.c:1386 #, c-format @@ -1222,7 +1223,7 @@ msgstr "要素の検証(_E)" #: ../midori/midori-view.c:2472 msgid "Open _Link" -msgstr "" +msgstr "リンクを開く(_L)" #: ../midori/midori-view.c:2478 msgid "Open Link in New _Tab" @@ -1379,7 +1380,7 @@ msgstr "カッコ内のバージョン番号は実行中に使用されている #: ../midori/midori-view.c:4208 msgid "Page loading delayed:" -msgstr "" +msgstr "ページ読み込み遅延:" #: ../midori/midori-view.c:4209 msgid "Loading delayed either due to a recent crash or startup preferences." @@ -1626,11 +1627,11 @@ msgstr "ポップアップウィンドウを自動的に開くスクリプトの #: ../midori/midori-preferences.c:406 msgid "Default Zoom Level" -msgstr "" +msgstr "デフォルトズームレベル" #: ../midori/midori-preferences.c:410 msgid "Initial factor to enlarge newly opened tabs by" -msgstr "" +msgstr "新しくタブを開いた時の拡大率です" #: ../midori/midori-preferences.c:414 msgid "Preferred languages" @@ -1841,7 +1842,7 @@ msgstr "検索エンジンを保存できませんでした。%s" #: ../midori/midori-historycompletion.vala:17 msgid "Bookmarks and History" -msgstr "" +msgstr "ブックマークと履歴" #: ../midori/midori-historycompletion.vala:54 #, c-format @@ -1918,63 +1919,61 @@ msgstr "ブックマークアイテムの追加に失敗しました: %s\n" #, c-format msgid "%d bookmark" msgid_plural "%d bookmarks" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d 個のブックマーク" #. i18n: [n] subfolder(s) #: ../panels/midori-bookmarks.c:506 #, c-format msgid "%d subfolder" msgid_plural "%d subfolders" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%d 個のサブフォルダー" #. i18n: Empty folder #: ../panels/midori-bookmarks.c:534 #, c-format msgid "Empty folder" -msgstr "" +msgstr "空のフォルダー" #. i18n: Folder containing [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:537 #, c-format msgid "Folder containing %s and no bookmark" -msgstr "" +msgstr "フォルダーには %s が含まれており、ブックマークはありません" #. i18n: Folder containing [[n] bookmark(s)] #: ../panels/midori-bookmarks.c:541 #, c-format msgid "Folder containing %s" -msgstr "" +msgstr "フォルダーには %s が含まれています" #. i18n: Folder containing [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:544 #, c-format msgid "Folder containing %s and %s" -msgstr "" +msgstr "フォルダーには %s と %s が含まれています" #. i18n: Bookmark leading to: [bookmark uri] #: ../panels/midori-bookmarks.c:555 #, c-format msgid "Bookmark leading to: %s" -msgstr "" +msgstr "リンク先: %s" #. i18n: [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:569 #, c-format msgid "%s and no bookmark" -msgstr "" +msgstr "%s と 0 個のブックマーク" #. i18n: [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:575 #, c-format msgid "%s and %s" -msgstr "" +msgstr "%s と %s" #: ../panels/midori-bookmarks.c:627 #, c-format msgid "Failed to update bookmark: %s\n" -msgstr "" +msgstr "ブックマークの更新に失敗しました: %s\n" # tooltip #: ../panels/midori-bookmarks.c:686 @@ -2826,7 +2825,7 @@ msgstr "古い履歴アイテムの削除に失敗しました: %s\n" #: ../midori/midori-bookmarks.c:60 #, c-format msgid "Failed to remove bookmark item: %s\n" -msgstr "" +msgstr "ブックマークアイテムの削除に失敗しました: %s\n" #: ../midori/midori-bookmarks.c:106 msgid "failed to ATTACH old db" @@ -3188,16 +3187,16 @@ msgstr "サイトごとに Cookie のパーミッションを管理します" #: ../extensions/apps.vala:58 #, c-format msgid "Failed to fetch application icon in %s: %s" -msgstr "" +msgstr "%s のアプリケーションアイコンの取得に失敗しました: %s" #: ../extensions/apps.vala:84 msgid "Launcher created" -msgstr "" +msgstr "ランチャーを作成しました" #: ../extensions/apps.vala:85 #, c-format msgid "You can now run <b>%s</b> from your launcher or menu" -msgstr "" +msgstr "ランチャーメニューから <b>%s</b> を実行できます" #: ../extensions/apps.vala:88 ../extensions/apps.vala:90 #, c-format @@ -3206,7 +3205,7 @@ msgstr "" #: ../extensions/apps.vala:89 msgid "Error creating launcher" -msgstr "" +msgstr "ランチャーの作成でエラー" #: ../extensions/apps.vala:126 msgid "Applications" @@ -3214,28 +3213,28 @@ msgstr "アプリケーション" #: ../extensions/apps.vala:134 msgid "New _Profile" -msgstr "" +msgstr "新しいプロファイル(_P)" #: ../extensions/apps.vala:135 msgid "Creates a new, independant profile and a launcher" -msgstr "" +msgstr "新しく独立したプロファイルとランチャーを作成します" #: ../extensions/apps.vala:144 #, c-format msgid "Midori (%s)" -msgstr "" +msgstr "Midori (%s)" #: ../extensions/apps.vala:149 msgid "New _App" -msgstr "" +msgstr "新しいアプリ(_A)" #: ../extensions/apps.vala:150 msgid "Creates a new app for a specific site" -msgstr "" +msgstr "指定したサイト用に新しいアプリを作成します" #: ../extensions/apps.vala:175 msgid "Error launching" -msgstr "" +msgstr "起動時にエラー" #: ../extensions/apps.vala:384 msgid "Create _Launcher" @@ -3273,7 +3272,7 @@ msgstr "ファイル '<b>%s</b>' をダウンロードしました。" #: ../extensions/transfers.vala:433 #, c-format msgid "'<b>%s</b>' and %d other files have been downloaded." -msgstr "" +msgstr "'<b>%s</b>' とその他 %d 個のファイルをダウンロードしました。" #: ../extensions/transfers.vala:434 msgid "Transfer completed" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-09-03 04:43+0000\n" -"X-Generator: Launchpad (build 16753)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: kk\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -26,8 +26,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-08-01 05:20+0000\n" -"X-Generator: Launchpad (build 16718)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: ko\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -17,8 +17,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-30 04:38+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: \n" "X-Poedit-Language: Lithuanian\n" "X-Poedit-SourceCharset: utf-8\n" @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-03 11:38+0000\n" -"Last-Translator: WebKit Team <Unknown>\n" +"PO-Revision-Date: 2013-10-24 08:39+0000\n" +"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n" "Language-Team: Latvian <lv@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -53,15 +53,15 @@ msgstr "" #: ../data/midori-private.desktop.in.h:1 msgid "Midori Private Browsing" -msgstr "" +msgstr "Midori Privātā pārlūkošana" #: ../data/midori-private.desktop.in.h:2 ../midori/midori-view.c:4106 msgid "Private Browsing" -msgstr "" +msgstr "Privātā pārlūkošana" #: ../data/midori-private.desktop.in.h:3 msgid "Open a new private browsing window" -msgstr "" +msgstr "Atvērt jaunu Privātā pārlūkošana logu" #: ../midori/main.c:52 #, c-format @@ -513,6 +513,7 @@ msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Arvis Lācis https://launchpad.net/~arvis-lacis\n" +" Jānis-Marks Gailis https://launchpad.net/~jeanmarc-gailis\n" " WebKit Team https://launchpad.net/~webkit-team" #: ../midori/midori-browser.c:5243 @@ -8,32 +8,32 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-24 07:13+0000\n" -"Last-Translator: WebKit Team <Unknown>\n" +"PO-Revision-Date: 2013-11-23 07:46+0000\n" +"Last-Translator: STyM Alfazz <Unknown>\n" "Language-Team: Malayalam <ml@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-25 04:36+0000\n" -"X-Generator: Launchpad (build 16738)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 msgid "Midori" -msgstr "" +msgstr "മിഡോരി" #: ../data/midori.desktop.in.h:2 msgid "Web Browser" -msgstr "" +msgstr "വെബ് ബ്രൗസര്" #: ../data/midori.desktop.in.h:3 msgid "Midori Web Browser" -msgstr "" +msgstr "മിഡോരി വെബ് ബ്രൗസര്" #: ../data/midori.desktop.in.h:4 msgid "Browse the Web" -msgstr "" +msgstr "വെബില് തിരയുക" #: ../data/midori.desktop.in.h:5 msgid "Internet;WWW;Explorer" @@ -41,11 +41,11 @@ msgstr "" #: ../data/midori.desktop.in.h:6 ../midori/midori-browser.c:1425 msgid "New Tab" -msgstr "" +msgstr "പുതിയ ടാബ്" #: ../data/midori.desktop.in.h:7 ../midori/midori-browser.c:1422 msgid "New Window" -msgstr "" +msgstr "പുതിയ ജാലകം" #: ../data/midori.desktop.in.h:8 msgid "New Private Browsing Window" @@ -74,7 +74,7 @@ msgstr "" #: ../midori/main.c:79 msgid "ADDRESS" -msgstr "" +msgstr "വിലാസം" #: ../midori/main.c:81 msgid "Use FOLDER as configuration folder" @@ -122,11 +122,11 @@ msgstr "" #: ../midori/main.c:103 msgid "Display program version" -msgstr "" +msgstr "പ്രോഗ്രാം പതിപ്പ് കാണിക്കുക" #: ../midori/main.c:105 msgid "Addresses" -msgstr "" +msgstr "വിലാസങ്ങള്" #: ../midori/main.c:107 msgid "Block URIs according to regular expression PATTERN" @@ -134,7 +134,7 @@ msgstr "" #: ../midori/main.c:107 msgid "PATTERN" -msgstr "" +msgstr "രീതി" #. i18n: CLI: Close tabs, clear private data, open starting page #: ../midori/main.c:111 @@ -159,11 +159,11 @@ msgstr "" #: ../midori/main.c:358 msgid "An unknown error occured" -msgstr "" +msgstr "അപരിചിതമായ ഒരു പിശക് ഉണ്ടായിരിക്കുന്നു" #: ../midori/midori-app.c:1340 ../midori/midori-browser.c:6102 msgid "_Bookmarks" -msgstr "" +msgstr "_സൂചിതസ്ഥാനങ്ങള്" #: ../midori/midori-app.c:1341 msgid "Add Boo_kmark" @@ -171,12 +171,12 @@ msgstr "" #: ../midori/midori-app.c:1342 msgid "_Extensions" -msgstr "" +msgstr "_ചേര്പ്പുകള്" #. i18n: Browsing history, visited web pages, closed tabs #: ../midori/midori-app.c:1343 ../midori/midori-privatedata.c:175 msgid "_History" -msgstr "" +msgstr "_ചരിത്രം" #: ../midori/midori-app.c:1344 msgid "_Userscripts" @@ -188,7 +188,7 @@ msgstr "" #: ../midori/midori-app.c:1346 msgid "New _Tab" -msgstr "" +msgstr "പുതിയ _ടാബ്" #: ../midori/midori-app.c:1347 msgid "_Transfers" @@ -204,11 +204,11 @@ msgstr "" #: ../midori/midori-app.c:1350 ../midori/midori-browser.c:5245 msgid "New _Window" -msgstr "" +msgstr "പുതിയ _ജാലകം" #: ../midori/midori-app.c:1351 msgid "New _Folder" -msgstr "" +msgstr "പുതിയ _അറ" #: ../midori/midori-app.c:1400 ../midori/midori-app.c:1403 #: ../midori/midori-app.c:1406 @@ -512,7 +512,7 @@ msgstr "" msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" -" STyM Alfaz https://launchpad.net/~alfasst\n" +" STyM Alfazz https://launchpad.net/~alfasst\n" " WebKit Team https://launchpad.net/~webkit-team" #: ../midori/midori-browser.c:5243 @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-09 04:41+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-29 08:02+0000\n" -"Last-Translator: Magnus Meyer Hustveit <dizzi90@gmail.com>\n" +"PO-Revision-Date: 2013-12-30 13:26+0000\n" +"Last-Translator: kingu <comradekingu@gmail.com>\n" "Language-Team: Norwegian Bokmal <nb@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-30 04:41+0000\n" -"X-Generator: Launchpad (build 16750)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -226,11 +226,11 @@ msgstr "Misformet dokument." #: ../midori/midori-array.c:656 msgid "Unrecognized bookmark format." -msgstr "" +msgstr "Ukjent bokmerke-format" #: ../midori/midori-browser.c:328 ../midori/midori-browser.c:5377 msgid "Go forward to the next page" -msgstr "" +msgstr "Gå videre til neste side" #. i18n: Visit the following logical page, ie. in a forum or blog #: ../midori/midori-browser.c:335 ../midori/midori-browser.c:5385 @@ -240,16 +240,16 @@ msgstr "" #: ../midori/midori-browser.c:345 msgid "Web Search…" -msgstr "" +msgstr "Nettsøk..." #: ../midori/midori-browser.c:449 ../midori/midori-browser.c:5326 #: ../midori/midori-browser.c:5335 msgid "Reload the current page" -msgstr "" +msgstr "Last inn gjeldende side på nytt" #: ../midori/midori-browser.c:457 ../midori/midori-browser.c:5332 msgid "Stop loading the current page" -msgstr "" +msgstr "Stopp innlasting av gjeldende side" #: ../midori/midori-browser.c:534 #, c-format @@ -266,7 +266,7 @@ msgstr "Verdien '%s' er ikke gyldig for %s" #: ../midori/midori-browser.c:6890 #, c-format msgid "Unexpected setting '%s'" -msgstr "" +msgstr "Uventet innstilling '%s'" #: ../midori/midori-browser.c:589 ../midori/midori-browser.c:662 #, c-format @@ -281,19 +281,19 @@ msgstr "" #: ../midori/midori-browser.c:852 ../midori/midori-browser.c:894 #: ../panels/midori-bookmarks.c:118 msgid "Bookmarks" -msgstr "" +msgstr "Bokmerker" #: ../midori/midori-browser.c:949 msgid "New Folder" -msgstr "" +msgstr "Ny mappe" #: ../midori/midori-browser.c:949 msgid "Edit Folder" -msgstr "" +msgstr "Rediger mappe" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "Nytt bokmerke" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" @@ -321,7 +321,7 @@ msgstr "" #: ../midori/midori-browser.c:1160 ../midori/midori-browser.c:4523 msgid "Save file as" -msgstr "" +msgstr "Lagre fil som" #: ../midori/midori-browser.c:1170 msgid "Save associated _resources" @@ -329,11 +329,11 @@ msgstr "" #: ../midori/midori-browser.c:1422 msgid "A new window has been opened" -msgstr "" +msgstr "Nytt vindu åpnet" #: ../midori/midori-browser.c:1425 msgid "A new tab has been opened" -msgstr "" +msgstr "Ny fane åpnet" #: ../midori/midori-browser.c:1443 msgid "Error opening the image!" @@ -514,6 +514,7 @@ msgstr "" "Launchpad Contributions:\n" " Magnus Meyer Hustveit https://launchpad.net/~dizzi90\n" " Neethan Puvanendran https://launchpad.net/~neethan98\n" +" kingu https://launchpad.net/~comradekingu\n" " messo https://launchpad.net/~rsolvang" #: ../midori/midori-browser.c:5243 @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-08-09 04:41+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: nl (Dutch)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:17+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -16,8 +16,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -14,8 +14,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -18,8 +18,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-08-04 05:16+0000\n" -"X-Generator: Launchpad (build 16718)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: pl\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-09-15 05:05+0000\n" -"X-Generator: Launchpad (build 16761)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: pt_PT\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 diff --git a/po/pt_BR.po b/po/pt_BR.po index 234d2eaf..61492f49 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: Midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-07-31 08:09+0000\n" -"Last-Translator: Paulo Galardi <paulogalardi1@gmail.com>\n" +"PO-Revision-Date: 2013-10-01 08:07+0000\n" +"Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Brazilian Portuguese <xfce-i18n-br@xfce.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Launchpad-Export-Date: 2013-08-01 05:20+0000\n" -"X-Generator: Launchpad (build 16718)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: pt_BR\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -537,9 +537,10 @@ msgstr "" " Iuri L. Machado https://launchpad.net/~imetallica\n" " Leonardo Lemos https://launchpad.net/~leonardolemos\n" " Neliton Pereira Jr. https://launchpad.net/~nelitonpjr\n" -" Paulo Galardi https://launchpad.net/~paulogalardi1\n" +" Paulo Galardi https://launchpad.net/~paulogalardi1-deactivatedaccount\n" " Rafael Ferreira https://launchpad.net/~rafael-f-f1\n" -" Sergio https://launchpad.net/~ikisham" +" Sergio https://launchpad.net/~ikisham\n" +" WebKit Team https://launchpad.net/~webkit-team" #: ../midori/midori-browser.c:5243 msgid "_File" @@ -19,8 +19,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" -"X-Launchpad-Export-Date: 2013-07-29 05:22+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: ro\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: midori 0.2.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-26 06:46+0000\n" +"PO-Revision-Date: 2014-01-22 10:23+0000\n" "Last-Translator: Sergey \"Shnatsel\" Davidoff <Shnatsel@gmail.com>\n" "Language-Team: Russian <ru@li.org>\n" "MIME-Version: 1.0\n" @@ -17,8 +17,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-08-27 04:36+0000\n" -"X-Generator: Launchpad (build 16738)\n" +"X-Launchpad-Export-Date: 2014-01-23 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: ru\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -548,10 +548,21 @@ msgstr "" " Igor Mamzov https://launchpad.net/~igor-mamzov\n" " Kirill Ivaha https://launchpad.net/~kirill-ivaha\n" " Ksenia Dylova https://launchpad.net/~ksjenka\n" +" KursoRUS https://launchpad.net/~kursornn\n" +" Kyrill Detinov https://launchpad.net/~lazy-kent\n" " Lexapi https://launchpad.net/~lexapi\n" +" Max Jekov https://launchpad.net/~maks70\n" " Oleg https://launchpad.net/~oopseekoleg\n" +" Pargev https://launchpad.net/~pargev1993\n" +" Pasha. P. Komar https://launchpad.net/~discipulus\n" +" Pustovalov Maxim https://launchpad.net/~skrill-dmc\n" " Sergey \"Shnatsel\" Davidoff https://launchpad.net/~shnatsel\n" -" Глория Хрусталёва https://launchpad.net/~gloriya" +" Yanbaeva https://launchpad.net/~yanbaevas\n" +" daggert https://launchpad.net/~daggert\n" +" moonk https://launchpad.net/~wrex-tp\n" +" zepect https://launchpad.net/~zepect\n" +" Глория Хрусталёва https://launchpad.net/~gloriya\n" +" Дмитрий https://launchpad.net/~myprodreams" #: ../midori/midori-browser.c:5243 msgid "_File" @@ -9,15 +9,15 @@ msgstr "" "Project-Id-Version: Midori 0.3.6-1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-02 11:58+0000\n" +"PO-Revision-Date: 2013-10-27 08:01+0000\n" "Last-Translator: WebKit Team <Unknown>\n" "Language-Team: slovenčina <slovenska-lokalizacia-xfce@googlegroups.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "X-Poedit-Country: SLOVAKIA\n" "Language: sk\n" "X-Poedit-Language: Slovak\n" @@ -244,7 +244,7 @@ msgstr "Prejsť na nasledujúcu podstránku" #: ../midori/midori-browser.c:345 msgid "Web Search…" -msgstr "" +msgstr "Vyhľadávanie na webe..." #: ../midori/midori-browser.c:449 ../midori/midori-browser.c:5326 #: ../midori/midori-browser.c:5335 @@ -289,27 +289,27 @@ msgstr "Záložky" #: ../midori/midori-browser.c:949 msgid "New Folder" -msgstr "" +msgstr "Nový priečinok" #: ../midori/midori-browser.c:949 msgid "Edit Folder" -msgstr "" +msgstr "Upraviť priečinok" #: ../midori/midori-browser.c:951 msgid "New Bookmark" -msgstr "" +msgstr "Nová záložka" #: ../midori/midori-browser.c:951 msgid "Edit Bookmark" -msgstr "" +msgstr "Upraviť záložku" #: ../midori/midori-browser.c:973 msgid "Type a name for this bookmark, and choose where to keep it." -msgstr "" +msgstr "Zadajte názov pre túto záložku a zvoľte miesto, kde bude ponechaná." #: ../midori/midori-browser.c:975 msgid "Type a name for this folder, and choose where to keep it." -msgstr "" +msgstr "Zadajte názov pre tento priečinok a zvoľte miesto, kde bude uložený." #: ../midori/midori-browser.c:1030 msgid "Add to _Speed Dial" @@ -393,7 +393,7 @@ msgstr "Pridať novú záložku" #. FIXME: granite: should return GtkWidget* like GTK+ #: ../midori/midori-browser.c:2669 ../midori/midori-browser.c:5277 msgid "Share this page" -msgstr "" +msgstr "Zdieľať túto stránku" #: ../midori/midori-browser.c:3149 ../midori/midori-searchaction.c:450 msgid "Empty" @@ -535,6 +535,7 @@ msgstr "" "\n" "Launchpad Contributions:\n" " DAG Software https://launchpad.net/~dagsoftware\n" +" Milan Slovák https://launchpad.net/~milboys\n" " Tomáš Vadina https://launchpad.net/~kyberdev\n" " WebKit Team https://launchpad.net/~webkit-team" @@ -713,19 +714,19 @@ msgstr "Pridať nový priečinok" #: ../midori/midori-browser.c:5406 msgid "_Import bookmarks…" -msgstr "" +msgstr "_Importovať záložky..." #: ../midori/midori-browser.c:5409 msgid "_Export bookmarks…" -msgstr "" +msgstr "Exportovať záložky..." #: ../midori/midori-browser.c:5412 msgid "_Manage Search Engines…" -msgstr "" +msgstr "_Správa vyhľadávania..." #: ../midori/midori-browser.c:5415 msgid "_Clear Private Data…" -msgstr "" +msgstr "_Odstrániť súkromné údaje..." #: ../midori/midori-browser.c:5418 msgid "_Inspect Page" @@ -741,7 +742,7 @@ msgstr "_Ďalšia karta" #: ../midori/midori-browser.c:5427 msgid "Move Tab to _first position" -msgstr "" +msgstr "Presunúť záložku na _prvú pozíciu" #: ../midori/midori-browser.c:5429 msgid "Move Tab _Backward" @@ -753,7 +754,7 @@ msgstr "Presunúť kartu do_predu" #: ../midori/midori-browser.c:5433 msgid "Move Tab to _last position" -msgstr "" +msgstr "Presunúť záložku na _poslednú pozíciu" #: ../midori/midori-browser.c:5436 msgid "Focus _Current Tab" @@ -887,7 +888,7 @@ msgstr "Zobrazí uložené záložky" #: ../midori/midori-browser.c:6137 msgid "_Tabs" -msgstr "" +msgstr "_Záložky" #: ../midori/midori-browser.c:6139 msgid "Show a list of all open tabs" @@ -1010,15 +1011,15 @@ msgstr "Zobraziť naposledy otvorené karty bez načítania" #: ../midori/midori-websettings.c:129 msgid "Show Blank Page" -msgstr "" +msgstr "Zobraziť prázdnu stránku" #: ../midori/midori-websettings.c:131 msgid "Show default Search Engine" -msgstr "" +msgstr "Zobraziť predvolené vyhľadávanie" #: ../midori/midori-websettings.c:133 msgid "Show custom page" -msgstr "" +msgstr "Zobraziť vlastnú stránku" #: ../midori/midori-websettings.c:150 msgid "Japanese (SHIFT_JIS)" @@ -1149,12 +1150,12 @@ msgstr "%s požaduje zistenie Vašej polohy." #: ../midori/midori-view.c:1250 #, c-format msgid "'%s' can't be found" -msgstr "" +msgstr "'%s' nebol nájdený" #: ../midori/midori-view.c:1251 #, c-format msgid "The page '%s' couldn't be loaded:" -msgstr "" +msgstr "Stránku '%s' sa nepodarilo načítať:" #: ../midori/midori-view.c:1255 msgid "Check the address for typos" @@ -1168,11 +1169,11 @@ msgstr "" #: ../midori/midori-view.c:1257 msgid "Verify that your network settings are correct" -msgstr "" +msgstr "Overte či máte správne nastavenú sieť" #: ../midori/midori-view.c:1261 msgid "Try Again" -msgstr "" +msgstr "Skúsiť znova" #: ../midori/midori-view.c:1386 #, c-format @@ -1203,7 +1204,7 @@ msgstr "Preskúmať _prvok" #: ../midori/midori-view.c:2472 msgid "Open _Link" -msgstr "" +msgstr "Otvoriť _odkaz" #: ../midori/midori-view.c:2478 msgid "Open Link in New _Tab" @@ -1227,11 +1228,11 @@ msgstr "Kopírovať _cieľ odkazu" #: ../midori/midori-view.c:2497 msgid "Save _As…" -msgstr "" +msgstr "Uložiť _ako…" #: ../midori/midori-view.c:2507 msgid "Open _Image in New Window" -msgstr "" +msgstr "Otvoriť _obrázok v novom okne" #: ../midori/midori-view.c:2508 msgid "Open _Image in New Tab" @@ -1239,7 +1240,7 @@ msgstr "Otvoriť _obrázok na novej karte" #: ../midori/midori-view.c:2512 msgid "Copy Im_age" -msgstr "" +msgstr "Kopírovať _obrázok" #: ../midori/midori-view.c:2515 msgid "Save I_mage" @@ -1614,7 +1615,7 @@ msgstr "Či skripty môžu otvárať vyskakovacie okná automaticky" #: ../midori/midori-preferences.c:406 msgid "Default Zoom Level" -msgstr "" +msgstr "Predvolená úroveň priblíženia" #: ../midori/midori-preferences.c:410 msgid "Initial factor to enlarge newly opened tabs by" @@ -1651,7 +1652,7 @@ msgstr "Otvárať nové stránky v:" #: ../midori/midori-preferences.c:437 msgid "New tab behavior:" -msgstr "" +msgstr "Správanie novej karty:" #: ../midori/midori-preferences.c:442 msgid "Close Buttons on Tabs" @@ -1701,7 +1702,7 @@ msgstr "Port" #: ../midori/midori-preferences.c:497 msgid "Supported proxy types:" -msgstr "" +msgstr "Podporované typy proxy:" #. TODO: Preserve page icons of search engines and merge privacy items #: ../midori/midori-preferences.c:515 ../midori/midori-privatedata.c:323 @@ -1827,7 +1828,7 @@ msgstr "Vyhľadávače sa nepodarilo uložiť. %s" #: ../midori/midori-historycompletion.vala:17 msgid "Bookmarks and History" -msgstr "" +msgstr "Záložky a história" #: ../midori/midori-historycompletion.vala:54 #, c-format @@ -1871,7 +1872,7 @@ msgstr "Nie je možné spustiť externý program" #: ../midori/sokoke.c:552 msgid "Invalid URI" -msgstr "" +msgstr "Neplatná URI" #. i18n: A panel at the bottom, to search text in pages #: ../toolbars/midori-findbar.c:233 @@ -1919,19 +1920,19 @@ msgstr[1] "" #: ../panels/midori-bookmarks.c:534 #, c-format msgid "Empty folder" -msgstr "" +msgstr "Prázdny priečinok" #. i18n: Folder containing [[n] folder(s)] and no bookmark #: ../panels/midori-bookmarks.c:537 #, c-format msgid "Folder containing %s and no bookmark" -msgstr "" +msgstr "Priečinok obsahuje %s a žiadne záložky" #. i18n: Folder containing [[n] bookmark(s)] #: ../panels/midori-bookmarks.c:541 #, c-format msgid "Folder containing %s" -msgstr "" +msgstr "Priečinok obsahuje %s" #. i18n: Folder containing [[n] bookmark(s)] and [[n] folder(s)] #: ../panels/midori-bookmarks.c:544 @@ -16,8 +16,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -18,8 +18,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-08-13 04:45+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: sr\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 diff --git a/po/sr@latin.po b/po/sr@latin.po index 94bf110a..2070f52f 100644 --- a/po/sr@latin.po +++ b/po/sr@latin.po @@ -16,8 +16,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -10,15 +10,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-09-19 09:37+0000\n" +"PO-Revision-Date: 2014-01-13 23:10+0000\n" "Last-Translator: Joachim Johansson <Unknown>\n" "Language-Team: Swedish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-09-20 05:13+0000\n" -"X-Generator: Launchpad (build 16765)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: \n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -328,7 +328,7 @@ msgstr "Spara fil som" #: ../midori/midori-browser.c:1170 msgid "Save associated _resources" -msgstr "Spara associerade _resurser" +msgstr "Spara tillhörande _resurser" #: ../midori/midori-browser.c:1422 msgid "A new window has been opened" @@ -619,7 +619,7 @@ msgstr "Sök efter ett ord eller ett uttryck på sidan" #: ../midori/midori-browser.c:5313 msgid "Find _Next" -msgstr "Hitta _nästa" +msgstr "Sök _nästa" #: ../midori/midori-browser.c:5316 msgid "Find _Previous" @@ -894,7 +894,7 @@ msgstr "Visa sparade bokmärken" #: ../midori/midori-browser.c:6137 msgid "_Tabs" -msgstr "Flikar" +msgstr "_Flikar" #: ../midori/midori-browser.c:6139 msgid "Show a list of all open tabs" @@ -1045,7 +1045,7 @@ msgstr "Aktuell flik" #: ../midori/midori-websettings.c:187 msgid "Default" -msgstr "Standard" +msgstr "Förval" #: ../midori/midori-websettings.c:188 msgid "Icons" @@ -1325,7 +1325,7 @@ msgstr "Inspektera sida - %s" #: ../midori/midori-view.c:4030 #, c-format msgid "No documentation installed" -msgstr "Ingen dokumentation installerad" +msgstr "Dokumentationen är inte installerad" #: ../midori/midori-view.c:4107 msgid "Midori doesn't store any personal data:" @@ -1524,7 +1524,7 @@ msgstr "Är du säker på att du vill ta bort den här genvägen?" #: ../midori/midori-preferences.c:297 msgid "Startup" -msgstr "Uppstart" +msgstr "Programstart" #: ../midori/midori-preferences.c:299 msgid "When Midori starts:" @@ -1569,7 +1569,7 @@ msgstr "Teckensnitt som används för att visa text med fast bredd" #: ../midori/midori-preferences.c:343 msgid "The font size used to display fixed-width text" -msgstr "Typsnittsstorlek som används för att visa text med fast bredd" +msgstr "Storlek som används för att visa text med fast bredd" #: ../midori/midori-preferences.c:345 msgid "Minimum Font Size" @@ -1655,7 +1655,7 @@ msgstr "Öppna nya sidor i:" #: ../midori/midori-preferences.c:437 msgid "New tab behavior:" -msgstr "Inställning för nya flikar" +msgstr "Beteende för nya flikar:" #: ../midori/midori-preferences.c:442 msgid "Close Buttons on Tabs" @@ -1684,7 +1684,7 @@ msgstr "Textredigerare" #: ../midori/midori-preferences.c:463 msgid "News Aggregator" -msgstr "RSS-läsare" +msgstr "Nyhetsflödesläsare" #. Page "Network" #: ../midori/midori-preferences.c:470 @@ -1735,7 +1735,7 @@ msgstr "Ta bort gamla kakor efter:" #: ../midori/midori-preferences.c:546 ../midori/midori-preferences.c:549 msgid "The maximum number of days to save cookies for" -msgstr "Maximalt antal dagar kakor sparas" +msgstr "Maximalt antal dagar som cookies sparas" #: ../midori/midori-preferences.c:553 msgid "Only accept Cookies from sites you visit" @@ -1876,7 +1876,7 @@ msgstr "Kunde inte köra externt program." #: ../midori/sokoke.c:552 msgid "Invalid URI" -msgstr "Ogilltigt URI" +msgstr "Ogiltig länk" #. i18n: A panel at the bottom, to search text in pages #: ../toolbars/midori-findbar.c:233 @@ -2451,7 +2451,7 @@ msgstr "Kunde inte hitta root-delen i nyhetsflödets XML-data." #: ../extensions/feed-panel/feed-parse.c:237 #, c-format msgid "Unsupported feed format." -msgstr "Formatet för flödet stöds inte." +msgstr "Formatet för nyhetsflöde stöds inte." #: ../extensions/feed-panel/feed-parse.c:267 #, c-format @@ -2477,7 +2477,7 @@ msgstr "Kunde inte hitta \"channel\"-delen i RSS XML-data." #: ../extensions/feed-panel/main.c:116 #, c-format msgid "Feed '%s' already exists" -msgstr "Flödet '%s' finns redan" +msgstr "Nyhetsflödet '%s' finns redan" #: ../extensions/feed-panel/main.c:192 #, c-format @@ -2647,7 +2647,7 @@ msgstr "Anpassa snabbkommandon..." #: ../extensions/shortcuts.c:312 msgid "Shortcuts" -msgstr "Genvägar" +msgstr "Snabbkommandon" #: ../extensions/shortcuts.c:313 msgid "View and edit keyboard shortcuts" @@ -3171,7 +3171,7 @@ msgstr "Hantera rättigheter för kakorna per webbplats" #: ../extensions/apps.vala:58 #, c-format msgid "Failed to fetch application icon in %s: %s" -msgstr "" +msgstr "Misslyckades med att hämta programikonen för %s: %s" #: ../extensions/apps.vala:84 msgid "Launcher created" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-07-13 09:28+0000\n" +"PO-Revision-Date: 2014-01-22 10:23+0000\n" "Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Turkish <tr@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-23 05:16+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -531,15 +531,19 @@ msgstr "" "\n" "Launchpad Contributions:\n" " Ayhan YALÇINSOY https://launchpad.net/~ayhanyalcinsoy\n" +" Baris Ata https://launchpad.net/~brsata\n" " Ferhat TUNÇTAN https://launchpad.net/~ferhattnctn66\n" -" Halit Alptekin https://launchpad.net/~diqit4ll\n" +" Halit Alptekin https://launchpad.net/~halitalptekin\n" " Hasan Yılmaz https://launchpad.net/~hasanyilmaz\n" " Irmak Bıçakçıgil https://launchpad.net/~irmak\n" +" Metin Şanlı https://launchpad.net/~metinsanli\n" " Sadık Atalay https://launchpad.net/~seaflames\n" " Selim Sırrı Sevgi https://launchpad.net/~selimssevgi\n" +" Seçgin Karagülle https://launchpad.net/~secgink-57\n" " Utku BERBEROĞLU https://launchpad.net/~boluluutku\n" " WebKit Team https://launchpad.net/~webkit-team\n" " c.k. https://launchpad.net/~cankutay-eser\n" +" circass https://launchpad.net/~erdincgultekin\n" " kulkke https://launchpad.net/~kulkke\n" " seaflames https://launchpad.net/~protoman-s\n" " Çağatay Çöl https://launchpad.net/~cagataycol" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: \n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: midori svn\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-02 11:54+0000\n" +"PO-Revision-Date: 2013-09-30 07:48+0000\n" "Last-Translator: WebKit Team <Unknown>\n" "Language-Team: Ukrainian <translation@linux.org.ua>\n" "MIME-Version: 1.0\n" @@ -17,8 +17,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: uk\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -531,6 +531,7 @@ msgstr "" "\n" "Launchpad Contributions:\n" " Knedlyk https://launchpad.net/~yupadmin\n" +" Ksenia Dylova https://launchpad.net/~ksjenka\n" " Pavlo Bilyak https://launchpad.net/~pavlo1997\n" " WebKit Team https://launchpad.net/~webkit-team" @@ -15,8 +15,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:18+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 diff --git a/po/zh_CN.po b/po/zh_CN.po index 3d42416b..4018efd1 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -11,15 +11,15 @@ msgstr "" "Project-Id-Version: midori\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-08-13 01:22+0000\n" +"PO-Revision-Date: 2013-11-16 13:40+0000\n" "Last-Translator: Yangyu Huang <Unknown>\n" "Language-Team: Chinese (Simplified) <xfce-i18n-cn@xfce.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-08-14 04:39+0000\n" -"X-Generator: Launchpad (build 16723)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" "Language: zh_CN\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 @@ -1592,7 +1592,7 @@ msgstr "默认页面放大比例" #: ../midori/midori-preferences.c:410 msgid "Initial factor to enlarge newly opened tabs by" -msgstr "" +msgstr "放大新打开的标签的初始因子:" #: ../midori/midori-preferences.c:414 msgid "Preferred languages" diff --git a/po/zh_TW.po b/po/zh_TW.po index e9cd0c10..12031c1e 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -9,15 +9,15 @@ msgstr "" "Project-Id-Version: midori master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-27 12:55-0500\n" -"PO-Revision-Date: 2013-06-15 16:35+0000\n" +"PO-Revision-Date: 2013-10-11 11:23+0000\n" "Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n" "Language-Team: chinese-l10n <chinese-l10n@googlegroups.com>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Launchpad-Export-Date: 2013-07-29 05:23+0000\n" -"X-Generator: Launchpad (build 16700)\n" +"X-Launchpad-Export-Date: 2014-01-22 05:19+0000\n" +"X-Generator: Launchpad (build 16901)\n" #: ../data/midori.desktop.in.h:1 ../midori/main.c:142 #: ../midori/midori-websettings.c:225 @@ -1130,30 +1130,30 @@ msgstr "%s 想要知道您的所在位置。" #: ../midori/midori-view.c:1250 #, c-format msgid "'%s' can't be found" -msgstr "" +msgstr "找不到「%s」" #: ../midori/midori-view.c:1251 #, c-format msgid "The page '%s' couldn't be loaded:" -msgstr "" +msgstr "無法載入「%s」頁面:" #: ../midori/midori-view.c:1255 msgid "Check the address for typos" -msgstr "" +msgstr "請檢查位址是否有打字有誤" #: ../midori/midori-view.c:1256 msgid "" "Make sure that an ethernet cable is plugged in or the wireless card is " "activated" -msgstr "" +msgstr "請確認乙太網路線是否插入,或是無線網卡是否有啟動" #: ../midori/midori-view.c:1257 msgid "Verify that your network settings are correct" -msgstr "" +msgstr "請驗證您的網路設定是否正確" #: ../midori/midori-view.c:1261 msgid "Try Again" -msgstr "" +msgstr "再試一次" #: ../midori/midori-view.c:1386 #, c-format @@ -1184,7 +1184,7 @@ msgstr "審閱元素(_E)" #: ../midori/midori-view.c:2472 msgid "Open _Link" -msgstr "" +msgstr "開啟連結(_L)" #: ../midori/midori-view.c:2478 msgid "Open Link in New _Tab" @@ -1341,7 +1341,7 @@ msgstr "中括號內的版本編號顯示執行時期使用的版本。" #: ../midori/midori-view.c:4208 msgid "Page loading delayed:" -msgstr "" +msgstr "網頁載入延遲:" #: ../midori/midori-view.c:4209 msgid "Loading delayed either due to a recent crash or startup preferences." @@ -1580,11 +1580,11 @@ msgstr "是否允許指令稿自動開啟彈出視窗" #: ../midori/midori-preferences.c:406 msgid "Default Zoom Level" -msgstr "" +msgstr "預設遠近等級" #: ../midori/midori-preferences.c:410 msgid "Initial factor to enlarge newly opened tabs by" -msgstr "" +msgstr "新開啟分頁的初始放大係數" #: ../midori/midori-preferences.c:414 msgid "Preferred languages" @@ -1790,7 +1790,7 @@ msgstr "無法儲存搜尋引擎。%s" #: ../midori/midori-historycompletion.vala:17 msgid "Bookmarks and History" -msgstr "" +msgstr "書籤與歷史" #: ../midori/midori-historycompletion.vala:54 #, c-format @@ -2764,7 +2764,7 @@ msgstr "無法 DETACH " #: ../midori/midori-bookmarks.c:257 #, c-format msgid "Couldn't setup bookmarks: %s\n" -msgstr "" +msgstr "無法設置書籤:%s\n" #: ../midori/midori-bookmarks.c:271 #, c-format @@ -3101,7 +3101,7 @@ msgstr "針對各個網站管理訊餅的許可與否" #: ../extensions/apps.vala:58 #, c-format msgid "Failed to fetch application icon in %s: %s" -msgstr "" +msgstr "無法擷取 %s 中的應用程式圖示:%s" #: ../extensions/apps.vala:84 msgid "Launcher created" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6a589cab..7782ff77 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,45 +12,41 @@ include_directories( ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}/midori" ) -file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c) +file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c *.vala) foreach(UNIT_SRC ${TESTS}) - string(REPLACE ".c" "" UNIT ${UNIT_SRC}) - add_executable(${UNIT} ${UNIT_SRC}) - add_test(NAME ${UNIT} COMMAND ${UNIT}) - contain_test(${UNIT}) - target_link_libraries(${UNIT} - ${LIBMIDORI} - ) - set_target_properties(${UNIT} PROPERTIES - COMPILE_FLAGS ${CFLAGS} - ) -endforeach () + if (${UNIT_SRC} MATCHES "(.vala)$") + string(REPLACE ".vala" "" UNIT ${UNIT_SRC}) + include(ValaPrecompile) + vala_precompile(UNIT_SRC_C ${UNIT} + ${UNIT_SRC} + PACKAGES + ${PKGS} + OPTIONS + ${VALAFLAGS} + CUSTOM_VAPIS + ${EXTRA_VAPIS} + "${CMAKE_SOURCE_DIR}/midori/midori.vapi" + "${CMAKE_SOURCE_DIR}/katze/katze.vapi" + "${CMAKE_BINARY_DIR}/midori/${LIBMIDORI}.vapi" + ) + + add_executable(${UNIT} ${UNIT_SRC_C}) + set_target_properties(${UNIT} PROPERTIES + COMPILE_FLAGS "${VALA_CFLAGS}" + ) + else() + string(REPLACE ".c" "" UNIT ${UNIT_SRC}) + add_executable(${UNIT} ${UNIT_SRC}) + set_target_properties(${UNIT} PROPERTIES + COMPILE_FLAGS ${CFLAGS} + ) + endif() -file(GLOB TESTS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.vala) -foreach(UNIT_SRC ${TESTS}) - string(REPLACE ".vala" "" UNIT ${UNIT_SRC}) - include(ValaPrecompile) - vala_precompile(UNIT_SRC_C ${UNIT} - ${UNIT_SRC} - PACKAGES - ${PKGS} - OPTIONS - ${VALAFLAGS} - CUSTOM_VAPIS - ${EXTRA_VAPIS} - "${CMAKE_SOURCE_DIR}/midori/midori.vapi" - "${CMAKE_SOURCE_DIR}/katze/katze.vapi" - "${CMAKE_BINARY_DIR}/midori/${LIBMIDORI}.vapi" - ) - add_executable(${UNIT} ${UNIT_SRC_C}) - add_test(NAME ${UNIT} COMMAND ${UNIT}) - contain_test(${UNIT}) target_link_libraries(${UNIT} ${LIBMIDORI} ) - set_target_properties(${UNIT} PROPERTIES - COMPILE_FLAGS "${VALA_CFLAGS}" - ) + add_test(NAME ${UNIT} COMMAND ${UNIT}) + contain_test (${UNIT}) endforeach () file(GLOB TESTS *.sh) diff --git a/tests/app.vala b/tests/app.vala index d9790231..b024f468 100644 --- a/tests/app.vala +++ b/tests/app.vala @@ -18,40 +18,38 @@ bool check_sensible_window_size (Gtk.Window window, Midori.WebSettings settings) void app_normal () { Midori.Test.grab_max_timeout (); - Midori.Test.idle_timeouts (); Midori.Test.log_set_fatal_handler_for_icons (); Midori.Paths.Test.reset_runtime_mode (); Midori.App.set_instance_is_running (false); var app = Midori.normal_app_new (null, "test-normal", false, null, null, -1, null); var loop = MainContext.default (); - do { loop.iteration (true); } while (loop.pending ()); - for (var i = 0 ; i < 7; i++) { + do { loop.iteration (true); } while (app.browser == null); + for (var i = 0 ; i < 3; i++) { var tab = app.browser.add_uri ("about:blank") as Midori.View; app.browser.close_tab (tab); do { loop.iteration (true); } while (loop.pending ()); } Midori.normal_app_on_quit (app); - /* FIXME - for (var i = 0 ; i < 7; i++) { - app.settings.maximum_cache_size++; - do { loop.iteration (true); } while (loop.pending ()); - } - */ - Midori.Test.release_max_timeout (); } void app_normal_custom_config () { + Midori.Test.grab_max_timeout (); + Midori.Test.idle_timeouts (); Midori.Test.log_set_fatal_handler_for_icons (); Midori.Paths.Test.reset_runtime_mode (); Midori.App.set_instance_is_running (false); - var app = Midori.normal_app_new (Midori.Paths.make_tmp_dir ("custom-configXXXXXX"), + string? config_dir = null; + try { + config_dir = DirUtils.make_tmp ("custom-configXXXXXX"); + } catch (Error error) { + GLib.error (error.message); + } + var app = Midori.normal_app_new (config_dir, "test-custom-config-normal", false, null, null, -1, null); - var loop = MainContext.default (); - do { loop.iteration (true); } while (app.browser == null); - assert (check_sensible_window_size (app.browser, app.settings)); Midori.normal_app_on_quit (app); + Midori.Test.release_max_timeout (); } void app_private () { @@ -82,94 +80,6 @@ void app_web_custom_config () { assert (check_sensible_window_size (browser, browser.settings)); } - -void app_extensions_load () { - Midori.Test.grab_max_timeout (); - - Midori.Test.idle_timeouts (); - Midori.Test.log_set_fatal_handler_for_icons (); - Midori.Paths.Test.reset_runtime_mode (); - Midori.App.set_instance_is_running (false); - var app = Midori.normal_app_new (null, "test-extensions-normal", false, null, null, -1, null); - var loop = MainContext.default (); - do { loop.iteration (true); } while (loop.pending ()); - /* No extensions loaded */ - assert (app.extensions.get_length () == 0); - Midori.Extension.load_from_folder (app, null, false); - /* All extensions loaded, inactive */ - assert (app.extensions.get_length () > 0); - - /* Number of expected extensions matches */ - /* FIXME Counting .so/dll doesn't see multiple extensions in one binary - Dir dir; - try { - dir = Dir.open (Midori.Paths.get_lib_path (PACKAGE_NAME), 0); - } - catch (Error error) { - GLib.error (error.message); - } - uint count = 0; - string? name; - while ((name = dir.read_name ()) != null) { - if (name.has_suffix (GLib.Module.SUFFIX)) - count++; - } - assert (app.extensions.get_length () == count); */ - - foreach (var item in app.extensions.get_items ()) - assert (!(item as Midori.Extension).is_active ()); - - for (var i = 0 ; i < 7; i++) { - var tab = app.browser.add_uri ("about:blank") as Midori.View; - app.browser.close_tab (tab); - } - do { loop.iteration (true); } while (loop.pending ()); - - /* - Midori.Test.release_max_timeout (); -} - -void app_extensions_activate () { - Midori.Test.grab_max_timeout (); - - Midori.Test.idle_timeouts (); - Midori.Test.log_set_fatal_handler_for_icons (); - Midori.Paths.Test.reset_runtime_mode (); - Midori.App.set_instance_is_running (false); - var app = Midori.normal_app_new (null, "test-extensions-normal", false, null, null, -1, null); - var loop = MainContext.default (); - do { loop.iteration (true); } while (loop.pending ()); - Midori.Extension.load_from_folder (app, null, false); - - assert (app.extensions.get_length () > 0); - */ - - foreach (var item in app.extensions.get_items ()) { - stdout.printf ("- %s\n", (item as Midori.Extension).name); - (item as Midori.Extension).activate (app); - } - do { loop.iteration (true); } while (loop.pending ()); - - for (var i = 0 ; i < 7; i++) { - var tab = app.browser.add_uri ("about:blank") as Midori.View; - app.browser.close_tab (tab); - } - do { loop.iteration (true); } while (loop.pending ()); - - foreach (var item in app.extensions.get_items ()) - (item as Midori.Extension).deactivate (); - do { loop.iteration (true); } while (loop.pending ()); - - for (var i = 0 ; i < 7; i++) { - var tab = app.browser.add_uri ("about:blank") as Midori.View; - app.browser.close_tab (tab); - do { loop.iteration (true); } while (loop.pending ()); - } - - Midori.Test.release_max_timeout (); -} - - void main (string[] args) { Test.init (ref args); Midori.App.setup (ref args, null); @@ -178,8 +88,6 @@ void main (string[] args) { Test.add_func ("/app/private", app_private); Test.add_func ("/app/web", app_web); Test.add_func ("/app/web-custom-config", app_web_custom_config); - Test.add_func ("/app/extensions-load", app_extensions_load); - /* Test.add_func ("/app/extensions-activate", app_extensions_activate); */ Test.run (); } diff --git a/tests/browser.c b/tests/browser.c index 8e5ab9b2..b0d0d802 100644 --- a/tests/browser.c +++ b/tests/browser.c @@ -43,7 +43,7 @@ browser_create (void) midori_settings_set_download_folder (MIDORI_SETTINGS (settings), temporary_downloads); midori_browser_save_uri (browser, MIDORI_VIEW (view), NULL); - filename = midori_view_save_source (MIDORI_VIEW (view), NULL, NULL); + filename = midori_view_save_source (MIDORI_VIEW (view), NULL, NULL, FALSE); filename2 = g_filename_from_uri (uri, NULL, NULL); g_assert_cmpstr (filename, ==, filename2); g_free (filename); diff --git a/tests/completion.vala b/tests/completion.vala index 231cf3da..8abaf4db 100644 --- a/tests/completion.vala +++ b/tests/completion.vala @@ -87,35 +87,43 @@ void completion_autocompleter () { error ("Expected %d but got %d", 3, n); } -struct TestCaseCompletion { - public string prefix; - public string text; - public int expected_count; -} - -const TestCaseCompletion[] completions = { - { "history", "example", 1 } -}; - -async void complete_spec (Midori.Completion completion, TestCaseCompletion spec) { - assert (completion.can_complete (spec.text)); +async void complete_history (Midori.HistoryDatabase history) { + try { + history.insert ("http://example.com", "Ejemplo", 0, 0); + } catch (Error error) { + assert_not_reached (); + } var cancellable = new Cancellable (); - var suggestions = yield completion.complete (spec.text, null, cancellable); - if (spec.expected_count != suggestions.length ()) - error ("%u expected for %s/ %s but got %u", - spec.expected_count, spec.prefix, spec.text, suggestions.length ()); + var results = yield history.list_by_count_with_bookmarks ("example", 1, cancellable); + assert (results.length () == 1); + var first = results.nth_data (0); + assert (first.title == "Ejemplo"); + results = yield history.list_by_count_with_bookmarks ("ejemplo", 1, cancellable); + assert (results.length () == 1); + first = results.nth_data (0); + assert (first.title == "Ejemplo"); + complete_history_done = true; } +bool complete_history_done = false; void completion_history () { - Sqlite.Database db; - assert (Sqlite.Database.open_v2 (Midori.Paths.get_config_filename_for_writing ("bookmarks_v2.db"), out db) == Sqlite.OK); - assert (db.exec ("CREATE TABLE bookmarks (uri TEXT, title TEXT, last_visit DATE);") == Sqlite.OK); - - var completion = new Midori.HistoryCompletion (); var app = new Midori.App (); - completion.prepare (app); - foreach (var spec in completions) - complete_spec.begin (completion, spec); + Midori.HistoryDatabase history; + try { + var bookmarks_database = new Midori.BookmarksDatabase (); + assert (bookmarks_database.db != null); + history = new Midori.HistoryDatabase (app); + assert (history.db != null); + history.clear (0); + } catch (Midori.DatabaseError error) { + assert_not_reached(); + } + + Midori.Test.grab_max_timeout (); + var loop = MainContext.default (); + complete_history.begin (history); + do { loop.iteration (true); } while (!complete_history_done); + Midori.Test.release_max_timeout (); } struct TestCaseRender { diff --git a/tests/extensions.c b/tests/extensions.c index 34fadb7e..26d4d379 100644 --- a/tests/extensions.c +++ b/tests/extensions.c @@ -160,6 +160,7 @@ extension_settings (void) midori_extension_set_string_list (extension, "pets", names, 2); g_strfreev (names); names = midori_extension_get_string_list (extension, "pets", &names_n); + g_strfreev (names); g_assert_cmpint (names_n, ==, 2); midori_extension_deactivate (extension); } diff --git a/tests/license.sh b/tests/license.sh index 70e4c13d..728209c7 100755 --- a/tests/license.sh +++ b/tests/license.sh @@ -9,5 +9,5 @@ echo Running 'licensecheck' test -z $(which licensecheck) && echo ...SKIPPED: not installed && return 0 test -n "$SRCDIR" && cd $SRCDIR test -z "$BLDDIR" && BLDDIR=_build -find . \! -path './.*/*' -a \! -path "./$BLDDIR/*" -a \! -path "./debian/*" | xargs licensecheck | grep UNKNOWN && exit 1 +find . \! -path './.*/*' -a \! -path "./$BLDDIR/*" -a \! -path "./_*/*" -a \! -path "./debian/*" | xargs licensecheck | grep UNKNOWN && exit 1 echo ...OK diff --git a/tests/potfiles.sh b/tests/potfiles.sh index 655dd29e..e6330c66 100755 --- a/tests/potfiles.sh +++ b/tests/potfiles.sh @@ -8,7 +8,7 @@ echo Checking POTFILES.in for completeness test -n "$SRCDIR" && cd $SRCDIR test -z "$BLDDIR" && BLDDIR=_build -for i in $(find . -regextype posix-egrep \! -regex "./($BLDDIR|debian|tests)/.+" -a -regex './[^.]+.+[.](vala|c)'); do +for i in $(find . -regextype posix-egrep \! -regex "./($BLDDIR|_.+|debian|tests)/.+" -a -regex './[^.]+.+[.](vala|c)'); do grep -q $(basename $i) po/POTFILES.in || FILES="$FILES$i\n" done test -n "$FILES" && echo "$FILES...FAILED" diff --git a/tests/speeddial.vala b/tests/speeddial.vala index 849aba88..20d12485 100644 --- a/tests/speeddial.vala +++ b/tests/speeddial.vala @@ -14,7 +14,11 @@ string get_test_file (string contents) { tmp_folder = Midori.Paths.make_tmp_dir ("speeddialXXXXXX"); string checksum = Checksum.compute_for_string (ChecksumType.MD5, contents); string file = Path.build_path (Path.DIR_SEPARATOR_S, tmp_folder, checksum); - FileUtils.set_contents (file, contents, -1); + try { + FileUtils.set_contents (file, contents, -1); + } catch (Error file_error) { + GLib.error (file_error.message); + } return file; } @@ -57,12 +61,16 @@ static void speeddial_load () { } catch (Error error) { /* Error expected: pass */ } - dial_data.save_message ("speed_dial-save-rename 1 Lorem"); - Katze.assert_str_equal (data, dial_data.keyfile.get_string ("Dial 1", "title"), "Lorem"); - dial_data.save_message ("speed_dial-save-rename 1 Lorem Ipsum Dolomit"); - Katze.assert_str_equal (data, dial_data.keyfile.get_string ("Dial 1", "title"), "Lorem Ipsum Dolomit"); - dial_data.save_message ("speed_dial-save-delete 1"); - Katze.assert_str_equal (data, dial_data.get_next_free_slot (), "Dial 1"); + try { + dial_data.save_message ("speed_dial-save-rename 1 Lorem"); + Katze.assert_str_equal (data, dial_data.keyfile.get_string ("Dial 1", "title"), "Lorem"); + dial_data.save_message ("speed_dial-save-rename 1 Lorem Ipsum Dolomit"); + Katze.assert_str_equal (data, dial_data.keyfile.get_string ("Dial 1", "title"), "Lorem Ipsum Dolomit"); + dial_data.save_message ("speed_dial-save-delete 1"); + Katze.assert_str_equal (data, dial_data.get_next_free_slot (), "Dial 1"); + } catch (Error message_error) { + GLib.error (message_error.message); + } data = get_test_file (""" [settings] @@ -79,9 +87,13 @@ static void speeddial_load () { """); dial_data = new Midori.SpeedDial (data, ""); FileUtils.remove (data); - Katze.assert_str_equal (data, dial_data.get_next_free_slot (), "Dial 1"); - dial_data.save_message ("speed_dial-save-swap 2 4"); - Katze.assert_str_equal (data, dial_data.keyfile.get_string ("Dial 2", "title"), "IT-News"); + try { + Katze.assert_str_equal (data, dial_data.get_next_free_slot (), "Dial 1"); + dial_data.save_message ("speed_dial-save-swap 2 4"); + Katze.assert_str_equal (data, dial_data.keyfile.get_string ("Dial 2", "title"), "IT-News"); + } catch (Error message_error) { + GLib.error (message_error.message); + } } void main (string[] args) { diff --git a/tests/tab.vala b/tests/tab.vala index 5018a25b..d23486fc 100644 --- a/tests/tab.vala +++ b/tests/tab.vala @@ -91,21 +91,21 @@ void tab_special () { tab.set_uri ("about:blank"); do { loop.iteration (true); } while (tab.load_status != Midori.LoadStatus.FINISHED); assert (tab.is_blank ()); - assert (!tab.can_view_source ()); + assert (tab.can_view_source ()); assert (tab.special); assert (!tab.can_save ()); tab.set_uri ("about:private"); do { loop.iteration (true); } while (tab.load_status != Midori.LoadStatus.FINISHED); assert (tab.is_blank ()); - assert (!tab.can_view_source ()); + assert (tab.can_view_source ()); assert (tab.special); assert (!tab.can_save ()); tab.set_uri ("http://.invalid"); do { loop.iteration (true); } while (tab.load_status != Midori.LoadStatus.FINISHED); assert (!tab.is_blank ()); - assert (!tab.can_view_source ()); + assert (tab.can_view_source ()); assert (tab.special); assert (!tab.can_save ()); @@ -206,15 +206,15 @@ void tab_http () { source.web_view.load_uri (test_url); do { loop.iteration (true); } while (source.load_status != Midori.LoadStatus.FINISHED); assert (!source.is_blank ()); - assert (!source.can_view_source ()); + /* FIXME assert (!source.can_view_source ()); */ assert (!source.special); /* FIXME assert (source.can_save ()); */ - assert (source.view_source); + /* FIXME assert (source.view_source); */ source.set_uri ("http://.invalid"); do { loop.iteration (true); } while (source.load_status != Midori.LoadStatus.FINISHED); assert (!source.is_blank ()); - assert (!source.can_view_source ()); + assert (source.can_view_source ()); assert (source.special); assert (!source.can_save ()); assert (!source.view_source); @@ -259,6 +259,36 @@ void tab_download_dialog () { assert (!did_request_download); } +void tab_scroll () { + /* ensure that no scrolls occur due to error iframes */ + var markup = "<style>p{height: 90%}</style><p></p><iframe src=\"http://.invalid/\" height=\"90%\"/>"; + Midori.Test.grab_max_timeout (); + + Midori.Test.idle_timeouts (); + Midori.Test.log_set_fatal_handler_for_icons (); + var browser = new Midori.Browser (); + var settings = new Midori.WebSettings (); + browser.set ("settings", settings); + var loop = MainContext.default (); + do { loop.iteration (true); } while (loop.pending ()); + for (var i = 0 ; i < 7; i++) { + var tab = browser.add_uri ("data:text/html;charset=utf-8;base64," + + GLib.Base64.encode (markup.data)) as Midori.Tab; + #if HAVE_GTK3 + var vadj = (tab.web_view as Gtk.Scrollable).get_vadjustment (); + #else + var vadj = (tab.web_view.get_parent () as Gtk.ScrolledWindow).get_vadjustment (); + #endif + vadj.value_changed.connect ((vadj) => { + assert(vadj.get_value () == vadj.get_lower ()); + }); + do { loop.iteration (true); } while (tab.progress != 0.0); + browser.close_tab (tab as Midori.View); + } + + Midori.Test.release_max_timeout (); +} + void main (string[] args) { Test.init (ref args); Midori.App.setup (ref args, null); @@ -274,6 +304,7 @@ void main (string[] args) { Test.add_func ("/tab/http", tab_http); Test.add_func ("/tab/movement", tab_movement); Test.add_func ("/tab/download", tab_download_dialog); + Test.add_func ("/tab/scroll", tab_scroll); Test.run (); } diff --git a/tests/wscript_build b/tests/wscript_build deleted file mode 100644 index 21c5c4ca..00000000 --- a/tests/wscript_build +++ /dev/null @@ -1,59 +0,0 @@ -#! /usr/bin/env python -# WAF build script for midori -# This file is licensed under the terms of the expat license, see the file EXPAT. - -import os -import sys -import Utils - -tests = os.listdir ('tests') -for test in tests: - folder = 'tests' + os.sep + test - if os.path.isdir (folder): - files = os.listdir (folder) - target = test - source = '' - for fila in files: - if fila[-2:] == '.c' or fila[-5:] == '.vala': - source += ' ' + test + os.sep + fila - if not source: - Utils.pprint ('RED', folder + ': No source files found') - sys.exit (1) - - elif test[-3:] == '.py' or test[-3:] == '.sh': - obj = bld.new_task_gen ('command-output') - obj.no_inputs = obj.no_outputs = obj.command_is_external = True - obj.command = ['python', 'sh'][test[-3:] == '.sh'] - os.environ['SRCDIR'] = os.getcwd () - os.environ['BLDDIR'] = '_build' - obj.argv = [os.path.join (os.getcwd (), folder)] - continue - elif test[-2:] == '.c': - target = test[:-2] - source = test - elif test[-5:] == '.vala': - target = test[:-5] - source = test - else: - Utils.pprint ('YELLOW', folder + ': Skipped') - continue - - obj = bld.new_task_gen ('cc', 'program') - obj.target = 'test-' + target - obj.includes = '.. ../midori ../panels' - obj.source = source - if 'vala' in source: - obj.env.append_value ('CCFLAGS', '-w') - obj.vapi_dirs = '../midori ../katze' - obj.packages = 'glib-2.0 gio-2.0 libsoup-2.4 sqlite3 katze midori midori-core' - if bld.env['HAVE_GTK3']: - obj.packages += ' gtk+-3.0' - else: - obj.packages += ' gtk+-2.0' - if bld.env['HAVE_WEBKIT2']: - obj.packages += ' webkit2gtk-3.0' - else: - obj.packages += ' webkitgtk-3.0' - obj.uselib = 'UNIQUE LIBSOUP GIO GTK SQLITE WEBKIT LIBXML GRANITE ZEITGEIST' - obj.uselib_local = 'midori-c' - obj.unit_test = 1 diff --git a/tools/midori-dev b/tools/midori-dev index e7e36066..6da645d5 100755 --- a/tools/midori-dev +++ b/tools/midori-dev @@ -41,7 +41,7 @@ fi case $CMD in bzr) - exec ./waf build --run "$@" >& $LOG + exec _build/midori/midori "$@" >& $LOG ;; gdb) gdb $BIN core diff --git a/tools/release b/tools/release index e4a890e0..6c12039d 100755 --- a/tools/release +++ b/tools/release @@ -9,11 +9,11 @@ # # See the file COPYING for the full license text. -OLDVER=$(grep --color=no 'VERSION = VERSION_FULL = ' wscript | sed -r "s@.+ = '(.+)'@\1@") +OLDVER=$(grep -r --color=no '^set(VERSION' CMakeLists.txt | sed -r "s@.+ ([0-9.]+)\)@\1@") NEWVER=$(python -c "print('0.'+str(float('$OLDVER'[2:])+.1))") if [ "x$1" = "xbefore" ]; then echo Bumping from $OLDVER to $NEWVER - sed -i "s@$OLDVER@$NEWVER@g" wscript win32/makedist/midori.nsi + sed -i "s@$OLDVER@$NEWVER@g" CMakeLists.txt win32/makedist/midori.nsi echo; echo v$NEWVER:; bzr log --line -rtag:$OLDVER.. | sed -r 's@.+2013-[0-9]+-[0-9]+ @@' | sed 's@\[merge\] @@' | grep -v -E 'l10n|makedist|tools(/release)?: |nsi|translation|Bump version to|Merge lp:midori|POTFILES.in'; echo curl http://wiki.xfce.org/_export/raw/midori/contribute | \ sed -r 's@\[\[([^|]+)\|([^]]+)\]\]@\1 \2@g' | \ @@ -22,6 +22,7 @@ if [ "x$1" = "xbefore" ]; then sed 's@This is a list of frequently asked questions@This is <a href="http://wiki.xfce.org/midori/faq">a snapshot of the online FAQ</a>@g' | \ sed 's@<link rel="style.*>@<link rel="stylesheet" href="faq.css" />@g' > data/faq.html elif [ "x$1" = "xafter" ]; then + NEWVER=$OLDVER echo -n bzr commit -p -m "'Bump version to $NEWVER'" case $SHELL in *fish*) Binary files differdiff --git a/win32/makedist/makedist.midori b/win32/makedist/makedist.midori index 68c74601..9f25b51a 100755 --- a/win32/makedist/makedist.midori +++ b/win32/makedist/makedist.midori @@ -23,6 +23,7 @@ # a bit of configuration root_dir=$MINGW_PREFIX +where_am_i=$PWD if [ "$GSTREAMER_API_VERSION" == "" ]; then GSTREAMER_API_VERSION=0.10 @@ -39,8 +40,14 @@ temp_dir=`mktemp -d` # check if we can use 7zip have_7zip=`which 7za` -grep -q gtk-3.0 _build/config.log && GTK3_BUILD=1 -version=`grep PACKAGE_VERSION _build/default/config.h | awk '{ print $3 $4; }' | sed 's@(debug)@-debug@g'|sed 's@"@@g'` +GTK3_BUILD=1 +# Default to gtk3 but check just in case +GTK3=$(grep GTK3 CMakeCache.txt | awk -F \= '{print $2}') +if [ "$GTK3" != "ON" ] && [ "$GTK3" != "1" ];then + GTK3_BUILD=0 +fi + +version=$(grep PACKAGE_VERSION ./midori/CMakeFiles/midori.dir/DependInfo.cmake|sed -e 's/^.*PACKAGE_VERSION=\\"\([^"]*\)\\".*$/\1/') #strip sha from version if release if [ "$RELEASE" != "" ];then @@ -71,9 +78,8 @@ else fi if [ "NSIS" != "" ];then - where_am_i=$PWD - cp -a $where_am_i/win32/makedist/midori.nsi $temp_dir - cp -a $where_am_i/win32/makedist/midori.ico $temp_dir + cp -a $where_am_i/../win32/makedist/midori.nsi $temp_dir + cp -a $where_am_i/../win32/makedist/midori.ico $temp_dir fi # function: dll-recursive <list of exe and dll files ...> @@ -119,6 +125,32 @@ grab_files () popd > /dev/null } +grab_icons() +{ + local theme="$1" + local list="$2" + + sizes=$(grep CreateDirectory $list |awk -F '"' '{print $2}' |awk -F '\' '{print $6}') + categories=$(grep InstallIconTheme $list | awk -F '"' '{print $2}'|sort|uniq) + + + for category in $categories + do + category_icons=$(grep InstallIconTheme $list |grep $category|awk -F '"' '{print $4}') + for size in $sizes + do + mkdir -p $workdir/share/icons/$theme/$category/$size + for icon in $category_icons + do + cp -L /usr/share/icons/$theme/$category/$size/$icon.* $workdir/share/icons/$theme/$category/$size/ + done + done + done + + cp -L /usr/share/icons/$theme/index.theme $workdir/share/icons/$theme + +} + echo "Creating $ARCHIVE" # create destination folder @@ -132,10 +164,19 @@ pushd $root_dir/bin > /dev/null dll_recursive midori*.exe gspawn-*-helper*.exe libhunspell*.dll > $temp_dir/midori.exe.lst dll_recursive ../lib/gio/modules/*.dll >> $temp_dir/midori.exe.lst dll_recursive iconv.dll >> $temp_dir/midori.exe.lst -dll_recursive ../lib/gstreamer-$GSTREAMER_API_VERSION/*.dll >> $temp_dir/midori.exe.lst # we ship gdb now for -g and diagnostic button dll_recursive gdb.exe >> $temp_dir/midori.exe.lst +for i in $(cat $temp_dir/midori.exe.lst | grep -v midori | sort | uniq) +do + if [ -f $root_dir/bin/$i ]; then + rpm -qf $root_dir/bin/$i >> $temp_dir/packages_used.lst + fi +done + +dll_recursive ../lib/gstreamer-$GSTREAMER_API_VERSION/*.dll >> $temp_dir/midori.exe.lst +rpm -qf $root_dir/lib/gstreamer-$GSTREAMER_API_VERSION/*.dll >> $temp_dir/packages_used.lst + if [ "$DEBUG_BUILD" != "" ]; then dll_recursive GtkLauncher.exe >> $temp_dir/midori.exe.lst fi @@ -197,17 +238,19 @@ echo "<*> Copying resources and translations..." # copy share grab_files share midori -grab_files share icons grab_files share mime grab_files share midori.mo +grab_icons Faenza $where_am_i/../win32/makedist/midori.nsi + # We need to ship our CA bundle for now cp -a /etc/pki/tls/certs/ca-bundle.crt $workdir/share/midori/res/ if [ "$GTK3_BUILD" == "1" ]; then grab_files share webkitgtk-3.0 grab_files share schemas - grab_files share/themes/Greybird/ gtk-3.0 + mkdir -p $workdir/share/themes/Greybird + cp -Lr /usr/share/themes/Greybird/gtk-3.0 $workdir/share/themes/Greybird MO_VER=30 else grab_files share MS-Windows @@ -221,6 +264,10 @@ if [ "$DEBUG_BUILD" == "" ];then popd > /dev/null fi +rpm -qf /etc/pki/tls/certs/ca-bundle.crt >> $temp_dir/packages_used.lst +rpm -qf /usr/share/icons/Faenza/ >> $temp_dir/packages_used.lst +rpm -qf /usr/share/themes/Greybird/gtk-3.0 >> $temp_dir/packages_used.lst + # copy locales for gtk # so we have translated stock items, file dialogs @@ -266,6 +313,20 @@ gtk-toolbar-style = GTK_TOOLBAR_ICONS gtk-toolbar-icon-size = GTK_ICON_SIZE_MENU _EOF +mkdir -p $workdir/etc/xdg/midori + +cat >> $workdir/etc/xdg/midori/config << _EOF +[settings] +default-font-family=Times New Roman +monospace-font-family=Courier New +default-font-size=14 +default-monospace-font-size=14 +_EOF + +# Don't hardcode mingw path, otherwise fontconfig uses fallback settings +# which tend to look very bad on Windows +sed -r 's@>.+(conf\.d)<@>\1@g' -i $workdir/etc/fonts/fonts.conf + popd > /dev/null echo "<*> Copying docs..." @@ -273,6 +334,8 @@ echo "<*> Copying docs..." # copy doc files to root cp -L $workdir/share/doc/midori/{COPYING,AUTHORS} $workdir +cat $temp_dir/packages_used.lst | sort | uniq > $workdir/share/doc/midori/README.packages +rm $temp_dir/packages_used.lst #drop a/la files, we don't do static builds anyway find $workdir -iname *.*a -exec rm {} \; @@ -291,7 +354,7 @@ fi if [ "$NSIS" != "" ];then nsis_file=Midori-${version}_setup.exe echo "Creating $nsis_file" - makensis -NOCD -V2 ./midori.nsi + makensis -NOCD -V4 ./midori.nsi mv $nsis_file $where_am_i fi popd > /dev/null diff --git a/win32/makedist/midori.nsi b/win32/makedist/midori.nsi index 0f914f47..66626c61 100644 --- a/win32/makedist/midori.nsi +++ b/win32/makedist/midori.nsi @@ -21,7 +21,7 @@ RequestExecutionLevel admin ; set execution level for Windows Vista ; helper defines ; ;;;;;;;;;;;;;;;;;;; !define PRODUCT_NAME "Midori" -!define PRODUCT_VERSION "0.5.5" +!define PRODUCT_VERSION "0.5.7" !define PRODUCT_BUILD "0" !define PRODUCT_VERSION_ID "${PRODUCT_VERSION}.${PRODUCT_BUILD}" !define PRODUCT_PUBLISHER "Christian Dywan" @@ -136,38 +136,26 @@ Section "!Program Files" SEC01 CreateShortCut "$SMPROGRAMS\$StartmenuFolder\Midori.lnk" "${PRODUCT_EXE}" !insertmacro MUI_STARTMENU_WRITE_END -!macro InstallIconThemeRenameSmall OPath IPath - File "/oname=16x16\${OPath}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\16x16\${IPath}.png" - File "/oname=22x22\${OPath}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\22x22\${IPath}.png" - File "/oname=24x24\${OPath}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\24x24\${IPath}.png" - File /nonfatal "/oname=32x32\${OPath}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\32x32\${IPath}.png" -!macroend - -!macro InstallIconThemeRename OPath IPath - !insertmacro InstallIconThemeRenameSmall ${OPath} ${IPath} - File /nonfatal "/oname=48x48\${OPath}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\48x48\${IPath}.png" - File /nonfatal "/oname=scalable\${OPath}.svg" "${RESOURCEDIR}\share\icons\${ICON_THEME}\scalable\${IPath}.svg" -!macroend - -!macro InstallIconThemeSmall IconPath - !insertmacro InstallIconThemeRenameSmall ${IconPath} ${IconPath} -!macroend - -!macro InstallIconTheme IconPath - !insertmacro InstallIconThemeRename ${IconPath} ${IconPath} +!macro InstallIconTheme ICat IName + File "/oname=${ICat}\16\${IName}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\${ICat}\16\${IName}.png" + File "/oname=${Icat}\22\${IName}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\${ICat}\22\${IName}.png" + File "/oname=${Icat}\24\${IName}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\${ICat}\24\${IName}.png" + File /nonfatal "/oname=${ICat}\32\${IName}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\${ICat}\32\${IName}.png" + File /nonfatal "/oname=${ICat}\48\${IName}.png" "${RESOURCEDIR}\share\icons\${ICON_THEME}\${ICat}\48\${IName}.png" + File /nonfatal "/oname=${ICat}\scalable\${IName}.svg" "${RESOURCEDIR}\share\icons\${ICON_THEME}\${ICat}\scalable\${IName}.svg" !macroend !macro CreateIconThemeSectionsSmall SectionPath - CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\16x16\${SectionPath}" - CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\22x22\${SectionPath}" - CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\24x24\${SectionPath}" - CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\32x32\${SectionPath}" + CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\${SectionPath}\16" + CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\${SectionPath}\22" + CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\${SectionPath}\24" + CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\${SectionPath}\32" !macroend !macro CreateIconThemeSections SectionPath !insertmacro CreateIconThemeSectionsSmall ${SectionPath} - CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\48x48\${SectionPath}" - CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\scalable\${SectionPath}" + CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\${SectionPath}\48" + CreateDirectory "$INSTDIR\share\icons\${ICON_THEME}\${SectionPath}\scalable" !macroend SetOutPath "$INSTDIR\share\icons\${ICON_THEME}" @@ -181,93 +169,93 @@ Section "!Program Files" SEC01 !insertmacro CreateIconThemeSections "places" !insertmacro CreateIconThemeSections "status" - !insertmacro InstallIconTheme "actions\bookmark-new" - !insertmacro InstallIconTheme "actions\document-open" - !insertmacro InstallIconTheme "actions\document-open-recent" - !insertmacro InstallIconTheme "actions\document-print" - !insertmacro InstallIconTheme "actions\document-properties" - !insertmacro InstallIconTheme "actions\document-save-as" - !insertmacro InstallIconTheme "actions\document-save" - !insertmacro InstallIconTheme "actions\edit-clear" - !insertmacro InstallIconTheme "actions\edit-copy" - !insertmacro InstallIconTheme "actions\edit-cut" - !insertmacro InstallIconTheme "actions\edit-delete" - !insertmacro InstallIconTheme "actions\edit-find" - !insertmacro InstallIconTheme "actions\edit-paste" - !insertmacro InstallIconTheme "actions\edit-redo" - !insertmacro InstallIconTheme "actions\edit-select-all" - !insertmacro InstallIconTheme "actions\edit-undo" - !insertmacro InstallIconTheme "actions\folder-new" - !insertmacro InstallIconTheme "actions\format-indent-more" - !insertmacro InstallIconTheme "actions\go-down" - !insertmacro InstallIconTheme "actions\go-home" - !insertmacro InstallIconTheme "actions\go-jump" - !insertmacro InstallIconTheme "actions\go-next" - !insertmacro InstallIconTheme "actions\go-previous" - !insertmacro InstallIconTheme "actions\go-up" - !insertmacro InstallIconTheme "actions\gtk-cancel" - !insertmacro InstallIconTheme "actions\gtk-edit" - !insertmacro InstallIconTheme "actions\gtk-no" - !insertmacro InstallIconTheme "actions\gtk-ok" - !insertmacro InstallIconTheme "actions\gtk-save" - !insertmacro InstallIconTheme "actions\gtk-yes" - !insertmacro InstallIconTheme "actions\help-about" - !insertmacro InstallIconTheme "actions\help-contents" - !insertmacro InstallIconTheme "actions\list-add" - !insertmacro InstallIconTheme "actions\list-remove" - !insertmacro InstallIconTheme "actions\media-skip-backward" - !insertmacro InstallIconTheme "actions\media-skip-forward" - !insertmacro InstallIconTheme "actions\process-stop" - !insertmacro InstallIconTheme "actions\stop" - !insertmacro InstallIconTheme "actions\tab-new" - !insertmacro InstallIconTheme "actions\tools-check-spelling" - !insertmacro InstallIconTheme "actions\view-fullscreen" - !insertmacro InstallIconTheme "actions\view-refresh" - !insertmacro InstallIconTheme "actions\window-close" - !insertmacro InstallIconTheme "actions\window-new" - !insertmacro InstallIconTheme "actions\zoom-in" - !insertmacro InstallIconTheme "actions\zoom-out" - - #!insertmacro InstallIconThemeSmall "animations\process-working" - - !insertmacro InstallIconTheme "apps\internet-news-reader" - !insertmacro InstallIconTheme "apps\midori" - !insertmacro InstallIconTheme "apps\preferences-desktop-theme" - !insertmacro InstallIconTheme "apps\web-browser" - - !insertmacro InstallIconTheme "categories\gtk-preferences" - - !insertmacro InstallIconTheme "devices\drive-harddisk" - !insertmacro InstallIconTheme "devices\media-optical-dvd-rom" - - !insertmacro InstallIconTheme "mimetypes\application-x-shockwave-flash" - !insertmacro InstallIconTheme "mimetypes\extension" - !insertmacro InstallIconTheme "mimetypes\gtk-file" - !insertmacro InstallIconTheme "mimetypes\image-x-generic" - !insertmacro InstallIconTheme "mimetypes\package" - !insertmacro InstallIconTheme "mimetypes\text-html" - !insertmacro InstallIconTheme "mimetypes\text-x-generic" - !insertmacro InstallIconTheme "mimetypes\text-x-javascript" - - !insertmacro InstallIconTheme "places\folder-documents" - !insertmacro InstallIconTheme "places\folder-downloads" - !insertmacro InstallIconTheme "places\folder-music" - !insertmacro InstallIconTheme "places\folder-pictures" - !insertmacro InstallIconTheme "places\folder" - !insertmacro InstallIconTheme "places\folder-videos" - !insertmacro InstallIconTheme "places\inode-directory" - !insertmacro InstallIconTheme "places\user-bookmarks" - !insertmacro InstallIconTheme "places\user-desktop" - !insertmacro InstallIconTheme "places\user-home" - !insertmacro InstallIconTheme "places\user-trash" - - !insertmacro InstallIconTheme "status\dialog-password" - !insertmacro InstallIconTheme "status\gtk-dialog-error" - !insertmacro InstallIconTheme "status\gtk-dialog-info" - !insertmacro InstallIconTheme "status\gtk-dialog-warning" - !insertmacro InstallIconTheme "status\locked" - !insertmacro InstallIconTheme "status\network-error" - !insertmacro InstallIconTheme "status\network-idle" + !insertmacro InstallIconTheme "actions" "bookmark-new" + !insertmacro InstallIconTheme "actions" "document-open" + !insertmacro InstallIconTheme "actions" "document-open-recent" + !insertmacro InstallIconTheme "actions" "document-print" + !insertmacro InstallIconTheme "actions" "document-properties" + !insertmacro InstallIconTheme "actions" "document-save-as" + !insertmacro InstallIconTheme "actions" "document-save" + !insertmacro InstallIconTheme "actions" "edit-clear" + !insertmacro InstallIconTheme "actions" "edit-copy" + !insertmacro InstallIconTheme "actions" "edit-cut" + !insertmacro InstallIconTheme "actions" "edit-delete" + !insertmacro InstallIconTheme "actions" "edit-find" + !insertmacro InstallIconTheme "actions" "edit-paste" + !insertmacro InstallIconTheme "actions" "edit-redo" + !insertmacro InstallIconTheme "actions" "edit-select-all" + !insertmacro InstallIconTheme "actions" "edit-undo" + !insertmacro InstallIconTheme "actions" "folder-new" + !insertmacro InstallIconTheme "actions" "format-indent-more" + !insertmacro InstallIconTheme "actions" "go-down" + !insertmacro InstallIconTheme "actions" "go-home" + !insertmacro InstallIconTheme "actions" "go-jump" + !insertmacro InstallIconTheme "actions" "go-next" + !insertmacro InstallIconTheme "actions" "go-previous" + !insertmacro InstallIconTheme "actions" "go-up" + !insertmacro InstallIconTheme "actions" "gtk-cancel" + !insertmacro InstallIconTheme "actions" "gtk-edit" + !insertmacro InstallIconTheme "actions" "gtk-no" + !insertmacro InstallIconTheme "actions" "gtk-ok" + !insertmacro InstallIconTheme "actions" "gtk-save" + !insertmacro InstallIconTheme "actions" "gtk-yes" + !insertmacro InstallIconTheme "actions" "help-about" + !insertmacro InstallIconTheme "actions" "help-contents" + !insertmacro InstallIconTheme "actions" "list-add" + !insertmacro InstallIconTheme "actions" "list-remove" + !insertmacro InstallIconTheme "actions" "media-skip-backward" + !insertmacro InstallIconTheme "actions" "media-skip-forward" + !insertmacro InstallIconTheme "actions" "process-stop" + !insertmacro InstallIconTheme "actions" "stop" + !insertmacro InstallIconTheme "actions" "tab-new" + !insertmacro InstallIconTheme "actions" "tools-check-spelling" + !insertmacro InstallIconTheme "actions" "view-fullscreen" + !insertmacro InstallIconTheme "actions" "view-refresh" + !insertmacro InstallIconTheme "actions" "window-close" + !insertmacro InstallIconTheme "actions" "window-new" + !insertmacro InstallIconTheme "actions" "zoom-in" + !insertmacro InstallIconTheme "actions" "zoom-out" + + #!insertmacro InstallIconThemeSmall "animations" "process-working" + + !insertmacro InstallIconTheme "apps" "internet-news-reader" + !insertmacro InstallIconTheme "apps" "midori" + !insertmacro InstallIconTheme "apps" "preferences-desktop-theme" + !insertmacro InstallIconTheme "apps" "web-browser" + + !insertmacro InstallIconTheme "categories" "gtk-preferences" + + !insertmacro InstallIconTheme "devices" "drive-harddisk" + !insertmacro InstallIconTheme "devices" "media-optical-dvd-rom" + + !insertmacro InstallIconTheme "mimetypes" "application-x-shockwave-flash" + !insertmacro InstallIconTheme "mimetypes" "extension" + !insertmacro InstallIconTheme "mimetypes" "gtk-file" + !insertmacro InstallIconTheme "mimetypes" "image-x-generic" + !insertmacro InstallIconTheme "mimetypes" "package" + !insertmacro InstallIconTheme "mimetypes" "text-html" + !insertmacro InstallIconTheme "mimetypes" "text-x-generic" + !insertmacro InstallIconTheme "mimetypes" "text-x-javascript" + + !insertmacro InstallIconTheme "places" "folder-documents" + !insertmacro InstallIconTheme "places" "folder-downloads" + !insertmacro InstallIconTheme "places" "folder-music" + !insertmacro InstallIconTheme "places" "folder-pictures" + !insertmacro InstallIconTheme "places" "folder" + !insertmacro InstallIconTheme "places" "folder-videos" + !insertmacro InstallIconTheme "places" "inode-directory" + !insertmacro InstallIconTheme "places" "user-bookmarks" + !insertmacro InstallIconTheme "places" "user-desktop" + !insertmacro InstallIconTheme "places" "user-home" + !insertmacro InstallIconTheme "places" "user-trash" + + !insertmacro InstallIconTheme "status" "dialog-password" + !insertmacro InstallIconTheme "status" "gtk-dialog-error" + !insertmacro InstallIconTheme "status" "gtk-dialog-info" + !insertmacro InstallIconTheme "status" "gtk-dialog-warning" + !insertmacro InstallIconTheme "status" "locked" + !insertmacro InstallIconTheme "status" "network-error" + !insertmacro InstallIconTheme "status" "network-idle" SectionEnd @@ -287,6 +275,8 @@ SectionEnd Section "Desktop Shortcuts" SEC03 SectionIn 1 + # CreateShortCut implicitly sets content of OUTDIR as working directory for shortcut, set it to bin + SetOutPath "$INSTDIR\bin" CreateShortCut "$DESKTOP\Midori.lnk" "${PRODUCT_EXE}" CreateShortCut "$QUICKLAUNCH\Midori.lnk" "${PRODUCT_EXE}" SectionEnd diff --git a/win32/makedist/win32-release b/win32/makedist/win32-release index b25c3307..497930d4 100755 --- a/win32/makedist/win32-release +++ b/win32/makedist/win32-release @@ -10,44 +10,54 @@ # See the file COPYING for the full license text. -version=$(grep --color=no 'VERSION = VERSION_FULL = ' wscript | sed -r "s@.+ = '(.+)'@\1@") dropbox_dir=$HOME/Dropbox/Public +SRCDIR=$PWD # 32-bit build #mingw32-env export MINGW_PREFIX="/usr/i686-w64-mingw32/sys-root/mingw" eval `rpm --eval %{mingw32_env}` -PKG_CONFIG_PATH="$MINGW_PREFIX/lib/pkgconfig/" ./configure --prefix=$MINGW_PREFIX --enable-gtk3 -make clean +rm -fr _mingw32 +mkdir _mingw32 && cd _mingw32 +mingw32-cmake -DUSE_ZEITGEIST=0 -DUSE_GTK3=1 -DCMAKE_INSTALL_PREFIX=$MINGW_PREFIX -DCMAKE_VERBOSE_MAKEFILE=0 $SRCDIR +make sudo make install || exit -rpmquery -qa mingw32* > midori-${version}-deps-i686.txt -rm -f midori-$version.sha1 -MINGW_PREFIX=${MINGW_PREFIX} RELEASE=1 NSIS=1 ./win32/makedist/makedist.midori +version=$(grep set\(VERSION $SRCDIR/CMakeLists.txt|head -n1|sed -e 's/^.*set(VERSION \([0-9.]*\)).*$/\1/') + +rpmquery -qa mingw32* > $SRCDIR/midori-${version}-deps-i686.txt +rm -f $SRCDIR/midori-$version.sha1 + +MINGW_PREFIX=${MINGW_PREFIX} RELEASE=1 NSIS=1 $SRCDIR/win32/makedist/makedist.midori mv -v midori-${version}.7z $dropbox_dir mv -v Midori-${version}_setup.exe $dropbox_dir -dropbox puburl $dropbox_dir/midori-${version}.7z > release_links.txt -dropbox puburl $dropbox_dir/Midori-${version}_setup.exe >> release_links.txt +dropbox puburl $dropbox_dir/midori-${version}.7z > $SRCDIR/release_links.txt +dropbox puburl $dropbox_dir/Midori-${version}_setup.exe >> $SRCDIR/release_links.txt if [ "$DO_64BIT" != "" ]; then + cd $SRCDIR # 64-bit build #mingw64-env export MINGW_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw" eval `rpm --eval %{mingw64_env}` - PKG_CONFIG_PATH="$MINGW_PREFIX/lib/pkgconfig/" ./configure --prefix=$MINGW_PREFIX --enable-gtk3 - make clean + rm -fr _mingw64 + mkdir _mingw64 && cd _mingw64 + mingw64-cmake -DUSE_ZEITGEIST=0 -DUSE_GTK3=1 -DCMAKE_INSTALL_PREFIX=$MINGW_PREFIX -DCMAKE_VERBOSE_MAKEFILE=0 $SRCDIR + make sudo make install || exit - rpmquery -qa mingw64* > midori-${version}-deps-x86_64.txt - MINGW_PREFIX=${MINGW_PREFIX} RELEASE=1 sh ./win32/makedist/makedist.midori x86_64-portable + rpmquery -qa mingw64* > $SRCDIR/midori-${version}-deps-x86_64.txt + MINGW_PREFIX=${MINGW_PREFIX} RELEASE=1 sh $SRCDIR/win32/makedist/makedist.midori x86_64-portable mv -v midori-${version}-x86_64-portable.7z $dropbox_dir - dropbox puburl $dropbox_dir/midori-${version}-x86_64-portable.7z >> release_links.txt + dropbox puburl $dropbox_dir/midori-${version}-x86_64-portable.7z >> $SRCDIR/release_links.txt fi +cd $SRCDIR + echo echo "=============================" echo "Midori win32 release details:" diff --git a/win32/README_OPENSUSE_MINGW.txt b/win32/old/README_OPENSUSE_MINGW.txt index ed8a59ad..ed8a59ad 100644 --- a/win32/README_OPENSUSE_MINGW.txt +++ b/win32/old/README_OPENSUSE_MINGW.txt diff --git a/win32/x86-mingw32-opensuse/crossconfig.sh b/win32/old/x86-mingw32-opensuse/crossconfig.sh index 169c0940..169c0940 100755 --- a/win32/x86-mingw32-opensuse/crossconfig.sh +++ b/win32/old/x86-mingw32-opensuse/crossconfig.sh diff --git a/win32/x86-mingw32-opensuse/install.sh b/win32/old/x86-mingw32-opensuse/install.sh index e9993311..e9993311 100755 --- a/win32/x86-mingw32-opensuse/install.sh +++ b/win32/old/x86-mingw32-opensuse/install.sh diff --git a/win32/x86-mingw32-opensuse/packages.list b/win32/old/x86-mingw32-opensuse/packages.list index 31c57f36..31c57f36 100644 --- a/win32/x86-mingw32-opensuse/packages.list +++ b/win32/old/x86-mingw32-opensuse/packages.list diff --git a/wscript b/wscript deleted file mode 100644 index 2b97afce..00000000 --- a/wscript +++ /dev/null @@ -1,674 +0,0 @@ -#! /usr/bin/env python -# WAF build script for midori -# This file is licensed under the terms of the expat license, see the file EXPAT. - -import sys - -# Waf version check, for global waf installs -try: - from Constants import WAFVERSION -except: - WAFVERSION='1.0.0' -if WAFVERSION[:3] != '1.5': - print ('Incompatible Waf, use 1.5') - sys.exit (1) - -import Build -import Options -import Utils -import pproc as subprocess -import os -try: - import UnitTest -except: - import unittestw as UnitTest -import Task -from TaskGen import extension, feature, taskgen -import misc -from Configure import find_program_impl - -APPNAME = 'midori' -VERSION = VERSION_FULL = '0.5.5' -VERSION_SUFFIX = ' (%s)' % VERSION - -try: - if os.path.isdir ('.git'): - git = Utils.cmd_output (['git', 'describe'], silent=True) - if git: - VERSION_FULL = git.strip () - elif os.path.isdir ('.bzr'): - bzr = Utils.cmd_output (['bzr', 'revno'], silent=True) - if bzr: - VERSION_FULL = '%s~r%s' % (VERSION, bzr.strip ()) - else: - folder = os.getcwd () - if VERSION in folder: - VERSION_FULL = os.path.basename (folder) - if VERSION in VERSION_FULL: - VERSION_SUFFIX = VERSION_FULL.replace (VERSION, '') -except: - pass - -srcdir = '.' -blddir = '_build' # recognized by ack - -def option_enabled (option): - if getattr (Options.options, 'enable_' + option): - return True - if getattr (Options.options, 'disable_' + option): - return False - return True - -def is_mingw (env): - if 'CC' in env: - cc = env['CC'] - if not isinstance (cc, str): - cc = ''.join (cc) - return cc.find ('mingw') != -1# or cc.find ('wine') != -1 - return False - -def is_win32 (env): - return is_mingw (env) or Options.platform == 'win32' - -# Compile Win32 res files to (resource) object files -def rc_file(self, node): - rctask = self.create_task ('winrc') - rctask.set_inputs (node) - rctask.set_outputs (node.change_ext ('.rc.o')) - self.compiled_tasks.append (rctask) -rc_file = extension ('.rc')(rc_file) -Task.simple_task_type ('winrc', '${WINRC} -o${TGT} ${SRC}', color='BLUE', - before='cc cxx', shell=False) - -def configure (conf): - def option_checkfatal (option, desc): - if hasattr (Options.options, 'enable_' + option): - if getattr (Options.options, 'enable_' + option): - Utils.pprint ('RED', desc + ' N/A') - sys.exit (1) - - def dirname_default (dirname, default, defname=None): - if getattr (Options.options, dirname) == '': - dirvalue = default - else: - dirvalue = getattr (Options.options, dirname) - if not defname: - defname = dirname - conf.define (defname, dirvalue) - return dirvalue - - def check_version (given_version, major, minor, micro): - if '.' in given_version: - given_major, given_minor, given_micro = given_version.split ('.', 2) - if '.' in given_micro: - given_micro, given_pico = given_micro.split ('.', 1) - else: - given_major, given_minor, given_micro = given_version - return int(given_major) > major or \ - int(given_major) == major and int(given_minor) > minor or \ - int(given_major) == major and int(given_minor) == minor and int(given_micro) >= micro - - conf.check_message_custom ('release version', '', VERSION_FULL) - - conf.check_tool ('compiler_cc') - conf.check_tool ('vala') - conf.check_tool ('glib2') - if not check_version (conf.env['VALAC_VERSION'], 0, 16, 0): - Utils.pprint ('RED', 'Vala 0.16.0 or later is required.') - sys.exit (1) - - if option_enabled ('nls'): - conf.check_tool ('intltool') - if not conf.env['INTLTOOL'] and conf.env['POCOM']: - option_checkfatal ('nls', 'localization') - conf.define ('ENABLE_NLS', 0) - else: - conf.define ('ENABLE_NLS', 1) - else: - conf.define ('ENABLE_NLS', 0) - conf.check_message_custom ('nls', '', 'disabled') - - conf.find_program ('rsvg-convert', var='RSVG_CONVERT') - - if is_win32 (conf.env): - conf.find_program ('windres', var='WINRC') - conf.env['platform'] = 'win32' - - # This is specific to cross compiling with mingw - if is_mingw (conf.env) and Options.platform != 'win32': - if not 'AR' in os.environ and not 'RANLIB' in os.environ: - conf.env['AR'] = os.environ['CC'][:-3] + 'ar' - if conf.find_program (os.environ['CC'][:-3] + 'windres', var='WINRC'): - os.environ['WINRC'] = os.environ['CC'][:-3] + 'windres' - Options.platform = 'win32' - # Make sure we don't have -fPIC in the CCFLAGS - conf.env["shlib_CCFLAGS"] = [] - # Adjust file naming - conf.env["shlib_PATTERN"] = 'lib%s.dll' - conf.env['program_PATTERN'] = '%s.exe' - # Use Visual C++ compatible alignment - conf.env.append_value ('CCFLAGS', '-mms-bitfields') - conf.env['staticlib_LINKFLAGS'] = [] - - Utils.pprint ('BLUE', 'Mingw recognized, assuming cross compile.') - - dirname_default ('LIBDIR', os.path.join (conf.env['PREFIX'], 'lib')) - if conf.env['PREFIX'] == '/usr': - dirname_default ('SYSCONFDIR', '/etc') - else: - dirname_default ('SYSCONFDIR', os.path.join (conf.env['PREFIX'], 'etc')) - dirname_default ('DATADIR', os.path.join (conf.env['PREFIX'], 'share'), - # Use MDATADIR because DATADIR is a constant in objidl.h on Windows - 'MDATADIR') - conf.undefine ('DATADIR') - dirname_default ('DOCDIR', os.path.join (conf.env['MDATADIR'], 'doc')) - if not APPNAME in conf.env['DOCDIR']: - conf.env['DOCDIR'] += '/' + APPNAME - conf.define ('DOCDIR', conf.env['DOCDIR']) - - if option_enabled ('apidocs'): - conf.find_program ('gtkdoc-scan', var='GTKDOC_SCAN') - conf.find_program ('gtkdoc-mktmpl', var='GTKDOC_MKTMPL') - conf.find_program ('gtkdoc-mkdb', var='GTKDOC_MKDB') - conf.find_program ('gtkdoc-mkhtml', var='GTKDOC_MKHTML') - if conf.env['GTKDOC_SCAN'] and conf.env['GTKDOC_MKTMPL'] \ - and conf.env['GTKDOC_MKDB'] and conf.env['GTKDOC_MKHTML']: - pass - else: - option_checkfatal ('apidocs', 'API documentation') - else: - conf.check_message_custom ('gtk-doc', '', 'disabled') - - def check_pkg (name, version='', mandatory=True, var=None, args=''): - if not var: - var = name.split ('-')[0].upper () - ver_str = ['',' >= ' + version][version != ''] - def okmsg_ver (kw): - return conf.check_cfg (modversion=name, uselibstore=var) - conf.check_cfg (msg='Checking for ' + name + ver_str, okmsg=okmsg_ver, - package=name, uselib_store=var, args='--cflags --libs ' + args, - atleast_version=version, mandatory=mandatory) - have = conf.env['HAVE_' + var] == 1 - conf.define (var + '_VERSION', ['No', conf.check_cfg (modversion=name, - uselib_store=var, errmsg=name + ver_str + ' not found')][have]) - return have - - if is_win32 (os.environ): - conf.define ('LIBNOTIFY_VERSION', 'No') - conf.check_message_custom ('libnotify', '', 'disabled') - else: - check_pkg ('libnotify', mandatory=True) - conf.define ('HAVE_LIBNOTIFY', [0,1][conf.env['LIBNOTIFY_VERSION'] != 'No']) - - if option_enabled ('granite'): - check_pkg ('granite', '0.2', mandatory=False) - granite = ['N/A', 'yes'][conf.env['HAVE_GRANITE'] == 1] - if granite != 'yes': - option_checkfatal ('granite', 'new notebook, pop-overs') - conf.define ('GRANITE_VERSION', 'No') - else: - conf.env.append_value ('VALAFLAGS', '-D HAVE_GRANITE') - else: - conf.define ('GRANITE_VERSION', 'No') - conf.check_message_custom ('granite', '', 'disabled') - - if option_enabled ('zeitgeist'): - check_pkg ('zeitgeist-1.0', '0.3.14') - else: - conf.check_message_custom ('zeitgeist', '', 'disabled') - - conf.check (lib='m') - check_pkg ('gmodule-2.0') - check_pkg ('gio-2.0', '2.32.3') - - args = '' - if Options.platform == 'win32': - args = '--define-variable=target=win32' - conf.env.append_value ('VALAFLAGS', '-D HAVE_WIN32') - elif sys.platform != 'darwin': - if sys.platform.startswith ('freebsd'): - conf.env.append_value ('VALAFLAGS', '-D HAVE_FREEBSD') - else: - conf.env.append_value ('VALAFLAGS', '-D HAVE_EXECINFO_H') - - check_pkg ('x11') - # Pass /usr/X11R6/include for OpenBSD - conf.check (header_name='X11/extensions/scrnsaver.h', - includes='/usr/X11R6/include', mandatory=False) - conf.check (lib='Xss', libpath='/usr/X11R6/lib', mandatory=False) - - have_gtk3 = option_enabled ('gtk3') or option_enabled ('webkit2') or option_enabled ('granite') - if have_gtk3: - check_pkg ('gtk+-3.0', '3.0.0', var='GTK', mandatory=False) - check_pkg ('gcr-3', '2.32', mandatory=False) - if option_enabled ('webkit2'): - # 2.0.0 matches 1.11.91 API; 1.11.92 > 2.0.0 - check_pkg ('webkit2gtk-3.0', '1.11.91', var='WEBKIT', mandatory=False) - if not conf.env['HAVE_WEBKIT']: - Utils.pprint ('RED', 'WebKit2/ GTK+3 was not found.\n' \ - 'Pass --disable-webkit2 to build without WebKit2.') - sys.exit (1) - conf.define ('HAVE_WEBKIT2', 1) - conf.env.append_value ('VALAFLAGS', '-D HAVE_WEBKIT2') - else: - check_pkg ('webkitgtk-3.0', '1.8.3', var='WEBKIT', mandatory=False) - if not conf.env['HAVE_GTK'] or not conf.env['HAVE_WEBKIT']: - Utils.pprint ('RED', 'GTK+3 was not found.\n' \ - 'Pass --disable-gtk3 to build without GTK+3.') - sys.exit (1) - check_pkg ('javascriptcoregtk-3.0', '1.8.3', args=args) - conf.env.append_value ('VALAFLAGS', '-D HAVE_GTK3') - conf.env.append_value ('VALAFLAGS', '-D HAVE_OFFSCREEN') - conf.env.append_value ('VALAFLAGS', '-D HAVE_DOM') - else: - check_pkg ('gtk+-2.0', '2.24.0', var='GTK') - check_pkg ('webkit-1.0', '1.8.3', args=args) - conf.define ('GCR_VERSION', 'No') - check_pkg ('javascriptcoregtk-1.0', '1.8.3', args=args) - if check_version (conf.env['GTK_VERSION'], 2, 20, 0): - conf.env.append_value ('VALAFLAGS', '-D HAVE_OFFSCREEN') - conf.env['HAVE_GTK3'] = have_gtk3 - conf.env['HAVE_WEBKIT2'] = option_enabled ('webkit2') - - check_pkg ('libsoup-gnome-2.4', '2.27.90', var='LIBSOUP') - if check_version (conf.env['LIBSOUP_VERSION'], 2, 29, 91): - conf.define ('HAVE_LIBSOUP_2_29_91', 1) - if check_version (conf.env['LIBSOUP_VERSION'], 2, 34, 0): - conf.define ('HAVE_LIBSOUP_2_34_0', 1) - conf.env.append_value ('VALAFLAGS', '-D HAVE_LIBSOUP_2_34_0') - if check_version (conf.env['LIBSOUP_VERSION'], 2, 37, 1): - conf.define ('HAVE_LIBSOUP_2_37_1', 1) - - check_pkg ('libxml-2.0', '2.6') - conf.undefine ('LIBXML_VERSION') # Defined in xmlversion.h - check_pkg ('sqlite3', '3.6.19', var='SQLITE') - - # Store options in env, since 'Options' is not persistent - if 'CC' in os.environ: conf.env['CC'] = os.environ['CC'].split() - conf.env['addons'] = option_enabled ('addons') - conf.env['tests'] = option_enabled ('tests') - conf.env['docs'] = option_enabled ('docs') - if 'LINGUAS' in os.environ: conf.env['LINGUAS'] = os.environ['LINGUAS'] - - conf.check (header_name='unistd.h') - conf.define ('HAVE_OSX', int(sys.platform == 'darwin')) - if Options.platform == 'win32': - conf.check (lib='ole32') - conf.check (lib='uuid') - conf.env.append_value ('LINKFLAGS', '-mwindows') - conf.env.append_value ('program_LINKFLAGS', ['-Wl,--out-implib=default/midori/libmidori.a', '-Wl,--export-all-symbols']) - else: - conf.check (header_name='signal.h') - - conf.define ('PACKAGE_NAME', APPNAME) - conf.define ('PACKAGE_BUGREPORT', 'https://bugs.launchpad.net/midori') - conf.define ('GETTEXT_PACKAGE', APPNAME) - - conf.define ('MIDORI_VERSION', VERSION) - major, minor, micro = VERSION.split ('.', 2) - conf.define ('MIDORI_MAJOR_VERSION', int (major)) - conf.define ('MIDORI_MINOR_VERSION', int (minor)) - conf.define ('MIDORI_MICRO_VERSION', int (micro)) - - conf.env.append_value ('CCFLAGS', '-DHAVE_CONFIG_H -include config.h'.split ()) - debug_level = Options.options.debug_level - compiler = conf.env['CC_NAME'] - - if debug_level == 'full': - conf.define ('PACKAGE_VERSION', '%s (debug)' % VERSION_FULL) - conf.env.append_value ('CCFLAGS', '-DMIDORI_VERSION_SUFFIX="%s (debug)"' % VERSION_SUFFIX) - else: - conf.define ('PACKAGE_VERSION', VERSION_FULL) - conf.env.append_value ('CCFLAGS', '-DMIDORI_VERSION_SUFFIX="%s"' % VERSION_SUFFIX) - conf.write_config_header ('config.h') - - if debug_level == 'debug': - conf.env.append_value ('VALAFLAGS', '--debug --enable-deprecated'.split ()) - if compiler == 'gcc': - conf.env.append_value ('CCFLAGS', '-O2 -g -Wall -Wno-deprecated-declarations'.split ()) - elif debug_level == 'full': - conf.env.append_value ('VALAFLAGS', '--debug --enable-checking'.split ()) - if compiler == 'gcc': - conf.env.append_value ('CCFLAGS', - '-O2 -g -Wall -Wextra -DG_ENABLE_DEBUG ' - '-Waggregate-return -Wno-unused-parameter ' - '-Wno-missing-field-initializers ' - '-Wredundant-decls -Wmissing-noreturn ' - '-Wshadow -Wpointer-arith -Wcast-align ' - '-Winline -Wformat-security -fno-common ' - '-Winit-self -Wundef -Wdeclaration-after-statement ' - '-Wmissing-format-attribute -Wnested-externs'.split ()) - conf.env.append_value ('CCFLAGS', '-Wno-unused-variable -Wno-comment'.split ()) - -def set_options (opt): - def add_enable_option (option, desc, group=None, disable=False): - if group == None: - group = opt - option_ = option.replace ('-', '_') - group.add_option ('--enable-' + option, action='store_true', default=False, - help='Enable ' + desc + ' [Default: ' + str (not disable) + ']', - dest='enable_' + option_) - group.add_option ('--disable-' + option, action='store_true', - default=disable, help='Disable ' + desc, dest='disable_' + option_) - - opt.tool_options ('compiler_cc') - opt.get_option_group ('--check-c-compiler').add_option('-d', '--debug-level', - action = 'store', default = 'debug', - help = 'Specify the debugging level. [\'none\', \'debug\', \'full\']', - choices = ['none', 'debug', 'full'], dest = 'debug_level') - opt.tool_options ('gnu_dirs') - opt.parser.remove_option ('--oldincludedir') - opt.parser.remove_option ('--htmldir') - opt.parser.remove_option ('--dvidir') - opt.parser.remove_option ('--pdfdir') - opt.parser.remove_option ('--psdir') - opt.tool_options ('intltool') - opt.add_option ('--run', action='store_true', default=False, - help='Run application after building it', dest='run') - - group = opt.add_option_group ('Localization and documentation', '') - add_enable_option ('nls', 'native language support', group) - group.add_option ('--update-pot', action='store_true', default=False, - help='Update gettext template', dest='update_pot') - group.add_option ('--update-po', action='store_true', default=False, - help='Update all localization files', dest='update_po') - add_enable_option ('docs', 'informational text files', group) - add_enable_option ('apidocs', 'API documentation', group, disable=True) - - group = opt.add_option_group ('Optional features', '') - add_enable_option ('unique', 'single instance support', group, disable=is_win32 (os.environ)) - add_enable_option ('granite', 'new notebook, pop-overs', group, disable=True) - add_enable_option ('addons', 'building of extensions', group) - add_enable_option ('tests', 'install tests', group, disable=True) - add_enable_option ('gtk3', 'GTK+3 and WebKitGTK+3 support', group, disable=True) - add_enable_option ('webkit2', 'WebKit2 support', group, disable=True) - add_enable_option ('zeitgeist', 'Zeitgeist history integration', group, disable=is_win32 (os.environ)) - - # Provided for compatibility - opt.add_option ('--build', help='Ignored') - opt.add_option ('--disable-maintainer-mode', help='Ignored') - -# Taken from Geany's wscript, modified to support LINGUAS variable -def write_linguas_file (self): - linguas = '' - # Depending on Waf version, getcwd() is different - if os.path.exists ('./po'): - podir = './po' - else: - podir = '../po' - if 'LINGUAS' in Build.bld.env: - files = Build.bld.env['LINGUAS'] - for f in files.split (' '): - if os.path.exists (podir + '/' + f + '.po'): - linguas += f + ' ' - else: - files = os.listdir (podir) - for f in files: - if f.endswith ('.po'): - linguas += '%s ' % f[:-3] - f = open (podir + '/LINGUAS', 'w') - f.write ('# This file is autogenerated. Do not edit.\n%s\n' % linguas) - f.close () -write_linguas_file = feature ('intltool_po')(write_linguas_file) - -def build (bld): - if Options.options.update_pot: - os.chdir ('./po') - try: - subprocess.call(['intltool-update', '-p', '-g', APPNAME]) - Utils.pprint ('YELLOW', "Updated gettext template.") - except: - Utils.pprint ('RED', "Failed to update gettext template.") - Utils.pprint ('RED', "Make sure intltool is installed.") - os.chdir ('..') - return - - if Options.options.update_po: - os.chdir('./po') - try: - subprocess.call(['intltool-update', '-r', '-g', APPNAME]) - Utils.pprint ('YELLOW', "Updated translations.") - except: - Utils.pprint ('RED', "Failed to update translations.") - Utils.pprint ('RED', "Make sure intltool is installed.") - os.chdir ('..') - return - - bld.add_group () - - bld.add_subdirs ('midori icons') - bld.add_subdirs ('extensions') - - bld.add_group () - - if bld.env['docs']: - bld.install_files ('${DOCDIR}/', \ - 'AUTHORS COPYING ChangeLog EXPAT README data/faq.html data/faq.css') - - if bld.env['INTLTOOL']: - obj = bld.new_task_gen ('intltool_po') - obj.podir = 'po' - obj.appname = APPNAME - - if bld.env['GTKDOC_SCAN'] and Options.commands['build']: - bld.add_subdirs ('docs/api') - bld.install_files ('${DOCDIR}/api/', blddir + '/docs/api/*') - - for res_file in os.listdir ('data'): - if is_win32 (bld.env): - break - if not '.desktop' in res_file: - continue - desktop = res_file[:-3] - appdir = '${MDATADIR}/applications' - if bld.env['INTLTOOL']: - obj = bld.new_task_gen ('intltool_in') - obj.source = 'data/' + desktop + '.in' - obj.install_path = appdir - obj.flags = ['-d', '-c'] - bld.install_files (appdir, 'data/' + desktop) - else: - folder = os.path.abspath (blddir + '/default/data') - Utils.check_dir (folder) - pre = open ('data/' + desktop + '.in') - after = open (folder + '/' + desktop, 'w') - try: - try: - for line in pre: - if line != '': - if line[0] == '_': - after.write (line[1:]) - else: - after.write (line) - after.close () - Utils.pprint ('BLUE', desktop + '.in -> ' + desktop) - bld.install_files (appdir, folder + '/' + desktop) - except: - Utils.pprint ('BLUE', 'File ' + desktop + ' not generated') - finally: - pre.close () - - if bld.env['RSVG_CONVERT']: - Utils.check_dir (blddir + '/data') - command = bld.env['RSVG_CONVERT'] + \ - ' -o ' + blddir + '/data/logo-shade.png ' + \ - srcdir + '/data/logo-shade.svg' - if not Utils.exec_command (command): - bld.install_files ('${MDATADIR}/' + APPNAME + '/res', blddir + '/data/logo-shade.png') - else: - Utils.pprint ('BLUE', "logo-shade could not be rasterized.") - - for res_file in os.listdir ('data'): - if '.desktop' in res_file or 'faq.' in res_file or 'midori.' in res_file: - continue - dest = '${MDATADIR}/' + APPNAME + '/res' - if (os.path.isdir ('data/' + res_file)): - dest += '/' + res_file - res_file += '/*' - bld.install_files (dest, 'data/' + res_file) - - for config_file in os.listdir ('config'): - dest = '${SYSCONFDIR}/xdg/' + APPNAME - if (os.path.isdir ('config/' + config_file)): - dest += '/' + config_file - for child in os.listdir ('config/' + config_file): - if (os.path.isdir ('config/' + config_file + '/' + child)): - dest += '/' + child - child += '/*' - bld.install_files (dest, 'config/' + config_file + '/' + child) - continue - bld.install_files (dest, 'config/' + config_file) - - if Options.commands['check'] or bld.env['tests']: - bld.add_subdirs ('tests') - - if Options.commands['clean']: - distclean () - -def check (ctx): - # The real work happens in shutdown () - pass - -def distclean (): - if os.path.exists ('po/LINGUAS'): - os.remove ('po/LINGUAS') - -def shutdown (): - if Options.commands['install'] or Options.commands['uninstall']: - dir = Build.bld.get_install_path ('${MDATADIR}/icons/hicolor') - icon_cache_updated = False - if not Options.options.destdir: - # update the pixmap cache directory - try: - command = 'gtk-update-icon-cache -q -f -t %s' % dir - if not Utils.exec_command (command): - Utils.pprint ('YELLOW', "Updated Gtk icon cache.") - icon_cache_updated = True - except: - Utils.pprint ('RED', "Failed to update icon cache.") - if not icon_cache_updated: - Utils.pprint ('YELLOW', "Icon cache not updated. " - "After install, run this:") - Utils.pprint ('YELLOW', "gtk-update-icon-cache -q -f -t %s" % dir) - - elif Options.commands['check']: - def reset_xdg_dirs (): - import tempfile, shutil - base = os.path.join (tempfile.gettempdir (), 'midori-test', '%s') - if os.path.exists (base % ''): - shutil.rmtree (base % '') - for x in ['XDG_CONFIG_HOME', 'XDG_CACHE_HOME', 'XDG_DATA_HOME', 'XDG_RUNTIME_DIR', 'TMPDIR']: - os.environ[x] = (base % x).lower () - Utils.check_dir (os.environ[x]) - - def subprocess_popen_timeout (args, stdout=None, stderr=None): - import threading, signal - def t_kill (): - Utils.pprint ('RED', 'timed out') - os.kill (pp.pid, signal.SIGABRT) - t = threading.Timer (int(os.environ.get ('MIDORI_TIMEOUT', '42')), t_kill) - t.start () - if is_mingw (Build.bld.env): - args.insert (0, 'wine') - cwd = Build.bld.env['PREFIX'] + os.sep + 'bin' - pp = subprocess.Popen (args, cwd=cwd, stdout=stdout, stderr=stderr) - if stdout is None: - (out, err) = pp.communicate () - t.cancel () - return pp - - # Avoid i18n-related false failures - os.environ['LC_ALL'] = 'C' - if is_mingw (Build.bld.env): - os.environ['MIDORI_EXEC_PATH'] = Build.bld.env['PREFIX'] - test = UnitTest.unit_test () - - reset_xdg_dirs () - if True: - test.unit_test_results = {} - for obj in Build.bld.all_task_gen: - if getattr (obj, 'unit_test', '') and 'cprogram' in obj.features: - if 'MIDORI_UNITS' in os.environ and not obj.target.split('-')[1] in os.environ['MIDORI_UNITS']: - continue - output = obj.path - filename = os.path.join (output.abspath (obj.env), obj.target) - srcdir = output.abspath () - label = os.path.join (output.bldpath (obj.env), obj.target) - test.unit_tests[label] = (filename, srcdir) - - Utils.pprint ('GREEN', 'Running the unit tests') - for label in test.unit_tests.allkeys: - filename = test.unit_tests[label][0] - test.unit_test_results[label] = 0 - try: - if is_mingw (Build.bld.env): - filename += '.exe' - args = [filename] - pp = subprocess_popen_timeout (args) - test.unit_test_results[label] = int (pp.returncode == 0) - if not test.unit_test_results[label]: - test.num_tests_failed += 1 - except OSError: - msg = sys.exc_info()[1] # Python 2/3 compatibility - Utils.pprint ('RED', '%s: %s' % (args, msg)) - test.num_tests_err += 1 - except KeyboardInterrupt: - pass - else: - test.want_to_see_test_output = True - test.want_to_see_test_error = True - test.run () - - reset_xdg_dirs () - for label in test.unit_tests.allkeys: - if not test.unit_test_results[label]: - Utils.pprint ('YELLOW', label + '...FAILED') - filename = test.unit_tests[label][0] - try: - if is_mingw (Build.bld.env): - filename += '.exe' - args = ['gdb', '--batch', '-ex', 'set print thread-events off', '-ex', 'run', '-ex', 'bt', filename] - pp = subprocess_popen_timeout (args) - except OSError: - Utils.pprint ('RED', 'Install gdb to see backtraces') - except KeyboardInterrupt: - pass - else: - Utils.pprint ('GREEN', label + '.......OK') - filename = test.unit_tests[label][0] - if is_mingw (Build.bld.env): - filename += '.exe' - if os.environ.get ('MIDORI_TEST') == 'valgrind': - args = ['valgrind', '-q', '--leak-check=no', '--num-callers=4', '--show-possibly-lost=no', '--undef-value-errors=yes', '--track-origins=yes', filename] - elif os.environ.get ('MIDORI_TEST') == 'callgrind': - args = ['valgrind', '--tool=callgrind', '--callgrind-out-file=%s.callgrind' % filename, filename] - else: - continue - try: - pp = subprocess_popen_timeout (args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - skip = False - for line in iter(pp.stdout.readline, ''): - if line[:2] != '==': - continue - if line == '': - skip = False - elif 'Conditional jump or move' in line: - skip = True - elif 'Uninitialised value was created by a stack allocation' in line: - skip = True - elif not skip: - sys.stdout.write (line[9:]) - except OSError: - Utils.pprint ('YELLOW', 'Install valgrind to perform memory checks') - except KeyboardInterrupt: - pass - - if not 'MIDORI_UNITS' in os.environ: - Utils.pprint ('BLUE', 'Set MIDORI_UNITS to select a subset of test cases') - if not 'MIDORI_TEST' in os.environ: - Utils.pprint ('BLUE', 'Set MIDORI_TEST to "valgrind" or "callgrind" to perform memory checks') - if not 'MIDORI_TIMEOUT' in os.environ: - Utils.pprint ('BLUE', 'Set MIDORI_TIMEOUT to set the maximum test runtime (default: 42)') - # if test.num_tests_failed > 0 or test.num_tests_err > 0: - # sys.exit (1) - |