...
 
Commits (65)
3.24.5 - September 29, 2017
===========================
- Fix search engine dialog, which has been borked since 3.24.3 (#787458)
- Don't disable navigation actions when history is cleared (#788329)
- Fix bookmarks import crash when there's no Firefox profile
- Disable emoji chooser in address bar if built with GTK+ >= 3.20.20
- Make json-glib optional (it's only needed for experimental sync support)
3.24.4 - September 3, 2017
==========================
- Fix crash in bookmarks popover (#780549)
- Fix crash when clicking on security icon after deleting address (#785338)
- Disable Alt+Home shortcut for web apps (#785996)
- Adblocker must not block main resource during redirects (#787011)
- Updated translations
3.24.3 - July 17, 2017
======================
- Fix floating status bar blocking clicks (#668493)
- Add [Shift+]Ctrl+Tab shortcuts for switching tabs (#762631)
- Fix crash when download fails (#778653)
- Restore address bar search for bookmarks tags (#781746)
- Fix notifications permissions being forgotten for web apps (#782386)
- Fix tags with no bookmarks appearing in bookmarks popover
- Fix crash if search engine settings get desynced
- Updated translations
3.24.2 - May 8, 2017
====================
- Decode last component of URIs to determine file names for saving (#780086)
- Disable Ctrl+T in application mode (#781440)
- Do not use a popover for the tab selection menu, to allow scrolling it
- Add hidden setting for disabling quirks mode
- Updated translations
3.24.1 - April 10, 2017
=======================
......
......@@ -25,7 +25,8 @@ fi
git submodule update --init --recursive
aclocal --install || exit 1
autoreconf --verbose --force --install || exit 1
intltoolize --force --copy --automake || exit 1
autoreconf --verbose --force --install -Wno-portability || exit 1
cd "$olddir"
if [ "$NOCONFIGURE" = "" ]; then
......
......@@ -28,10 +28,10 @@ AX_REQUIRE_DEFINED([PKG_CHECK_MODULES])
AX_REQUIRE_DEFINED([YELP_HELP_INIT])
dnl Must be a valid git tag
m4_define([epiphany_changelog_start],[3.21.4])
m4_define([epiphany_changelog_start],[3.24.0])
AC_INIT([GNOME Web Browser],[3.24.1],[http://bugzilla.gnome.org/enter_bug.cgi?product=epiphany],[epiphany])
AX_IS_RELEASE([git-directory])
AC_INIT([GNOME Web Browser],[3.24.5],[http://bugzilla.gnome.org/enter_bug.cgi?product=epiphany],[epiphany])
AX_IS_RELEASE([always])
AC_PREREQ([2.69])
......@@ -95,20 +95,19 @@ LIBGD_INIT([_view-common notification static])
LT_LIB_M
GLIB_REQUIRED=2.46.0
GTK_REQUIRED=3.22.0
GTK_REQUIRED=3.18.0
WEBKITGTK_REQUIRED=2.15.90
PKG_CHECK_MODULES([CAIRO], [cairo >= 1.2])
PKG_CHECK_MODULES([GCR], [gcr-3 >= 3.5.5])
PKG_CHECK_MODULES([GDK], [gdk-3.0 >= $GTK_REQUIRED])
PKG_CHECK_MODULES([GDK_PIXBUF], [gdk-pixbuf-2.0 >= 2.36.5])
PKG_CHECK_MODULES([GDK_PIXBUF], [gdk-pixbuf-2.0 >= 2.32.0])
PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= $GLIB_REQUIRED])
PKG_CHECK_MODULES([GLIB], [glib-2.0 >= $GLIB_REQUIRED])
PKG_CHECK_MODULES([GNOME_DESKTOP], [gnome-desktop-3.0 >= 2.91.2])
PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= $GTK_REQUIRED])
PKG_CHECK_MODULES([GTK_UNIX_PRINT], [gtk+-unix-print-3.0 >= $GTK_REQUIRED])
PKG_CHECK_MODULES([ICU_UC], [icu-uc >= 4.6])
PKG_CHECK_MODULES([JSON_GLIB], [json-glib-1.0 >= 1.2.0])
PKG_CHECK_MODULES([LIBNOTIFY], [libnotify >= 0.5.1])
PKG_CHECK_MODULES([LIBSECRET], [libsecret-1 >= 0.14])
PKG_CHECK_MODULES([LIBSOUP], [libsoup-2.4 >= 2.48.0])
......@@ -140,7 +139,8 @@ AC_ARG_ENABLE([firefox-sync],
[enable_firefox_sync=no]
)
AS_IF([test "x$enable_firefox_sync" = "xyes"],
[PKG_CHECK_MODULES([HOGWEED], [hogweed >= 3.2])
[PKG_CHECK_MODULES([JSON_GLIB], [json-glib-1.0 >= 1.2.0])
PKG_CHECK_MODULES([HOGWEED], [hogweed >= 3.2])
PKG_CHECK_MODULES([NETTLE], [nettle >= 3.2])
AC_DEFINE([ENABLE_SYNC], [1], [Define if Firefox Sync support is enabled])]
)
......@@ -183,8 +183,7 @@ else
AC_MSG_ERROR([iso-codes is required])
fi
AM_GNU_GETTEXT([external])
AM_GNU_GETTEXT_VERSION([0.19.8])
IT_PROG_INTLTOOL([0.50.0])
AC_SUBST([GETTEXT_PACKAGE], [epiphany])
# ****************
......
......@@ -4,8 +4,9 @@ desktop_in_files = org.gnome.Epiphany.desktop.in
desktopdir = $(datadir)/applications
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
$(desktop_DATA): $(desktop_in_files)
$(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
@INTLTOOL_SERVER_RULE@
@INTLTOOL_DESKTOP_RULE@
@INTLTOOL_XML_RULE@
gsettings_ENUM_NAMESPACE = org.gnome.Epiphany
gsettings_ENUM_FILES = $(top_srcdir)/lib/ephy-prefs.h
......@@ -17,9 +18,6 @@ appstream_in_files = org.gnome.Epiphany.appdata.xml.in
appstream_XML = $(appstream_in_files:.xml.in=.xml)
@APPSTREAM_XML_RULES@
$(appstream_XML): $(appstream_in_files)
$(AM_V_GEN) $(MSGFMT) --xml --template $< -d $(top_srcdir)/po -o $@
# Dbus service file
servicedir = $(datadir)/dbus-1/services
service_in_files = org.gnome.EpiphanySearchProvider.service.in
......@@ -30,11 +28,16 @@ $(service_DATA): $(service_in_files) Makefile
$(AM_V_GEN) sed -e "s|\@libexecdir[@]|$(libexecdir)|g" $< > $@
# Default bookmarks
# We don't put translations in the resulting rdf since the code can get
# the translations via gettext (although it can also get translations
# from the rdf if they are there and not available via gettext)
default_bookmarksdir = $(pkgdatadir)
default_bookmarks_in_files = default-bookmarks.rdf.in
default_bookmarks_DATA = $(default_bookmarks_in_files:.rdf.in=.rdf)
$(default_bookmarks_DATA): $(default_bookmarks_in_files) Makefile
$(AM_V_GEN) sed -e "s|\@pkgdatadir[@]|$(pkgdatadir)|g" $< > $@
$(default_bookmarks_DATA): $(default_bookmarks_in_files) Makefile $(INTLTOOL_MERGE)
LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@.tmp
sed -e "s|\@pkgdatadir\@|$(pkgdatadir)|g" $@.tmp > $@ || rm -f $@.tmp
rm -f $@.tmp
searchproviderdir = $(datadir)/gnome-shell/search-providers
dist_searchprovider_DATA = epiphany-search-provider.ini
......
......@@ -3,23 +3,23 @@
<component type="desktop">
<id>org.gnome.Epiphany.desktop</id>
<metadata_license>CC0-1.0</metadata_license>
<name>GNOME Web</name>
<summary>Web browser for GNOME</summary>
<_name>GNOME Web</_name>
<_summary>Web browser for GNOME</_summary>
<description>
<p>
<_p>
The web browser for GNOME, featuring tight integration with the desktop
and a simple and intuitive user interface that allows you to focus on your
web pages. If you’re looking for a simple, clean, beautiful view of the
web, this is the browser for you.
</p>
<p>
</_p>
<_p>
GNOME Web is often referred to by its code name, Epiphany.
</p>
</_p>
</description>
<screenshots>
<screenshot type="default">
<image>https://git.gnome.org/browse/epiphany/plain/data/screenshot.png</image>
<caption>The GNOME web site displayed in GNOME Web</caption>
<_caption>The GNOME web site displayed in GNOME Web</_caption>
</screenshot>
</screenshots>
<url type="homepage">https://wiki.gnome.org/Apps/Web</url>
......@@ -34,7 +34,7 @@
<project_group>GNOME</project_group>
<compulsory_for_desktop>GNOME</compulsory_for_desktop>
<project_license>GPL-2.0+</project_license>
<developer_name>The GNOME Project</developer_name>
<_developer_name>The GNOME Project</_developer_name>
<url type="bugtracker">https://bugzilla.gnome.org/enter_bug.cgi?product=epiphany</url>
<url type="donation">http://www.gnome.org/friends/</url>
<url type="help">https://help.gnome.org/users/epiphany/stable/</url>
......
[Desktop Entry]
Name=Web
GenericName=Web Browser
Comment=Browse the web
# Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon!
Keywords=web;browser;internet;
_Name=Web
_GenericName=Web Browser
_X-GNOME-FullName=Epiphany Web Browser
_Comment=Browse the web
_Keywords=web;browser;internet;
Exec=epiphany %U
StartupNotify=true
Terminal=false
......@@ -15,5 +15,5 @@ MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme
Actions=Incognito;
[Desktop Action Incognito]
Name=New Incognito Window
_Name=New Incognito Window
Exec=epiphany --incognito-mode
......@@ -226,6 +226,9 @@
<summary>Remember passwords</summary>
<description>Whether to store and prefill passwords in websites.</description>
</key>
<key type="b" name="enable-site-specific-quirks">
<default>true</default>
</key>
</schema>
<schema id="org.gnome.Epiphany.state">
<key type="s" name="download-dir">
......
......@@ -159,12 +159,6 @@ download_estimated_progress_changed_cb (EphyDownloadsManager *manager)
g_signal_emit (manager, signals[ESTIMATED_PROGRESS_CHANGED], 0);
}
static void
download_created_destination_cb (EphyDownloadsManager *manager)
{
ephy_downloads_manager_acquire_session_inhibitor (manager);
}
void
ephy_downloads_manager_add_download (EphyDownloadsManager *manager,
EphyDownload *download)
......@@ -177,6 +171,8 @@ ephy_downloads_manager_add_download (EphyDownloadsManager *manager,
if (g_list_find (manager->downloads, download))
return;
ephy_downloads_manager_acquire_session_inhibitor (manager);
manager->downloads = g_list_prepend (manager->downloads, g_object_ref (download));
g_signal_connect (download, "completed",
G_CALLBACK (download_completed_cb),
......@@ -189,9 +185,6 @@ ephy_downloads_manager_add_download (EphyDownloadsManager *manager,
g_signal_connect_swapped (wk_download, "notify::estimated-progress",
G_CALLBACK (download_estimated_progress_changed_cb),
manager);
g_signal_connect_swapped (wk_download, "created-destination",
G_CALLBACK (download_created_destination_cb),
manager);
g_signal_emit (manager, signals[DOWNLOAD_ADDED], 0, download);
g_signal_emit (manager, signals[ESTIMATED_PROGRESS_CHANGED], 0);
}
......
......@@ -561,7 +561,6 @@ ephy_embed_prefs_init (gpointer user_data)
webkit_settings = webkit_settings_new_with_settings ("enable-developer-extras", TRUE,
"enable-fullscreen", TRUE,
"enable-javascript", TRUE,
"enable-site-specific-quirks", TRUE,
"enable-dns-prefetching", TRUE,
"javascript-can-open-windows-automatically", TRUE,
NULL);
......@@ -621,6 +620,10 @@ ephy_embed_prefs_init (gpointer user_data)
EPHY_PREFS_WEB_ENABLE_SMOOTH_SCROLLING,
webkit_settings, "enable-smooth-scrolling",
G_SETTINGS_BIND_GET);
g_settings_bind (EPHY_SETTINGS_WEB,
EPHY_PREFS_WEB_ENABLE_SITE_SPECIFIC_QUIRKS,
webkit_settings, "enable-site-specific-quirks",
G_SETTINGS_BIND_GET);
return webkit_settings;
}
......
......@@ -1392,11 +1392,7 @@ ephy_embed_shell_launch_handler (EphyEmbedShell *shell,
/* Do not allow recursive calls into the browser, they can lead to
* infinite loops and they should never happen anyway. */
/* FIXME: Should use g_application_get_application_id() here instead of
* hardcoding epiphany.desktop. But first, we have to rename the desktop file.
*/
if (!app || g_strcmp0 (g_app_info_get_id (app), "epiphany.desktop") == 0)
if (!app || g_strcmp0 (g_app_info_get_id (app), "org.gnome.Epiphany.desktop") == 0)
return ret;
list = g_list_append (list, file);
......
......@@ -270,15 +270,13 @@ ephy_embed_utils_autosearch_address (const char *search_key)
{
char *query_param;
const char *address_search;
char *default_name;
char *effective_address;
EphyEmbedShell *shell;
EphySearchEngineManager *search_engine_manager;
shell = ephy_embed_shell_get_default ();
search_engine_manager = ephy_embed_shell_get_search_engine_manager (shell);
default_name = ephy_search_engine_manager_get_default_engine (search_engine_manager);
address_search = ephy_search_engine_manager_get_address (search_engine_manager, default_name);
address_search = ephy_search_engine_manager_get_default_search_address (search_engine_manager);
query_param = soup_form_encode ("q", search_key, NULL);
#pragma GCC diagnostic push
......@@ -288,7 +286,6 @@ ephy_embed_utils_autosearch_address (const char *search_key)
effective_address = g_strdup_printf (address_search, query_param + 2);
#pragma GCC diagnostic pop
g_free (query_param);
g_free (default_name);
return effective_address;
}
......
......@@ -463,13 +463,9 @@ ephy_web_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
static gboolean
ephy_web_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
{
/* This are the special cases WebkitWebView doesn't handle but we have an
/* These are the special cases WebkitWebView doesn't handle but we have an
* interest in handling. */
/* We always show the browser context menu on control-rightclick. */
if (event->button == 3 && event->state == GDK_CONTROL_MASK)
return FALSE;
/* Handle typical back/forward mouse buttons. */
if (event->button == 8) {
webkit_web_view_go_back (WEBKIT_WEB_VIEW (widget));
......@@ -1487,11 +1483,6 @@ permission_request_cb (WebKitWebView *web_view,
if (WEBKIT_IS_GEOLOCATION_PERMISSION_REQUEST (decision)) {
permission_type = EPHY_PERMISSION_TYPE_ACCESS_LOCATION;
} else if (WEBKIT_IS_NOTIFICATION_PERMISSION_REQUEST (decision)) {
/* Application mode implies being OK with notifications. */
if (ephy_embed_shell_get_mode (shell) == EPHY_EMBED_SHELL_MODE_APPLICATION) {
webkit_permission_request_allow (decision);
return TRUE;
}
permission_type = EPHY_PERMISSION_TYPE_SHOW_NOTIFICATIONS;
} else if (WEBKIT_IS_USER_MEDIA_PERMISSION_REQUEST (decision)) {
if (webkit_user_media_permission_is_for_video_device (WEBKIT_USER_MEDIA_PERMISSION_REQUEST (decision)))
......@@ -1511,21 +1502,31 @@ permission_request_cb (WebKitWebView *web_view,
permission = ephy_permissions_manager_get_permission (permissions_manager,
permission_type,
origin);
g_free (origin);
switch (permission) {
case EPHY_PERMISSION_PERMIT:
webkit_permission_request_allow (decision);
return TRUE;
goto out;
case EPHY_PERMISSION_DENY:
webkit_permission_request_deny (decision);
return TRUE;
goto out;
case EPHY_PERMISSION_UNDECIDED:
default:
break;
/* Application mode implies being OK with notifications. */
if (permission_type == EPHY_PERMISSION_TYPE_SHOW_NOTIFICATIONS &&
ephy_embed_shell_get_mode (shell) == EPHY_EMBED_SHELL_MODE_APPLICATION) {
ephy_permissions_manager_set_permission (permissions_manager,
permission_type,
origin,
EPHY_PERMISSION_PERMIT);
webkit_permission_request_allow (decision);
} else {
show_permission_request_info_bar (web_view, decision, permission_type);
}
}
show_permission_request_info_bar (web_view, decision, permission_type);
out:
g_free (origin);
return TRUE;
}
......
......@@ -148,12 +148,20 @@ should_use_https_everywhere (const char *request_uri,
static gboolean
should_use_adblocker (const char *request_uri,
const char *page_uri)
const char *page_uri,
const char *redirected_request_uri)
{
/* Always load the main resource. */
if (!g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_ADBLOCK))
return FALSE;
/* Always load the main resource... */
if (g_strcmp0 (request_uri, page_uri) == 0)
return FALSE;
/* ...even during a redirect, when page_uri is stale. */
if (g_strcmp0 (page_uri, redirected_request_uri) == 0)
return FALSE;
/* Always load data requests, as uri_tester won't do any good here. */
if (g_str_has_prefix (request_uri, SOUP_URI_SCHEME_DATA))
return FALSE;
......@@ -189,9 +197,9 @@ web_page_send_request (WebKitWebPage *web_page,
request_uri = webkit_uri_request_get_uri (request);
page_uri = webkit_web_page_get_uri (web_page);
redirected_response_uri = redirected_response ? webkit_uri_response_get_uri (redirected_response) : NULL;
if (!should_use_adblocker (request_uri, page_uri) ||
!g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_ADBLOCK))
if (!should_use_adblocker (request_uri, page_uri, redirected_response_uri))
flags &= ~EPHY_URI_TEST_ADBLOCK;
if (g_settings_get_boolean (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_DO_NOT_TRACK)) {
......@@ -204,7 +212,6 @@ web_page_send_request (WebKitWebPage *web_page,
modified_uri = ephy_remove_tracking_from_uri (request_uri);
}
redirected_response_uri = redirected_response ? webkit_uri_response_get_uri (redirected_response) : NULL;
if (!should_use_https_everywhere (request_uri, redirected_response_uri))
flags &= ~EPHY_URI_TEST_HTTPS_EVERYWHERE;
......@@ -647,7 +654,11 @@ get_entry_style_context (void)
path = gtk_widget_path_new ();
gtk_widget_path_append_type (path, GTK_TYPE_ENTRY);
#if GTK_CHECK_VERSION(3, 20, 0)
gtk_widget_path_iter_set_object_name (path, 0, "entry");
#else
gtk_widget_path_iter_add_class (path, 0, GTK_STYLE_CLASS_ENTRY);
#endif
global_entry_context = gtk_style_context_new ();
gtk_style_context_set_path (global_entry_context, path);
......
......@@ -24,6 +24,74 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
/**
* ephy_gui_menu_position_under_widget:
* @menu:
* @x:
* @y:
* @push_in:
* @user_data: a #GtkWidget
*
* Positions @menu under (or over, depending on space available) the widget
* @user_data.
*/
void
ephy_gui_menu_position_under_widget (GtkMenu *menu,
gint *x,
gint *y,
gboolean *push_in,
gpointer user_data)
{
/* Adapted from gtktoolbar.c */
GtkWidget *widget = GTK_WIDGET (user_data);
GtkWidget *container;
GtkRequisition req;
GtkRequisition menu_req;
GtkAllocation allocation;
GdkRectangle monitor;
GdkWindow *window;
int monitor_num;
GdkScreen *screen;
g_return_if_fail (GTK_IS_WIDGET (widget));
container = gtk_widget_get_ancestor (widget, GTK_TYPE_CONTAINER);
g_return_if_fail (container != NULL);
gtk_widget_get_preferred_size (widget, &req, NULL);
gtk_widget_get_preferred_size (GTK_WIDGET (menu), &menu_req, NULL);
screen = gtk_widget_get_screen (GTK_WIDGET (menu));
window = gtk_widget_get_window (widget);
monitor_num = gdk_screen_get_monitor_at_window (screen, window);
if (monitor_num < 0)
monitor_num = 0;
gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
gtk_widget_get_allocation (widget, &allocation);
gdk_window_get_origin (window, x, y);
if (!gtk_widget_get_has_window (widget)) {
*x += allocation.x;
*y += allocation.y;
}
if (gtk_widget_get_direction (container) == GTK_TEXT_DIR_LTR)
*x += allocation.width - req.width;
else
*x += req.width - menu_req.width;
if ((*y + allocation.height + menu_req.height) <= monitor.y + monitor.height)
*y += allocation.height;
else if ((*y - menu_req.height) >= monitor.y)
*y -= menu_req.height;
else if (monitor.y + monitor.height - (*y + allocation.height) > *y)
*y += allocation.height;
else
*y -= menu_req.height;
*push_in = FALSE;
}
GtkWindowGroup *
ephy_gui_ensure_window_group (GtkWindow *window)
{
......@@ -54,6 +122,7 @@ ephy_gui_help (GtkWidget *parent,
const char *page)
{
GError *error = NULL;
GdkScreen *screen;
char *url;
if (page)
......@@ -61,7 +130,12 @@ ephy_gui_help (GtkWidget *parent,
else
url = g_strdup ("help:epiphany");
gtk_show_uri_on_window (GTK_WINDOW (parent), url, gtk_get_current_event_time (), &error);
if (parent)
screen = gtk_widget_get_screen (parent);
else
screen = gdk_screen_get_default ();
gtk_show_uri (screen, url, gtk_get_current_event_time (), &error);
if (error != NULL) {
GtkWidget *dialog;
......
......@@ -24,6 +24,12 @@
G_BEGIN_DECLS
void ephy_gui_menu_position_under_widget (GtkMenu *menu,
gint *x,
gint *y,
gboolean *push_in,
gpointer user_data);
GtkWindowGroup *ephy_gui_ensure_window_group (GtkWindow *window);
void ephy_gui_get_current_event (GdkEventType *type,
......
......@@ -354,7 +354,7 @@ ephy_permissions_manager_get_matching_origins (EphyPermissionsManager *manager,
{
GKeyFile *file;
char *filename;
char **groups;
char **groups = NULL;
gsize groups_length;
GList *origins = NULL;
GError *error = NULL;
......@@ -380,7 +380,7 @@ ephy_permissions_manager_get_matching_origins (EphyPermissionsManager *manager,
if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
g_warning ("Error processing %s: %s", filename, error->message);
g_error_free (error);
return NULL;
goto out;
}
groups = g_key_file_get_groups (file, &groups_length);
......@@ -388,10 +388,6 @@ ephy_permissions_manager_get_matching_origins (EphyPermissionsManager *manager,
origins = g_list_concat (origins,
origins_for_keyfile_group (file, filename, groups[i], type, permit));
g_key_file_unref (file);
g_strfreev (groups);
g_free (filename);
/* Cache the results. */
if (origins != NULL) {
g_hash_table_insert (permit ? manager->permission_type_permitted_origins
......@@ -400,6 +396,11 @@ ephy_permissions_manager_get_matching_origins (EphyPermissionsManager *manager,
origins);
}
out:
g_key_file_unref (file);
g_strfreev (groups);
g_free (filename);
return origins;
}
......
......@@ -78,26 +78,27 @@ static const char * const ephy_prefs_state_schema[] = {
EPHY_PREFS_STATE_IS_MAXIMIZED
};
#define EPHY_PREFS_WEB_SCHEMA "org.gnome.Epiphany.web"
#define EPHY_PREFS_WEB_FONT_MIN_SIZE "min-font-size"
#define EPHY_PREFS_WEB_LANGUAGE "language"
#define EPHY_PREFS_WEB_USE_GNOME_FONTS "use-gnome-fonts"
#define EPHY_PREFS_WEB_SANS_SERIF_FONT "sans-serif-font"
#define EPHY_PREFS_WEB_SERIF_FONT "serif-font"
#define EPHY_PREFS_WEB_MONOSPACE_FONT "monospace-font"
#define EPHY_PREFS_WEB_ENABLE_USER_CSS "enable-user-css"
#define EPHY_PREFS_WEB_ENABLE_POPUPS "enable-popups"
#define EPHY_PREFS_WEB_ENABLE_PLUGINS "enable-plugins"
#define EPHY_PREFS_WEB_ENABLE_SPELL_CHECKING "enable-spell-checking"
#define EPHY_PREFS_WEB_ENABLE_WEBGL "enable-webgl"
#define EPHY_PREFS_WEB_ENABLE_WEBAUDIO "enable-webaudio"
#define EPHY_PREFS_WEB_ENABLE_SMOOTH_SCROLLING "enable-smooth-scrolling"
#define EPHY_PREFS_WEB_USER_AGENT "user-agent"
#define EPHY_PREFS_WEB_COOKIES_POLICY "cookies-policy"
#define EPHY_PREFS_WEB_DEFAULT_ENCODING "default-encoding"
#define EPHY_PREFS_WEB_DO_NOT_TRACK "do-not-track"
#define EPHY_PREFS_WEB_ENABLE_ADBLOCK "enable-adblock"
#define EPHY_PREFS_WEB_REMEMBER_PASSWORDS "remember-passwords"
#define EPHY_PREFS_WEB_SCHEMA "org.gnome.Epiphany.web"
#define EPHY_PREFS_WEB_FONT_MIN_SIZE "min-font-size"
#define EPHY_PREFS_WEB_LANGUAGE "language"
#define EPHY_PREFS_WEB_USE_GNOME_FONTS "use-gnome-fonts"
#define EPHY_PREFS_WEB_SANS_SERIF_FONT "sans-serif-font"
#define EPHY_PREFS_WEB_SERIF_FONT "serif-font"
#define EPHY_PREFS_WEB_MONOSPACE_FONT "monospace-font"
#define EPHY_PREFS_WEB_ENABLE_USER_CSS "enable-user-css"
#define EPHY_PREFS_WEB_ENABLE_POPUPS "enable-popups"
#define EPHY_PREFS_WEB_ENABLE_PLUGINS "enable-plugins"
#define EPHY_PREFS_WEB_ENABLE_SPELL_CHECKING "enable-spell-checking"
#define EPHY_PREFS_WEB_ENABLE_WEBGL "enable-webgl"
#define EPHY_PREFS_WEB_ENABLE_WEBAUDIO "enable-webaudio"
#define EPHY_PREFS_WEB_ENABLE_SMOOTH_SCROLLING "enable-smooth-scrolling"
#define EPHY_PREFS_WEB_USER_AGENT "user-agent"
#define EPHY_PREFS_WEB_COOKIES_POLICY "cookies-policy"
#define EPHY_PREFS_WEB_DEFAULT_ENCODING "default-encoding"
#define EPHY_PREFS_WEB_DO_NOT_TRACK "do-not-track"
#define EPHY_PREFS_WEB_ENABLE_ADBLOCK "enable-adblock"
#define EPHY_PREFS_WEB_REMEMBER_PASSWORDS "remember-passwords"
#define EPHY_PREFS_WEB_ENABLE_SITE_SPECIFIC_QUIRKS "enable-site-specific-quirks"
static const char * const ephy_prefs_web_schema[] = {
EPHY_PREFS_WEB_FONT_MIN_SIZE,
......@@ -119,6 +120,7 @@ static const char * const ephy_prefs_web_schema[] = {
EPHY_PREFS_WEB_DO_NOT_TRACK,
EPHY_PREFS_WEB_ENABLE_ADBLOCK,
EPHY_PREFS_WEB_REMEMBER_PASSWORDS,
EPHY_PREFS_WEB_ENABLE_SITE_SPECIFIC_QUIRKS
};
#define EPHY_PREFS_SCHEMA "org.gnome.Epiphany"
......
......@@ -27,6 +27,8 @@
#include "ephy-settings.h"
#include "ephy-prefs.h"
#define FALLBACK_ADDRESS "https://duckduckgo.com/?q=%s&t=epiphany"
enum {
SEARCH_ENGINES_CHANGED,
LAST_SIGNAL
......@@ -148,6 +150,19 @@ ephy_search_engine_manager_get_address (EphySearchEngineManager *manager,
return NULL;
}
const char *
ephy_search_engine_manager_get_default_search_address (EphySearchEngineManager *manager)
{
char *name;
const char *address;
name = ephy_search_engine_manager_get_default_engine (manager);
address = ephy_search_engine_manager_get_address (manager, name);
g_free (name);
return address ? address : FALLBACK_ADDRESS;
}
const char *
ephy_search_engine_manager_get_bang (EphySearchEngineManager *manager,
const char *name)
......
......@@ -39,6 +39,8 @@ G_DECLARE_FINAL_TYPE (EphySearchEngineManager, ephy_search_engine_manager, EPHY,
EphySearchEngineManager *ephy_search_engine_manager_new (void);
const char *ephy_search_engine_manager_get_address (EphySearchEngineManager *manager,
const char *name);
const char *ephy_search_engine_manager_get_default_search_address
(EphySearchEngineManager *manager);
const char *ephy_search_engine_manager_get_bang (EphySearchEngineManager *manager,
const char *name);
char *ephy_search_engine_manager_get_default_engine (EphySearchEngineManager *manager);
......
......@@ -102,12 +102,21 @@ ephy_create_file_chooser (const char *title,
g_return_val_if_fail (GTK_IS_WINDOW (parent), NULL);
g_return_val_if_fail (default_filter >= 0 && default_filter <= EPHY_FILE_FILTER_LAST, NULL);
#if GTK_CHECK_VERSION(3, 20, 0)
dialog = GTK_FILE_CHOOSER (gtk_file_chooser_native_new (title,
GTK_WINDOW (parent),
action,
NULL,
_("_Cancel")));
gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
#else
dialog = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new (title,
GTK_WINDOW (parent),
action,
NULL,
NULL));
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
#endif
downloads_dir = ephy_file_get_downloads_dir ();
gtk_file_chooser_add_shortcut_folder (dialog, downloads_dir, NULL);
......@@ -116,9 +125,33 @@ ephy_create_file_chooser (const char *title,
if (action == GTK_FILE_CHOOSER_ACTION_OPEN ||
action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER) {
#if GTK_CHECK_VERSION(3, 20, 0)
gtk_file_chooser_native_set_accept_label (GTK_FILE_CHOOSER_NATIVE (dialog), _("_Open"));
#else
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
NULL);
#pragma GCC diagnostic pop
gtk_dialog_set_default_response (GTK_DIALOG (dialog),
GTK_RESPONSE_ACCEPT);
#endif
} else if (action == GTK_FILE_CHOOSER_ACTION_SAVE) {
#if GTK_CHECK_VERSION(3, 20, 0)
gtk_file_chooser_native_set_accept_label (GTK_FILE_CHOOSER_NATIVE (dialog), _("_Save"));
#else
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
NULL);
#pragma GCC diagnostic pop
gtk_dialog_set_default_response (GTK_DIALOG (dialog),
GTK_RESPONSE_ACCEPT);
#endif
}
if (default_filter != EPHY_FILE_FILTER_NONE) {
......
......@@ -270,6 +270,16 @@ ephy_location_entry_get_property (GObject *object,
}
}
static void
ephy_location_entry_constructed (GObject *object)
{
G_OBJECT_CLASS (ephy_location_entry_parent_class)->constructed (object);
#if GTK_CHECK_VERSION(3, 22, 20)
gtk_entry_set_input_hints (GTK_ENTRY (object), GTK_INPUT_HINT_NO_EMOJI);
#endif
}
static void
ephy_location_entry_finalize (GObject *object)
{
......@@ -368,6 +378,7 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass)
object_class->get_property = ephy_location_entry_get_property;
object_class->set_property = ephy_location_entry_set_property;
object_class->constructed = ephy_location_entry_constructed;
object_class->finalize = ephy_location_entry_finalize;
widget_class->size_allocate = ephy_location_entry_size_allocate;
......@@ -662,6 +673,7 @@ entry_populate_popup_cb (GtkEntry *entry,
if (GTK_IS_SEPARATOR_MENU_ITEM (item->data))
sep++;
}
g_list_free (children);
gtk_menu_shell_insert (GTK_MENU_SHELL (menu), clear_menuitem, pos - 1);
......@@ -676,6 +688,7 @@ entry_populate_popup_cb (GtkEntry *entry,
}
}
g_assert (paste_menuitem != NULL);
g_list_free (children);
g_signal_connect (paste_and_go_menuitem, "activate",
G_CALLBACK (entry_paste_and_go_activate_cb), lentry);
......
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
* Copyright (C) 2011 Red Hat Inc.
/* Nautilus - Floating status bar.
*
* This file is part of Epiphany.
* Copyright (C) 2011 Red Hat Inc.
*
* Epiphany is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* Epiphany is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Epiphany. If not, see <http://www.gnu.org/licenses/>.
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Authors: Cosimo Cecchi <cosimoc@redhat.com>
*
* Authors: Cosimo Cecchi <cosimoc@redhat.com>
*/
#include <config.h>
......@@ -26,6 +25,8 @@
#include "nautilus-floating-bar.h"
#define HOVER_HIDE_TIMEOUT_INTERVAL 100
struct _NautilusFloatingBarDetails {
gchar *primary_label;
gchar *details_label;
......@@ -73,6 +74,7 @@ nautilus_floating_bar_finalize (GObject *obj)
{
NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (obj);
nautilus_floating_bar_remove_hover_timeout (self);
g_free (self->priv->primary_label);
g_free (self->priv->details_label);
......@@ -146,41 +148,29 @@ update_labels (NautilusFloatingBar *self)
gtk_widget_set_visible (self->priv->details_label_widget, details_visible);
}
static void
nautilus_floating_bar_show (GtkWidget *widget)
void
nautilus_floating_bar_remove_hover_timeout (NautilusFloatingBar *self)
{
NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (widget);
/* Epiphany: never show the bar on top of the web view. */
if (gtk_widget_get_valign (widget) == GTK_ALIGN_START)
return;
GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->show (widget);
if (self->priv->show_spinner) {
gtk_spinner_start (GTK_SPINNER (self->priv->spinner));
if (self->priv->hover_timeout_id != 0) {
g_source_remove (self->priv->hover_timeout_id);
self->priv->hover_timeout_id = 0;
}
}
static void
nautilus_floating_bar_hide (GtkWidget *widget)
{
NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (widget);
GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->hide (widget);
gtk_spinner_stop (GTK_SPINNER (self->priv->spinner));
}
typedef struct {
GtkWidget *overlay;
GtkWidget *floating_bar;
GdkDevice *device;
gint y_down_limit;
gint y_upper_limit;
gboolean first_time;
} CheckPointerData;
static void
check_pointer_data_free (gpointer data)
{
g_slice_free (CheckPointerData, data);
}
static gboolean
check_pointer_timeout (gpointer user_data)
{
......@@ -191,26 +181,16 @@ check_pointer_timeout (gpointer user_data)
NULL, &pointer_y, NULL);
if (pointer_y == -1 || pointer_y < data->y_down_limit || pointer_y > data->y_upper_limit) {
if (!data->first_time) {
gtk_widget_set_valign (data->floating_bar, GTK_ALIGN_END);
nautilus_floating_bar_show (data->floating_bar);
}
gtk_widget_show (data->floating_bar);
NAUTILUS_FLOATING_BAR (data->floating_bar)->priv->hover_timeout_id = 0;
return G_SOURCE_REMOVE;
} else {
gtk_widget_hide (data->floating_bar);
}
if (data->first_time) {
/* Hide floating bar at top position of widget */
nautilus_floating_bar_hide (data->floating_bar);
gtk_widget_set_valign (data->floating_bar, GTK_ALIGN_START);
gtk_widget_queue_resize (data->floating_bar);
}
data->first_time = FALSE;
return G_SOURCE_CONTINUE;
}
static gboolean
overlay_enter_notify_cb (GtkWidget *parent,
GdkEventCrossing *event,
......@@ -218,14 +198,12 @@ overlay_enter_notify_cb (GtkWidget *parent,
{
GtkWidget *widget = user_data;
CheckPointerData *data;
GtkAllocation alloc_parent;
gint y_pos;
NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (widget);
if (self->priv->hover_timeout_id != 0) {
g_source_remove (self->priv->hover_timeout_id);
self->priv->hover_timeout_id = 0;
}
if (event->window != gtk_widget_get_window (widget)) {
......@@ -236,20 +214,19 @@ overlay_enter_notify_cb (GtkWidget *parent,
return GDK_EVENT_PROPAGATE;
}
gtk_widget_get_allocation (parent, &alloc_parent);
gdk_window_get_position (gtk_widget_get_window (widget), NULL, &y_pos);
data = g_new (CheckPointerData, 1);
data = g_slice_new (CheckPointerData);
data->overlay = parent;
data->floating_bar = widget;
data->device = gdk_event_get_device ((GdkEvent *)event);
data->y_down_limit = y_pos;
data->y_upper_limit = alloc_parent.height;
data->first_time = TRUE;
data->y_upper_limit = y_pos + gtk_widget_get_allocated_height (widget);
self->priv->hover_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT, 250,
self->priv->hover_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT, HOVER_HIDE_TIMEOUT_INTERVAL,
check_pointer_timeout, data,
g_free);
check_pointer_data_free);
g_source_set_name_by_id (self->priv->hover_timeout_id, "[nautilus-floating-bar] overlay_enter_notify_cb");
return GDK_EVENT_STOP;
......@@ -274,28 +251,95 @@ nautilus_floating_bar_parent_set (GtkWidget *widget,
}
}
static gboolean
nautilus_floating_bar_draw (GtkWidget *widget,
cairo_t *cr)
static void
get_padding_and_border (GtkWidget *widget,
GtkBorder *border)
{
GtkStyleContext *context;
GtkStateFlags state;
GtkBorder tmp;
context = gtk_widget_get_style_context (widget);
state = gtk_widget_get_state_flags (widget);
gtk_style_context_get_padding (context, state, border);
gtk_style_context_get_border (context, state, &tmp);
border->top += tmp.top;
border->right += tmp.right;
border->bottom += tmp.bottom;
border->left += tmp.left;
}
static void
nautilus_floating_bar_get_preferred_width (GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
GtkBorder border;
get_padding_and_border (widget, &border);
GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_width (widget,
minimum_size,
natural_size);
*minimum_size += border.left + border.right;
*natural_size += border.left + border.right;
}
static void
nautilus_floating_bar_get_preferred_width_for_height (GtkWidget *widget,
gint height,
gint *minimum_size,
gint *natural_size)
{
GtkBorder border;
get_padding_and_border (widget, &border);
gtk_style_context_save (context);
gtk_style_context_set_state (context, gtk_widget_get_state_flags (widget));
GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_width_for_height (widget,
height,
minimum_size,
natural_size);
gtk_render_background (context, cr, 0, 0,
gtk_widget_get_allocated_width (widget),
gtk_widget_get_allocated_height (widget));
*minimum_size += border.left + border.right;
*natural_size += border.left + border.right;
}
static void
nautilus_floating_bar_get_preferred_height (GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
GtkBorder border;
get_padding_and_border (widget, &border);
GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_height (widget,
minimum_size,
natural_size);
*minimum_size += border.top + border.bottom;
*natural_size += border.top + border.bottom;
}
static void
nautilus_floating_bar_get_preferred_height_for_width (GtkWidget *widget,
gint width,
gint *minimum_size,
gint *natural_size)
{
GtkBorder border;
gtk_render_frame (context, cr, 0, 0,
gtk_widget_get_allocated_width (widget),
gtk_widget_get_allocated_height (widget));
get_padding_and_border (widget, &border);
gtk_style_context_restore (context);
GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->get_preferred_height_for_width (widget,
width,
minimum_size,
natural_size);
return GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->draw (widget, cr);;
*minimum_size += border.top + border.bottom;
*natural_size += border.top + border.bottom;
}
static void
......@@ -311,6 +355,7 @@ nautilus_floating_bar_constructed (GObject *obj)
w = gtk_spinner_new ();
gtk_box_pack_start (GTK_BOX (box), w, FALSE, FALSE, 0);
gtk_widget_set_visible (w, self->priv->show_spinner);
gtk_spinner_start (GTK_SPINNER (w));
self->priv->spinner = w;
gtk_widget_set_size_request (w, 16, 16);
......@@ -363,9 +408,10 @@ nautilus_floating_bar_class_init (NautilusFloatingBarClass *klass)
oclass->get_property = nautilus_floating_bar_get_property;
oclass->finalize = nautilus_floating_bar_finalize;
wclass->draw = nautilus_floating_bar_draw;
wclass->show = nautilus_floating_bar_show;
wclass->hide = nautilus_floating_bar_hide;
wclass->get_preferred_width = nautilus_floating_bar_get_preferred_width;
wclass->get_preferred_width_for_height = nautilus_floating_bar_get_preferred_width_for_height;
wclass->get_preferred_height = nautilus_floating_bar_get_preferred_height;
wclass->get_preferred_height_for_width = nautilus_floating_bar_get_preferred_height_for_width;
wclass->parent_set = nautilus_floating_bar_parent_set;
properties[PROP_PRIMARY_LABEL] =
......@@ -391,7 +437,8 @@ nautilus_floating_bar_class_init (NautilusFloatingBarClass *klass)
g_signal_new ("action",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL,
0, NULL, NULL,
g_cclosure_marshal_VOID__INT,
G_TYPE_NONE, 1,
G_TYPE_INT);
......@@ -468,13 +515,14 @@ nautilus_floating_bar_add_action (NautilusFloatingBar *self,
const gchar *icon_name,
gint action_id)
{
GtkWidget *w, *button;
w = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
gtk_widget_show (w);
GtkWidget *button;
GtkStyleContext *context;
button = gtk_button_new ();
gtk_button_set_image (GTK_BUTTON (button), w);
button = gtk_button_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU);
context = gtk_widget_get_style_context (button);
gtk_style_context_add_class (context, "circular");
gtk_style_context_add_class (context, "flat");
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
gtk_box_pack_end (GTK_BOX (self), button, FALSE, FALSE, 0);
gtk_widget_show (button);
......
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
* Copyright (C) 2011 Red Hat Inc.
/* Nautilus - Floating status bar.
*
* Copyright (C) 2011 Red Hat Inc.
*
* This file is part of Epiphany.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* Epiphany is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* Epiphany is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* You should have received a copy of the GNU General Public License
* along with Epiphany. If not, see <http://www.gnu.org/licenses/>.
* Authors: Cosimo Cecchi <cosimoc@redhat.com>
*
* Authors: Cosimo Cecchi <cosimoc@redhat.com>
*/
#pragma once
#ifndef __NAUTILUS_FLOATING_BAR_H__
#define __NAUTILUS_FLOATING_BAR_H__
#include <gtk/gtk.h>
......@@ -72,3 +73,7 @@ void nautilus_floating_bar_add_action (NautilusFloatingBar *self,
const gchar *icon_name,
gint action_id);
void nautilus_floating_bar_cleanup_actions (NautilusFloatingBar *self);
void nautilus_floating_bar_remove_hover_timeout (NautilusFloatingBar *self);
#endif /* __NAUTILUS_FLOATING_BAR_H__ */
# Makefile variables for PO directory in any package using GNU gettext.
# Usually the message domain is the same as the package name.
DOMAIN = $(PACKAGE)
# These two variables depend on the location of this directory.
subdir = po
top_builddir = ..
# These options get passed to xgettext.
XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 --keyword=g_dngettext:2,3 --add-comments
# This is the copyright holder that gets inserted into the header of the
# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
# package. (Note that the msgstr strings, extracted from the package's
# sources, belong to the copyright holder of the package.) Translators are
# expected to transfer the copyright for their translations to this person
# or entity, or to disclaim their copyright. The empty string stands for
# the public domain; in this case the translators are expected to disclaim
# their copyright.
COPYRIGHT_HOLDER = Free Software Foundation, Inc.
# This tells whether or not to prepend "GNU " prefix to the package
# name that gets inserted into the header of the $(DOMAIN).pot file.
# Possible values are "yes", "no", or empty. If it is empty, try to
# detect it automatically by scanning the files in $(top_srcdir) for
# "GNU packagename" string.
PACKAGE_GNU = no
# This is the email address or URL to which the translators shall report
# bugs in the untranslated strings:
# - Strings which are not entire sentences, see the maintainer guidelines
# in the GNU gettext documentation, section 'Preparing Strings'.
# - Strings which use unclear terms or require additional context to be
# understood.
# - Strings which make invalid assumptions about notation of date, time or
# money.
# - Pluralisation problems.
# - Incorrect English spelling.
# - Incorrect formatting.
# It can be your email address, or a mailing list address where translators
# can write to without being subscribed, or the URL of a web page through
# which the translators can contact you.
MSGID_BUGS_ADDRESS =
# This is the list of locale categories, beyond LC_MESSAGES, for which the
# message catalogs shall be used. It is usually empty.
EXTRA_LOCALE_CATEGORIES =
# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
# context. Possible values are "yes" and "no". Set this to yes if the
# package uses functions taking also a message context, like pgettext(), or
# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
USE_MSGCTXT = yes
# These options get passed to msgmerge.
# Useful options are in particular:
# --previous to keep previous msgids of translated messages,
# --quiet to reduce the verbosity.
MSGMERGE_OPTIONS =
# These options get passed to msginit.
# If you want to disable line wrapping when writing PO files, add
# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
# MSGINIT_OPTIONS.
MSGINIT_OPTIONS =
# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
# has changed. Possible values are "yes" and "no". Set this to no if
# the POT file is checked in the repository and the version control
# program ignores timestamps.
PO_DEPENDS_ON_POT = no
# This tells whether or not to forcibly update $(DOMAIN).pot and
# regenerate PO files on "make dist". Possible values are "yes" and
# "no". Set this to no if the POT file and PO files are maintained
# externally.
DIST_DEPENDS_ON_UPDATE_PO = no
[encoding: UTF-8]
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
data/org.gnome.Epiphany.appdata.xml.in
......@@ -45,20 +46,20 @@ src/passwords-dialog.c
src/popup-commands.c
src/prefs-dialog.c
src/profile-migrator/ephy-profile-migrator.c
src/resources/gtk/application-menu.ui
src/resources/gtk/bookmark-properties-grid.ui
src/resources/gtk/bookmarks-popover.ui
src/resources/gtk/clear-data-dialog.ui
src/resources/gtk/cookies-dialog.ui
src/resources/gtk/encoding-dialog.ui
src/resources/gtk/history-dialog.ui
src/resources/gtk/menus.ui
src/resources/gtk/page-menu-popover.ui
src/resources/gtk/passwords-dialog.ui
src/resources/gtk/prefs-dialog.ui
src/resources/gtk/prefs-lang-dialog.ui
src/resources/gtk/search-engine-dialog.ui
src/resources/gtk/shortcuts-dialog.ui
[type: gettext/glade]src/resources/gtk/application-menu.ui
[type: gettext/glade]src/resources/gtk/bookmark-properties-grid.ui
[type: gettext/glade]src/resources/gtk/bookmarks-popover.ui
[type: gettext/glade]src/resources/gtk/clear-data-dialog.ui
[type: gettext/glade]src/resources/gtk/cookies-dialog.ui
[type: gettext/glade]src/resources/gtk/encoding-dialog.ui
[type: gettext/glade]src/resources/gtk/history-dialog.ui
[type: gettext/glade]src/resources/gtk/menus.ui
[type: gettext/glade]src/resources/gtk/page-menu-popover.ui
[type: gettext/glade]src/resources/gtk/passwords-dialog.ui
[type: gettext/glade]src/resources/gtk/prefs-dialog.ui
[type: gettext/glade]src/resources/gtk/prefs-lang-dialog.ui
[type: gettext/glade]src/resources/gtk/search-engine-dialog.ui
[type: gettext/glade]src/resources/gtk/shortcuts-dialog.ui
src/search-provider/ephy-search-provider.c
src/sync/ephy-sync-secret.c
src/sync/ephy-sync-service.c
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -234,5 +234,5 @@ ephy_add_bookmark_popover_show (EphyAddBookmarkPopover *self)
g_free (self->address);
self->address = g_strdup (address);
gtk_popover_popup (GTK_POPOVER (self));
gtk_widget_show (GTK_WIDGET (self));
}
......@@ -238,3 +238,11 @@ ephy_bookmark_row_get_bookmark (EphyBookmarkRow *self)
return self->bookmark;
}
const char *
ephy_bookmark_row_get_bookmark_url (EphyBookmarkRow *self)
{
g_return_val_if_fail (EPHY_IS_BOOKMARK_ROW (self), NULL);
return ephy_bookmark_get_url (self->bookmark);
}
......@@ -30,8 +30,10 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (EphyBookmarkRow, ephy_bookmark_row,