Compare commits

...
Sign in to create a new pull request.
Author SHA1 Message Date
monsta
4b3873b113 release 1.18.5 2018-04-09 13:14:16 +03:00
monsta
6428f20d35 fix previous NEWS entry 2018-04-09 13:05:25 +03:00
Antia Puentes
35751a64f5 ev-view-accessible: Fix a crash in ev_view_accessible_get_link
Check array limits returning early if the link index is out of range.

https://bugzilla.gnome.org/show_bug.cgi?id=705155

https://git.gnome.org/browse/evince/commit/?h=gnome-3-10&id=7eac53f
2018-04-09 11:56:05 +03:00
monsta
1c14dc96ca disable StartPresentation action in fullscreen if document has no pages
this also disables it when no document is loaded
2018-04-09 11:40:35 +03:00
monsta
b1d39dbe2b disable ViewPresentation action if document has no pages
follow-up to 294923b3af - this action
should be disabled when e.g. a truncated pdf is loaded
2018-04-09 11:39:49 +03:00
Lubos Koudelka
294923b3af Disable view presentation if there is no document.
otherwise atril crashes

https://bugzilla.gnome.org/show_bug.cgi?id=685591

origin commit:
https://git.gnome.org/browse/evince/commit/?h=gnome-3-8&id=b4bf316
2018-04-04 11:34:38 +03:00
Carlos Garcia Campos
fecc271e23 libview: Fix goto window in presentation mode
It wasn't correctly set as modal.

origin commit:
https://git.gnome.org/browse/evince/commit/?h=gnome-3-2&id=987aab6
2018-04-04 11:33:09 +03:00
Marek Kasik
4bc8ddd5ef libview: Check number of pages when processing button events
Check whether there are some pages in the opened document
when processing button events to avoid crash.

https://bugzilla.gnome.org/show_bug.cgi?id=769700

origin commit:
https://git.gnome.org/browse/evince/commit/?id=f30aed7
2018-04-03 17:23:01 +03:00
Germán Poo-Caamaño
7bba877d22 libview: Check number of pages on ev_view_document_changed_cb
Fix crash on corrupted PDF with no pages.

Thanks to Juha Kylmänen from OUSPG who were testing robutness.
(CVE-2013-3718).

libview: Fix warning on ev_view_document_changed_cb
There was an introduction of a warning when fixing the bug
https://bugzilla.gnome.org/show_bug.cgi?id=701302

If ev_view_document_changed_cb () is emitted when there
is no previous document, the check fails.

This patch change the order of the condition checks.

origin commits:
https://git.gnome.org/browse/evince/commit/?h=gnome-3-8&id=62b1585
https://git.gnome.org/browse/evince/commit/?h=gnome-3-8&id=5431595
2018-04-03 17:20:35 +03:00
Piiit
370cea4800 libview: save inverted colors in a document
The web-view callback for inverted colors got called, and if it did not find a web-view open
it defaulted to FALSE for inverted colors.

origin commit:
abb5060
https://github.com/linuxmint/xreader/issues/38
2018-04-03 16:42:05 +03:00
raveit65
f88b6466e4 epub: allow to save epub documents
inspired by:
https://github.com/linuxmint/xreader/commit/63a28f
https://github.com/linuxmint/xreader/issues/165
2018-04-03 16:27:46 +03:00
monsta
3b64a16466 libview: Fix shift+click text selection
ported from e6672a875c for 1.18 branch
2018-04-03 15:32:29 +03:00
monsta
21254c4342 libview: fix text selection with mouse in annotation window
taken from:
91ac78bc58
2018-04-03 13:01:34 +03:00
monsta
3374686ba2 libview: fix occasional black color of annotation window border
and remove redundant gtk_container_set_border_width call

taken from:
204d543efd
2018-04-02 14:54:25 +03:00
Nelson Benitez Leon
ac75aa493d libview: fix annotation window focus change after creation
Be able to start entering text right after selecting
or creating an annotation, also hide text cursor
when window goes unfocused (backdrop state).

https://bugzilla.gnome.org/show_bug.cgi?id=668446

taken from:
https://git.gnome.org/browse/evince/commit/?id=fc8fe57
2018-04-02 14:13:03 +03:00
José Aliste
4b345b72c7 libview: Fix focus on ev_annotation_window
Make annotation windows always accept input focus. Based on patch by
Florian Echtler.

https://bugzilla.gnome.org/show_bug.cgi?id=668446

Taken from:
https://git.gnome.org/browse/evince/commit/?id=24c1029
2018-04-02 14:13:03 +03:00
Carlos Garcia Campos
4a7546d4f3 libview: Don't change the font color of the annotation window
We were using the annotation color, but it should only be used for the
background of the annotation window.

https://bugzilla.gnome.org/show_bug.cgi?id=677471

taken from:
https://git.gnome.org/browse/evince/commit/?id=792d878
2018-04-02 14:13:03 +03:00
raveit65
2164784f77 libview: setting annotation window icons sizes
After a gtk update, the sizes of the icons on the
annotation window (close and resize handles) are
48x48. This patch fixes this by using GtkIconTheme
to force the loading of the icon on a different
size than the file

taken from:
https://git.gnome.org/browse/evince/commit/?id=63d0b4b
2018-04-02 14:12:57 +03:00
raveit65
14d9762389 libview: fix build without epub
Fixes https://github.com/mate-desktop/atril/issues/308
2018-03-27 15:19:07 +03:00
raveit65
315bfd267b release 1.18.4 2018-03-22 13:37:06 +01:00
Mickael Albertus
9af37879b1 epub: fix loading epub thumbnails
origin commit:
6ed0ee1

Note: origin commit causes some serious build warnings,
......fixed.
2018-03-22 13:30:20 +01:00
monsta
83fa307fb1 epub: make minizip support more BSD variants
closes https://github.com/mate-desktop/atril/issues/290 which has the original patch
2018-03-22 13:24:58 +01:00
raveit65
04cd721160 previewer: add style class atril-previewer-window
Fixes https://github.com/mate-desktop/atril/issues/289
2018-03-22 13:24:02 +01:00
Tobias Mueller
20c06fd4cf dvi: Mitigate command injection attacks by quoting filename
With commit 1fcca0b8041de0d6074d7e17fba174da36c65f99 came a DVI backend.
It exports to PDF via the dvipdfm tool.
It calls that tool with the filename of the currently loaded document.
If that filename is cleverly crafted, it can escape the currently
used manual quoting of the filename.  Instead of manually quoting the
filename, we use g_shell_quote.

https://bugzilla.gnome.org/show_bug.cgi?id=784947

origin commit:
https://git.gnome.org/browse/evince/commit/?id=350404c
2018-03-22 13:11:35 +01:00
raveit65
dac836ae16 release 1.18.3
NEWS file wasn't updated with previous release
....shit happens
2017-11-21 20:38:33 +01:00
raveit65
4145ce469d release 1.18.2 2017-11-20 20:58:03 +01:00
raveit65
d555ad7a69 sync with transifex 2017-11-20 20:16:57 +01:00
raveit65
aaebf214c5 libmisc: set width chars for page label
and use xalign

fixes https://github.com/mate-desktop/atril/issues/275
2017-11-20 20:09:13 +01:00
Owen W. Taylor
4287f17c25 EvPixbufCache: Handle backends that don't render a selection
Handle the case where ev_selection_render_selection() doesn't actually
render a surface - this happens when a backend doesn't implement
render_selection().

https://bugzilla.gnome.org/show_bug.cgi?id=723431

origin commit:
https://git.gnome.org/browse/evince/commit/?id=c5a338c

fixes https://github.com/mate-desktop/atril/issues/283
2017-11-03 16:21:05 +01:00
raveit65
a3486a2dbd release 1.18.1 2017-08-15 15:48:59 +02:00
raveit65
2e1638bc7b fix runtime warnings caused by previous HDPI commit 2017-08-15 15:31:51 +02:00
Matthew Petroff
c75f49d323 Take monitor scale factor into account when calculating zoom.
c47a1f4
2017-08-15 15:31:07 +02:00
Matthew Petroff
31251cb120 Add hi-dpi support for main view.
Based on Evince commits 8b965e769808815df9c75a10a0e4972c0904d26a
and a612f809e4e23d88a661a9604ce84f332189a658.

4eccf6b
2017-08-15 15:30:32 +02:00
monsta
869befa181 update copyright year in Caja extension 2017-08-15 15:21:04 +02:00
raveit65
7163c0aff0 sync with transifex 2017-08-15 14:59:21 +02:00
Nelson Benitez Leon
1aa348016c sidebar-thumbnails: fix unwanted move to start after fullscreen
After activating or deactivating fullscreen mode, the sidebar
window is automatically moved to its start, while scroll bar
stays in its original position.

The sidebar window move is unwanted and unsolicited, and it's
most probably caused by GtkIconView or GtkScrolledWindow bug.

Workaround this by having the sidebar sync its window with the
current scroll position after a fullscreen operation, do that by
just emitting a "value-changed" on the current scroll adjustment.

https://bugzilla.gnome.org/show_bug.cgi?id=783404
origin commit:
https://git.gnome.org/browse/evince/commit/?id=2bfb8fa
2017-08-15 14:46:29 +02:00
Nelson Benitez Leon
a128703a55 sidebar-thumbnails: preload one extra visible range while scrolling
Preload both before and after current visible scrolling range,
the same amount of thumbnails in it, to help prevent thumbnail
creation happening in the user's sight.

https://bugzilla.gnome.org/show_bug.cgi?id=342110#c15
origin commit:
https://git.gnome.org/browse/evince/commit/?id=1fc8c68
2017-08-15 14:45:59 +02:00
Nelson Benitez Leon
b601eabe60 sidebar-thumbnails: keep thumbnails already rendered
Evince renders thumbnails on-the-fly as they get into the
scrolling visible area, but at the same time it will remove
them as they get out of the visible scrolling area, so when
user scrolls back to same position he will notice thumbnails
be recreated.

In pro of a more icing user experience, let's adopt a mixed approach
and keep the thumbnails that the user has already navigated, so
when he scrolls back and forth in the same area no thumbnail
re-generation will be visible. This also matches behaviour with
other pdf readers.

https://bugzilla.gnome.org/show_bug.cgi?id=342110
origin commit:
https://git.gnome.org/browse/evince/commit/?id=121e4d9
2017-08-15 14:45:34 +02:00
Nelson Benitez Leon
0b90c31ddc sidebar-thumbnails: fix clunky scrolling
Caused by GtkIconView doing an invalidate and relayout of *all*
items in the view anytime we update model data in any indiviual
item (which happens with all the items that are getting in and out
of the scrolling area while we scroll). This caused GtkIconView to
machine-gunned us with "size-allocate" signals, a signal we were
using to update thumbnails when the sidebar is resized.

Fixed by connecting to the GtkTreeModel "row-changed" signal before
GtkIconView does it, and stop emission from there.

As we don't depend now on "size-allocate" signals to show thumbnails
while we scroll, just queue a draw on the icon view when a
thumbnail finish rendering.

Thanks Jose Aliste for first spotting the problem.

https://bugzilla.gnome.org/show_bug.cgi?id=691448
origin commit:
https://git.gnome.org/browse/evince/commit/?id=6480c70

Fixes https://github.com/mate-desktop/atril/issues/255
2017-08-15 14:45:04 +02:00
raveit65
32e67cc51d sidebar-layers: Make it actually usable and fix a runtime warning
Expand the scrolled window vertical so that you can actually
see the content of the widget. This also turned up a missing
gtk_style_context_save () in gimpcellrenderertoggle.c.
So fix that as well.

partial inspired from:
6b6ae7f
2017-08-15 14:22:17 +02:00
raveit65
62440325ce libview: save changes to a dropdown in an embedded form
This is a regression from commit
f8aec90

see:
46298df
https://github.com/linuxmint/xreader/issues/12
2017-08-15 14:21:29 +02:00
raveit65
a7dd748aab ev-window: remove deprecated GtkToolbar-shadow-type
Whole the function fullscreen_toolbar_remove_shadow isn't needed
without that deprecation.
Setting instead the widget name to make theming possible.
GtkToolbar-shadow-type is deprecated since gtk+-3.6
2017-08-15 14:20:33 +02:00
raveit65
13ece1f6fc annotation-properties-dialog: don't use a headerbar
Fixes https://github.com/mate-desktop/atril/issues/264
2017-08-07 16:02:32 +02:00
raveit65
21e8529bb6 sync with transifex 2017-07-22 11:40:45 +02:00
ZenWalker
213c8788cc comics: make the files containing "--checkpoint-action=" unsupported
Fixes #257
2017-07-22 11:37:30 +02:00
raveit65
8a476dc956 sync with transifex 2017-05-10 15:59:49 +02:00
monsta
bd9d363403 update copyright year to 2017 2017-04-18 21:40:49 +03:00
monsta
f57172ab53 build: properly clean the generated .caja-extension file 2017-04-18 21:40:42 +03:00
monsta
289e64022d build: require cairo >= 1.10.0 and drop some old code 2017-04-18 21:40:35 +03:00
Baurzhan Muftakhidinov
88aa5bd7a8 Add missing comma. 2017-04-18 21:40:13 +03:00
129 changed files with 28256 additions and 25485 deletions

52
NEWS
View file

@ -1,3 +1,55 @@
### atril 1.18.5
* Fix build without epub
* Disable presentation if there is no document or document
has no pages (fixes some crashes)
* epub: allow to save epub documents
* libview: check number of pages on ev_view_document_changed_cb
(fixes crash on corrupted PDF with no pages)
* libview: setting annotation window icons sizes
* libview: don't change the font color of the annotation window
* libview: fix focus on ev_annotation_window
* libview: fix annotation window focus change after creation
* libview: fix occasional black color of annotation window border
* libview: fix text selection with mouse in annotation window
* libview: fix shift+click text selection
* libview: save inverted colors in a document
* libview: fix goto window in presentation mode
* libview: fix a crash in ev_view_accessible_get_link
### atril 1.18.4
* epub: fix loading epub thumbnails
* epub: make minizip support more BSD variants
* previewer: add style class atril-previewer-window
* dvi: Mitigate command injection attacks by quoting filename
### atril 1.18.3
* update NEWS
### atril 1.18.2
* Translations update
* libmisc: set width chars for page label
* EvPixbufCache: Handle backends that don't render a selection
### atril 1.18.1
* Take monitor scale factor into account when calculating zoom.
* Add hi-dpi support for main view.
* sidebar-thumbnails: fix unwanted move to start after fullscreen
* sidebar-thumbnails: preload one extra visible range while scrolling
* sidebar-thumbnails: keep thumbnails already rendered
* sidebar-thumbnails: fix clunky scrolling
* sidebar-layers: Make it actually usable and fix a runtime warning
* libview: save changes to a dropdown in an embedded form
* ev-window: remove deprecated GtkToolbar-shadow-type
* annotation-properties-dialog: don't use a headerbar
* comics: make the files containing "--checkpoint-action=" unsupported
* Translations update
* update copyright year to 2017
### atril 1.18.0
* NEWS: use consistent, project wide, markdown-like formatting to make

View file

@ -983,6 +983,12 @@ extract_argv (EvDocument *document, gint page)
char *command_line, *quoted_archive, *quoted_filename;
GError *err = NULL;
if (g_strrstr (comics_document->page_names->pdata[page], "--checkpoint-action="))
{
g_warning ("File unsupported\n");
gtk_main_quit ();
}
if (page >= comics_document->page_names->len)
return NULL;

View file

@ -374,11 +374,13 @@ dvi_document_file_exporter_end (EvFileExporter *exporter)
gboolean success;
DviDocument *dvi_document = DVI_DOCUMENT(exporter);
gchar* quoted_filename = g_shell_quote (dvi_document->context->filename);
command_line = g_strdup_printf ("dvipdfm %s -o %s \"%s\"", /* dvipdfm -s 1,2,.., -o exporter_filename dvi_filename */
command_line = g_strdup_printf ("dvipdfm %s -o %s %s", /* dvipdfm -s 1,2,.., -o exporter_filename dvi_filename */
dvi_document->exporter_opts->str,
dvi_document->exporter_filename,
dvi_document->context->filename);
quoted_filename);
g_free (quoted_filename);
success = g_spawn_command_line_sync (command_line,
NULL,

View file

@ -124,9 +124,10 @@ epub_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
cairo_surface_t *webpage;
GdkPixbuf *thumbnailpix = NULL ;
gint width,height;
epub_document_thumbnails_get_dimensions(document,rc,&width,&height);
webpage = ev_document_misc_surface_rotate_and_scale(rc->page->backend_page,width,height,0);
thumbnailpix = ev_document_misc_pixbuf_from_surface(webpage);
epub_document_thumbnails_get_dimensions (document, rc, &width, &height);
webpage = ev_document_misc_surface_rotate_and_scale (rc->page->backend_page,
width, height, 0);
thumbnailpix = ev_document_misc_pixbuf_from_surface (webpage);
return thumbnailpix;
}
@ -351,7 +352,11 @@ epub_document_save (EvDocument *document,
{
EpubDocument *epub_document = EPUB_DOCUMENT (document);
return ev_xfer_uri_simple (epub_document->archivename, uri, error);
gchar *source_uri = g_filename_to_uri (epub_document->archivename, NULL, error);
if (source_uri == NULL)
return FALSE;
return ev_xfer_uri_simple (source_uri, uri, error);
}
static int

View file

@ -50,7 +50,7 @@
#define ftello64 ftell
#define fseeko64 fseek
#else
#ifdef __FreeBSD__
#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
#define fopen64 fopen
#define ftello64 ftello
#define fseeko64 fseeko

View file

@ -4,7 +4,7 @@
m4_define([ev_major_version], [1])
m4_define([ev_minor_version], [18])
m4_define([ev_micro_version], [0])
m4_define([ev_micro_version], [5])
m4_define([ev_extra_version], [])
m4_define([ev_version], [ev_major_version.ev_minor_version.ev_micro_version()ev_extra_version])
@ -94,7 +94,7 @@ AC_ARG_WITH([gtk],
AC_MSG_RESULT([$with_gtk])
dnl Specify required versions of dependencies
CAIRO_REQUIRED=1.9.10
CAIRO_REQUIRED=1.10.0
GLIB_REQUIRED=2.36.0
GTK_REQUIRED=3.14.0
WEBKIT_REQUIRED=2.4.3
@ -123,6 +123,23 @@ PKG_CHECK_MODULES(GMODULE, gmodule-2.0 >= $GLIB_REQUIRED)
PKG_CHECK_MODULES([SHELL_CORE],[libxml-2.0 >= $LIBXML_REQUIRED gtk+-3.0 >= $GTK_REQUIRED gio-2.0 >= $GLIB_REQUIRED gthread-2.0 x11])
# Although GTK+ 3.10 includes hi-dpi functionality, it does not require a cairo with
# cairo_surface_set_device_scale(), which we also need if we're to support hi-dpi,
# so we need check for that explicity.
atril_save_LIBS=$LIBS
LIBS="$LIBS $LIBVIEW_LIBS"
AC_CHECK_FUNCS(cairo_surface_set_device_scale)
LIBS=$atril_save_LIBS
AC_MSG_CHECKING([for hi-dpi support])
if test "$ac_cv_func_cairo_surface_set_device_scale" = yes ; then
AC_DEFINE([HAVE_HIDPI_SUPPORT], [1], [Define if cairo and GTK+ have necessary functions for hi-dpi])
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
dnl
dnl zlib support
dnl

View file

@ -343,6 +343,7 @@ gimp_cell_renderer_toggle_render (GtkCellRenderer *cell,
gdk_rectangle_intersect (&clip_rect, cell_area, &draw_rect))
{
cairo_save (cr);
gtk_style_context_save (context);
gdk_cairo_rectangle (cr, &draw_rect);
cairo_clip (cr);
gtk_render_frame (context, //gtk_widget_get_style_context (widget),

View file

@ -379,7 +379,7 @@ ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf)
}
gdouble
ev_document_misc_get_screen_dpi (GdkScreen *screen)
ev_document_misc_get_screen_dpi (GdkScreen *screen, gint monitor)
{
gdouble dp, di;
@ -389,6 +389,10 @@ ev_document_misc_get_screen_dpi (GdkScreen *screen)
/*diagonal in inches*/
di = hypot (gdk_screen_get_width_mm(screen), gdk_screen_get_height_mm (screen)) / 25.4;
#ifdef HAVE_HIDPI_SUPPORT
di /= gdk_screen_get_monitor_scale_factor(screen, monitor);
#endif
return (dp / di);
}

View file

@ -58,7 +58,7 @@ cairo_surface_t *ev_document_misc_surface_rotate_and_scale (cairo_surface_t *sur
void ev_document_misc_invert_surface (cairo_surface_t *surface);
void ev_document_misc_invert_pixbuf (GdkPixbuf *pixbuf);
gdouble ev_document_misc_get_screen_dpi (GdkScreen *screen);
gdouble ev_document_misc_get_screen_dpi (GdkScreen *screen, gint monitor);
gchar *ev_document_misc_format_date (GTime utime);

View file

@ -181,6 +181,12 @@ ev_page_action_widget_init (EvPageActionWidget *action_widget)
gtk_widget_show (action_widget->entry);
action_widget->label = gtk_label_new (NULL);
gtk_label_set_width_chars (GTK_LABEL (action_widget->label), 14);
#if GTK_CHECK_VERSION (3, 16, 0)
gtk_label_set_xalign (GTK_LABEL (action_widget->label), 0.0);
#else
gtk_misc_set_alignment (GTK_MISC (action_widget->label), 0.0, 0.5);
#endif
gtk_box_pack_start (GTK_BOX (hbox), action_widget->label,
FALSE, FALSE, 0);
gtk_widget_show (action_widget->label);

View file

@ -75,8 +75,6 @@ static guint signals[N_SIGNALS] = { 0 };
G_DEFINE_TYPE (EvAnnotationWindow, ev_annotation_window, GTK_TYPE_WINDOW)
#define EV_ICON_SIZE_ANNOT_WINDOW (ev_annotation_window_get_icon_size())
/* Cut and paste from gtkwindow.c */
static void
send_focus_change (GtkWidget *widget,
@ -99,20 +97,11 @@ static gdouble
get_screen_dpi (EvAnnotationWindow *window)
{
GdkScreen *screen;
gint monitor;
screen = gtk_window_get_screen (GTK_WINDOW (window));
return ev_document_misc_get_screen_dpi (screen);
}
static GtkIconSize
ev_annotation_window_get_icon_size (void)
{
static GtkIconSize icon_size = 0;
if (G_UNLIKELY (icon_size == 0))
icon_size = gtk_icon_size_register ("ev-icon-size-annot-window", 8, 8);
return icon_size;
monitor = gdk_screen_get_primary_monitor (screen);
return ev_document_misc_get_screen_dpi (screen, monitor);
}
static void
@ -145,7 +134,6 @@ ev_annotation_window_set_color (EvAnnotationWindow *window,
properties = gtk_style_properties_new ();
gtk_style_properties_set (properties, 0,
"color", &rgba,
"background-color", &rgba,
NULL);
@ -259,14 +247,14 @@ ev_annotation_window_set_resize_cursor (GtkWidget *widget,
}
}
static gboolean
text_view_button_press (GtkWidget *widget,
GdkEventButton *event,
EvAnnotationWindow *window)
static void
text_view_state_flags_changed (GtkWidget *widget,
GtkStateFlags previous_flags)
{
ev_annotation_window_grab_focus (window);
GtkStateFlags current_flags = gtk_widget_get_state_flags (widget);
return FALSE;
if (current_flags & GTK_STATE_FLAG_BACKDROP)
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (widget), FALSE);
}
static void
@ -276,12 +264,38 @@ ev_annotation_window_close (EvAnnotationWindow *window)
g_signal_emit (window, signals[CLOSED], 0);
}
static gboolean
ev_annotation_window_button_press_event (GtkWidget *widget,
GdkEventButton *event)
{
EvAnnotationWindow *window = EV_ANNOTATION_WINDOW (widget);
if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
window->in_move = TRUE;
window->x = event->x_root - event->x;
window->y = event->y_root - event->y;
gtk_window_begin_move_drag (GTK_WINDOW (widget),
event->button,
event->x_root,
event->y_root,
event->time);
return TRUE;
}
return FALSE;
}
static void
ev_annotation_window_init (EvAnnotationWindow *window)
{
GtkWidget *vbox, *hbox;
GtkWidget *icon;
GtkWidget *swindow;
GtkWidget *header;
GtkIconTheme *icon_theme;
GdkPixbuf *pixbuf;
icon_theme = gtk_icon_theme_get_default ();
gtk_widget_set_can_focus (GTK_WIDGET (window), TRUE);
@ -294,17 +308,28 @@ ev_annotation_window_init (EvAnnotationWindow *window)
gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
gtk_widget_show (icon);
header = gtk_event_box_new ();
gtk_widget_add_events (header, GDK_BUTTON_PRESS_MASK);
g_signal_connect_swapped (header, "button-press-event",
G_CALLBACK (ev_annotation_window_button_press_event),
window);
window->title = gtk_label_new (NULL);
gtk_box_pack_start (GTK_BOX (hbox), window->title, TRUE, TRUE, 0);
gtk_container_add (GTK_CONTAINER (header), window->title);
gtk_widget_show (window->title);
gtk_box_pack_start (GTK_BOX (hbox), header, TRUE, TRUE, 0);
gtk_widget_show (header);
window->close_button = gtk_button_new ();
gtk_button_set_relief (GTK_BUTTON (window->close_button), GTK_RELIEF_NONE);
gtk_container_set_border_width (GTK_CONTAINER (window->close_button), 0);
g_signal_connect_swapped (window->close_button, "clicked",
G_CALLBACK (ev_annotation_window_close),
window);
icon = gtk_image_new_from_stock (EV_STOCK_CLOSE, EV_ICON_SIZE_ANNOT_WINDOW);
pixbuf = gtk_icon_theme_load_icon (icon_theme, EV_STOCK_CLOSE, 8, GTK_ICON_LOOKUP_FORCE_SIZE, NULL);
icon = gtk_image_new_from_pixbuf (pixbuf);
g_object_unref (pixbuf);
gtk_container_add (GTK_CONTAINER (window->close_button), icon);
gtk_widget_show (icon);
@ -321,9 +346,9 @@ ev_annotation_window_init (EvAnnotationWindow *window)
GTK_POLICY_AUTOMATIC);
window->text_view = gtk_text_view_new ();
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (window->text_view), GTK_WRAP_WORD);
g_signal_connect (window->text_view, "button_press_event",
G_CALLBACK (text_view_button_press),
window);
g_signal_connect (window->text_view, "state-flags-changed",
G_CALLBACK (text_view_state_flags_changed),
window);
gtk_container_add (GTK_CONTAINER (swindow), window->text_view);
gtk_widget_show (window->text_view);
@ -342,7 +367,9 @@ ev_annotation_window_init (EvAnnotationWindow *window)
G_CALLBACK (ev_annotation_window_set_resize_cursor),
window);
icon = gtk_image_new_from_stock (EV_STOCK_RESIZE_SW, EV_ICON_SIZE_ANNOT_WINDOW);
pixbuf = gtk_icon_theme_load_icon (icon_theme, EV_STOCK_RESIZE_SW, 8, GTK_ICON_LOOKUP_FORCE_SIZE, NULL);
icon = gtk_image_new_from_pixbuf (pixbuf);
g_object_unref (pixbuf);
gtk_container_add (GTK_CONTAINER (window->resize_sw), icon);
gtk_widget_show (icon);
gtk_box_pack_start (GTK_BOX (hbox), window->resize_sw, FALSE, FALSE, 0);
@ -357,7 +384,9 @@ ev_annotation_window_init (EvAnnotationWindow *window)
G_CALLBACK (ev_annotation_window_set_resize_cursor),
window);
icon = gtk_image_new_from_stock (EV_STOCK_RESIZE_SE, EV_ICON_SIZE_ANNOT_WINDOW);
pixbuf = gtk_icon_theme_load_icon (icon_theme, EV_STOCK_RESIZE_SE, 8, GTK_ICON_LOOKUP_FORCE_SIZE, NULL);
icon = gtk_image_new_from_pixbuf (pixbuf);
g_object_unref (pixbuf);
gtk_container_add (GTK_CONTAINER (window->resize_se), icon);
gtk_widget_show (icon);
gtk_box_pack_end (GTK_BOX (hbox), window->resize_se, FALSE, FALSE, 0);
@ -367,17 +396,14 @@ ev_annotation_window_init (EvAnnotationWindow *window)
gtk_widget_show (hbox);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_container_set_border_width (GTK_CONTAINER (window), 0);
gtk_widget_show (vbox);
gtk_widget_add_events (GTK_WIDGET (window),
GDK_BUTTON_PRESS_MASK |
GDK_KEY_PRESS_MASK);
gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
gtk_container_set_border_width (GTK_CONTAINER (window), 2);
gtk_window_set_accept_focus (GTK_WINDOW (window), FALSE);
gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), TRUE);
gtk_window_set_skip_pager_hint (GTK_WINDOW (window), TRUE);
@ -445,27 +471,6 @@ ev_annotation_window_constructor (GType type,
return object;
}
static gboolean
ev_annotation_window_button_press_event (GtkWidget *widget,
GdkEventButton *event)
{
EvAnnotationWindow *window = EV_ANNOTATION_WINDOW (widget);
if (event->type == GDK_BUTTON_PRESS && event->button == 1) {
window->in_move = TRUE;
window->x = event->x_root - event->x;
window->y = event->y_root - event->y;
gtk_window_begin_move_drag (GTK_WINDOW (widget),
event->button,
event->x_root,
event->y_root,
event->time);
return TRUE;
}
return FALSE;
}
static gboolean
ev_annotation_window_configure_event (GtkWidget *widget,
GdkEventConfigure *event)
@ -496,6 +501,10 @@ ev_annotation_window_focus_in_event (GtkWidget *widget,
window->in_move = FALSE;
}
gtk_widget_grab_focus (window->text_view);
send_focus_change (window->text_view, TRUE);
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (window->text_view), TRUE);
return FALSE;
}
@ -510,24 +519,6 @@ ev_annotation_window_focus_out_event (GtkWidget *widget,
return FALSE;
}
static gboolean
ev_annotation_window_enter_notify_event (GtkWidget *widget,
GdkEventCrossing *event)
{
gtk_window_set_accept_focus (GTK_WINDOW (widget), TRUE);
return FALSE;
}
static gboolean
ev_annotation_window_leave_notify_event (GtkWidget *widget,
GdkEventCrossing *event)
{
gtk_window_set_accept_focus (GTK_WINDOW (widget), FALSE);
return FALSE;
}
static void
ev_annotation_window_class_init (EvAnnotationWindowClass *klass)
{
@ -538,12 +529,9 @@ ev_annotation_window_class_init (EvAnnotationWindowClass *klass)
g_object_class->set_property = ev_annotation_window_set_property;
g_object_class->dispose = ev_annotation_window_dispose;
gtk_widget_class->button_press_event = ev_annotation_window_button_press_event;
gtk_widget_class->configure_event = ev_annotation_window_configure_event;
gtk_widget_class->focus_in_event = ev_annotation_window_focus_in_event;
gtk_widget_class->focus_out_event = ev_annotation_window_focus_out_event;
gtk_widget_class->enter_notify_event = ev_annotation_window_enter_notify_event;
gtk_widget_class->leave_notify_event = ev_annotation_window_leave_notify_event;
g_object_class_install_property (g_object_class,
PROP_ANNOTATION,

View file

@ -92,11 +92,6 @@ enum {
FIND_LAST_SIGNAL
};
#if ENABLE_EPUB
static GtkWidget* webview;
static GtkWidget* offscreenwindow;
#endif
static guint job_signals[LAST_SIGNAL] = { 0 };
static guint job_fonts_signals[FONTS_LAST_SIGNAL] = { 0 };
static guint job_find_signals[FIND_LAST_SIGNAL] = { 0 };
@ -859,6 +854,8 @@ snapshot_callback(WebKitWebView *webview,
ev_document_doc_mutex_unlock ();
ev_job_succeeded (EV_JOB(job_thumb));
gtk_widget_destroy (gtk_widget_get_toplevel (GTK_WIDGET (webview)));
}
static void
@ -888,8 +885,11 @@ webview_load_failed_cb (WebKitWebView *webview,
GError *e = (GError *) error;
g_warning ("Error loading data from %s: %s", failing_uri, e->message);
ev_job_failed_from_error (EV_JOB(job_thumb), e);
gtk_widget_destroy (gtk_widget_get_toplevel (GTK_WIDGET (webview)));
return TRUE;
}
#endif /* ENABLE_EPUB */
static gboolean
@ -921,24 +921,23 @@ ev_job_thumbnail_run (EvJob *job)
#if ENABLE_EPUB
if (job->document->iswebdocument == TRUE) {
if (!webview) {
webview = webkit_web_view_new();
g_signal_connect(WEBKIT_WEB_VIEW(webview),"load-changed",
G_CALLBACK(web_thumbnail_get_screenshot_cb),
g_object_ref (job_thumb));
g_signal_connect(WEBKIT_WEB_VIEW(webview),"load-failed",
G_CALLBACK(webview_load_failed_cb),
g_object_ref (job_thumb));
}
GtkWidget *webview;
GtkWidget *offscreenwindow;
webview = webkit_web_view_new ();
offscreenwindow = gtk_offscreen_window_new ();
if (!offscreenwindow) {
offscreenwindow = gtk_offscreen_window_new();
gtk_container_add(GTK_CONTAINER(offscreenwindow),GTK_WIDGET(webview));
gtk_window_set_default_size (GTK_WINDOW(offscreenwindow),800,1080);
gtk_widget_show_all(offscreenwindow);
}
gtk_container_add (GTK_CONTAINER(offscreenwindow), GTK_WIDGET (webview));
gtk_window_set_default_size (GTK_WINDOW(offscreenwindow), 800, 1080);
gtk_widget_show_all (offscreenwindow);
webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview),(gchar*)rc->page->backend_page);
g_signal_connect (WEBKIT_WEB_VIEW (webview), "load-changed",
G_CALLBACK (web_thumbnail_get_screenshot_cb),
g_object_ref (job_thumb));
g_signal_connect (WEBKIT_WEB_VIEW(webview), "load-failed",
G_CALLBACK(webview_load_failed_cb),
g_object_ref (job_thumb));
webkit_web_view_load_uri (WEBKIT_WEB_VIEW (webview), (gchar*) rc->page->backend_page);
}
else
#endif /* ENABLE_EPUB */

View file

@ -14,6 +14,9 @@ typedef struct _CacheJobInfo
/* Data we get from rendering */
cairo_surface_t *surface;
/* Device scale factor of target widget */
int device_scale;
/* Selection data.
* Selection_points are the coordinates encapsulated in selection.
* target_points is the target selection size. */
@ -235,6 +238,27 @@ ev_pixbuf_cache_set_max_size (EvPixbufCache *pixbuf_cache,
pixbuf_cache->max_size = max_size;
}
static int
get_device_scale (EvPixbufCache *pixbuf_cache)
{
#ifdef HAVE_HIDPI_SUPPORT
return gtk_widget_get_scale_factor (pixbuf_cache->view);
#else
return 1;
#endif
}
static void
set_device_scale_on_surface (cairo_surface_t *surface,
int device_scale)
{
#ifdef HAVE_HIDPI_SUPPORT
cairo_surface_set_device_scale (surface, device_scale, device_scale);
#else
g_return_if_fail (device_scale != 1);
#endif
}
static void
copy_job_to_job_info (EvJobRender *job_render,
CacheJobInfo *job_info,
@ -244,6 +268,7 @@ copy_job_to_job_info (EvJobRender *job_render,
cairo_surface_destroy (job_info->surface);
}
job_info->surface = cairo_surface_reference (job_render->surface);
set_device_scale_on_surface (job_info->surface, job_info->device_scale);
if (pixbuf_cache->inverted_colors) {
ev_document_misc_invert_surface (job_info->surface);
}
@ -262,6 +287,8 @@ copy_job_to_job_info (EvJobRender *job_render,
job_info->selection_points = job_render->selection_points;
job_info->selection_region = cairo_region_reference (job_render->selection_region);
job_info->selection = cairo_surface_reference (job_render->selection);
if (job_info->selection)
set_device_scale_on_surface (job_info->selection, job_info->device_scale);
g_assert (job_info->selection_points.x1 >= 0);
job_info->points_set = TRUE;
}
@ -307,20 +334,24 @@ check_job_size_and_unref (EvPixbufCache *pixbuf_cache,
gfloat scale)
{
gint width, height;
gint device_scale;
g_assert (job_info);
if (job_info->job == NULL)
return;
_get_page_size_for_scale_and_rotation (job_info->job->document,
EV_JOB_RENDER (job_info->job)->page,
scale,
EV_JOB_RENDER (job_info->job)->rotation,
&width, &height);
if (width == EV_JOB_RENDER (job_info->job)->target_width &&
height == EV_JOB_RENDER (job_info->job)->target_height)
return;
device_scale = get_device_scale (pixbuf_cache);
if (job_info->device_scale == device_scale) {
_get_page_size_for_scale_and_rotation (job_info->job->document,
EV_JOB_RENDER (job_info->job)->page,
scale,
EV_JOB_RENDER (job_info->job)->rotation,
&width, &height);
if (width * device_scale == EV_JOB_RENDER (job_info->job)->target_width &&
height * device_scale == EV_JOB_RENDER (job_info->job)->target_height)
return;
}
g_signal_handlers_disconnect_by_func (job_info->job,
G_CALLBACK (job_finished_cb),
@ -634,6 +665,7 @@ add_job (EvPixbufCache *pixbuf_cache,
gfloat scale,
EvJobPriority priority)
{
job_info->device_scale = get_device_scale (pixbuf_cache);
job_info->page_ready = FALSE;
if (job_info->region)
@ -641,8 +673,10 @@ add_job (EvPixbufCache *pixbuf_cache,
job_info->region = region ? cairo_region_reference (region) : NULL;
job_info->job = ev_job_render_new (pixbuf_cache->document,
page, rotation, scale,
width, height);
page, rotation,
scale * job_info->device_scale,
width * job_info->device_scale,
height * job_info->device_scale);
if (new_selection_surface_needed (pixbuf_cache, job_info, page, scale)) {
GdkColor text, base;
@ -667,6 +701,7 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache,
gfloat scale,
EvJobPriority priority)
{
gint device_scale = get_device_scale (pixbuf_cache);
gint width, height;
if (job_info->job)
@ -677,8 +712,9 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache,
&width, &height);
if (job_info->surface &&
cairo_image_surface_get_width (job_info->surface) == width &&
cairo_image_surface_get_height (job_info->surface) == height)
job_info->device_scale == device_scale &&
cairo_image_surface_get_width (job_info->surface) == width * device_scale &&
cairo_image_surface_get_height (job_info->surface) == height * device_scale)
return;
/* Free old surfaces for non visible pages */
@ -949,7 +985,7 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache,
/* Now, lets see if we need to resize the image. If we do, we clear the
* old one. */
clear_selection_if_needed (pixbuf_cache, job_info, page, scale);
clear_selection_if_needed (pixbuf_cache, job_info, page, scale * job_info->device_scale);
/* Finally, we see if the two scales are the same, and get a new pixbuf
* if needed. We do this synchronously for now. At some point, we
@ -973,7 +1009,7 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache,
}
ev_page = ev_document_get_page (pixbuf_cache->document, page);
rc = ev_render_context_new (ev_page, 0, scale);
rc = ev_render_context_new (ev_page, 0, scale * job_info->device_scale);
g_object_unref (ev_page);
if (job_info->selection_region)
@ -991,6 +1027,8 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache,
old_points,
job_info->selection_style,
&text, &base);
if (job_info->selection)
set_device_scale_on_surface (job_info->selection, job_info->device_scale);
job_info->selection_points = job_info->target_points;
g_object_unref (rc);
ev_document_doc_mutex_unlock ();

View file

@ -829,6 +829,9 @@ ev_view_accessible_get_link (AtkHypertext *hypertext,
EvMapping *mapping;
EvLinkAccessible *atk_link;
if (link_index < 0)
return NULL;
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (hypertext));
if (widget == NULL)
/* State is defunct */
@ -849,6 +852,9 @@ ev_view_accessible_get_link (AtkHypertext *hypertext,
return NULL;
n_links = ev_mapping_list_length (link_mapping);
if (link_index > n_links - 1)
return NULL;
mapping = ev_mapping_list_nth (link_mapping, n_links - link_index - 1);
atk_link = ev_link_accessible_new (EV_VIEW_ACCESSIBLE (hypertext),
EV_LINK (mapping->data),

View file

@ -650,9 +650,9 @@ ev_view_presentation_goto_window_create (EvViewPresentation *pview)
GtkWindow *toplevel, *goto_window;
toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (pview)));
goto_window = GTK_WINDOW (pview->goto_window);
if (pview->goto_window) {
goto_window = GTK_WINDOW (pview->goto_window);
if (gtk_window_has_group (toplevel))
gtk_window_group_add_window (gtk_window_get_group (toplevel), goto_window);
else if (gtk_window_has_group (goto_window))
@ -662,6 +662,7 @@ ev_view_presentation_goto_window_create (EvViewPresentation *pview)
}
pview->goto_window = gtk_window_new (GTK_WINDOW_POPUP);
goto_window = GTK_WINDOW (pview->goto_window);
gtk_window_set_screen (goto_window, gtk_widget_get_screen (GTK_WIDGET (pview)));
if (gtk_window_has_group (toplevel))

View file

@ -2177,7 +2177,7 @@ ev_view_form_field_text_create_widget (EvView *view,
g_free (txt);
}
g_signal_connect( buffer, "focus-out-event",
g_signal_connect (text, "focus-out-event",
G_CALLBACK (ev_view_form_field_text_focus_out),
view);
g_signal_connect (buffer, "changed",
@ -2235,7 +2235,7 @@ ev_view_form_field_choice_changed (GtkWidget *widget,
{
EvFormFieldChoice *field_choice = EV_FORM_FIELD_CHOICE (field);
if (gtk_combo_box_get_has_entry ( GTK_COMBO_BOX (widget))) {
if (GTK_IS_COMBO_BOX (widget)) {
gint item;
item = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
@ -3601,13 +3601,29 @@ start_selection_for_event (EvView *view,
&(view->selection_info.start));
}
static void
extend_selection (EvView *view,
GdkPoint *start_point,
GdkPoint *end_point)
{
if (!view->selection_info.selections) {
view->selection_info.start.x = start_point->x;
view->selection_info.start.y = start_point->y;
}
compute_selections (view,
EV_SELECTION_STYLE_GLYPH,
&(view->selection_info.start),
end_point);
}
static gboolean
ev_view_button_press_event (GtkWidget *widget,
GdkEventButton *event)
{
EvView *view = EV_VIEW (widget);
if (!view->document)
if (!view->document || ev_document_get_n_pages (view->document) <= 0)
return FALSE;
if (!gtk_widget_has_focus (widget)) {
@ -3643,6 +3659,12 @@ ev_view_button_press_event (GtkWidget *widget,
if (EV_IS_SELECTION (view->document) && view->selection_info.selections) {
if (event->type == GDK_3BUTTON_PRESS) {
start_selection_for_event (view, event);
} else if (event->state & GDK_SHIFT_MASK) {
GdkPoint end_point;
end_point.x = event->x + view->scroll_x;
end_point.y = event->y + view->scroll_y;
extend_selection (view, &view->selection_info.start, &end_point);
} else if (location_in_selected_text (view,
event->x + view->scroll_x,
event->y + view->scroll_y)) {
@ -4463,6 +4485,7 @@ draw_one_page (EvView *view,
cairo_surface_t *page_surface = NULL;
gint selection_width, selection_height;
cairo_surface_t *selection_surface = NULL;
double device_scale_x = 1, device_scale_y = 1;
page_surface = ev_pixbuf_cache_get_surface (view->pixbuf_cache, page);
@ -4475,6 +4498,10 @@ draw_one_page (EvView *view,
return;
}
#ifdef HAVE_HIDPI_SUPPORT
cairo_surface_get_device_scale (page_surface, &device_scale_x, &device_scale_y);
#endif
if (page == current_page)
hide_loading_window (view);
@ -4490,13 +4517,13 @@ draw_one_page (EvView *view,
cairo_pattern_set_filter (cairo_get_source (cr),
CAIRO_FILTER_FAST);
cairo_scale (cr,
(gdouble)width / page_width,
(gdouble)height / page_height);
(gdouble)width / page_width * device_scale_x,
(gdouble)height / page_height * device_scale_y);
}
cairo_surface_set_device_offset (page_surface,
overlap.x - real_page_area.x,
overlap.y - real_page_area.y);
(overlap.x - real_page_area.x) * device_scale_x,
(overlap.y - real_page_area.y) * device_scale_y);
cairo_set_source_surface (cr, page_surface, 0, 0);
cairo_paint (cr);
cairo_restore (cr);
@ -4525,13 +4552,13 @@ draw_one_page (EvView *view,
cairo_pattern_set_filter (cairo_get_source (cr),
CAIRO_FILTER_FAST);
cairo_scale (cr,
(gdouble)width / selection_width,
(gdouble)height / selection_height);
(gdouble)width / selection_width * device_scale_x,
(gdouble)height / selection_height * device_scale_y);
}
cairo_surface_set_device_offset (selection_surface,
overlap.x - real_page_area.x,
overlap.y - real_page_area.y);
(overlap.x - real_page_area.x) * device_scale_x,
(overlap.y - real_page_area.y) * device_scale_y);
cairo_set_source_surface (cr, selection_surface, 0, 0);
cairo_paint (cr);
@ -4872,6 +4899,14 @@ ev_view_class_init (EvViewClass *class)
GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, TRUE);
}
static void
on_notify_scale_factor (EvView *view,
GParamSpec *pspec)
{
if (view->document)
view_update_range_and_current_page (view);
}
static void
ev_view_init (EvView *view)
{
@ -4918,6 +4953,9 @@ ev_view_init (EvView *view)
view->pending_scroll = SCROLL_TO_KEEP_POSITION;
view->jump_to_find_result = TRUE;
view->highlight_find_results = FALSE;
g_signal_connect (view, "notify::scale-factor",
G_CALLBACK (on_notify_scale_factor), NULL);
}
/*** Callbacks ***/
@ -5194,12 +5232,15 @@ ev_view_document_changed_cb (EvDocumentModel *model,
g_object_unref (view->document);
}
view->document = document;
view->document = document ? g_object_ref (document) : NULL;
view->find_result = 0;
if (view->document) {
if (ev_document_get_n_pages (view->document) <= 0 ||
!ev_document_check_dimensions (view->document))
return;
view->loading = FALSE;
g_object_ref (view->document);
setup_caches (view);
}
@ -6043,18 +6084,7 @@ merge_selection_region (EvView *view,
* changed, so we xor the old and new regions
* and redraw if it's different */
region = cairo_region_copy (old_sel->covered_region);
#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 9, 12)
cairo_region_xor (region, new_sel->covered_region);
#else
cairo_region_t *tbr;
tbr = cairo_region_copy (new_sel->covered_region);
/* xor old_sel, new_sel*/
cairo_region_subtract (tbr, region);
cairo_region_subtract (region, new_sel->covered_region);
cairo_region_union (region, tbr);
cairo_region_destroy (tbr);
#endif
if (cairo_region_is_empty (region)) {
cairo_region_destroy (region);

View file

@ -252,6 +252,9 @@ ev_web_view_inverted_colors_changed_cb (EvDocumentModel *model,
EvWebView *webview)
{
EvDocument *document = ev_document_model_get_document(model);
if (!document || !document->iswebdocument)
return;
if (ev_document_model_get_inverted_colors(model) == TRUE) {
if (document == NULL) {

View file

@ -4,6 +4,7 @@ am
ar
as
ast
az
be
bg
bn
@ -17,6 +18,7 @@ cs
cy
da
de
de_CH
dz
el
en_AU

480
po/af.po

File diff suppressed because it is too large Load diff

482
po/am.po

File diff suppressed because it is too large Load diff

484
po/ar.po

File diff suppressed because it is too large Load diff

480
po/as.po

File diff suppressed because it is too large Load diff

480
po/ast.po

File diff suppressed because it is too large Load diff

1783
po/az.po Normal file

File diff suppressed because it is too large Load diff

484
po/be.po

File diff suppressed because it is too large Load diff

486
po/bg.po

File diff suppressed because it is too large Load diff

480
po/bn.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

480
po/br.po

File diff suppressed because it is too large Load diff

494
po/bs.po

File diff suppressed because it is too large Load diff

486
po/ca.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

480
po/cmn.po

File diff suppressed because it is too large Load diff

485
po/cs.po

File diff suppressed because it is too large Load diff

480
po/cy.po

File diff suppressed because it is too large Load diff

484
po/da.po

File diff suppressed because it is too large Load diff

485
po/de.po

File diff suppressed because it is too large Load diff

1784
po/de_CH.po Normal file

File diff suppressed because it is too large Load diff

480
po/dz.po

File diff suppressed because it is too large Load diff

482
po/el.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

482
po/eo.po

File diff suppressed because it is too large Load diff

484
po/es.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

484
po/et.po

File diff suppressed because it is too large Load diff

484
po/eu.po

File diff suppressed because it is too large Load diff

483
po/fa.po

File diff suppressed because it is too large Load diff

493
po/fi.po

File diff suppressed because it is too large Load diff

485
po/fr.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

556
po/frp.po

File diff suppressed because it is too large Load diff

480
po/ga.po

File diff suppressed because it is too large Load diff

516
po/gl.po

File diff suppressed because it is too large Load diff

480
po/gu.po

File diff suppressed because it is too large Load diff

482
po/he.po

File diff suppressed because it is too large Load diff

480
po/hi.po

File diff suppressed because it is too large Load diff

482
po/hr.po

File diff suppressed because it is too large Load diff

495
po/hu.po

File diff suppressed because it is too large Load diff

486
po/hy.po

File diff suppressed because it is too large Load diff

480
po/ia.po

File diff suppressed because it is too large Load diff

487
po/id.po

File diff suppressed because it is too large Load diff

480
po/is.po

File diff suppressed because it is too large Load diff

485
po/it.po

File diff suppressed because it is too large Load diff

486
po/ja.po

File diff suppressed because it is too large Load diff

480
po/jv.po

File diff suppressed because it is too large Load diff

480
po/ka.po

File diff suppressed because it is too large Load diff

548
po/kk.po

File diff suppressed because it is too large Load diff

482
po/kn.po

File diff suppressed because it is too large Load diff

486
po/ko.po

File diff suppressed because it is too large Load diff

480
po/ks.po

File diff suppressed because it is too large Load diff

480
po/ku.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

480
po/ky.po

File diff suppressed because it is too large Load diff

502
po/lt.po

File diff suppressed because it is too large Load diff

480
po/lv.po

File diff suppressed because it is too large Load diff

480
po/mai.po

File diff suppressed because it is too large Load diff

480
po/mg.po

File diff suppressed because it is too large Load diff

480
po/mk.po

File diff suppressed because it is too large Load diff

480
po/ml.po

File diff suppressed because it is too large Load diff

492
po/mn.po

File diff suppressed because it is too large Load diff

480
po/mr.po

File diff suppressed because it is too large Load diff

486
po/ms.po

File diff suppressed because it is too large Load diff

492
po/nb.po

File diff suppressed because it is too large Load diff

480
po/nds.po

File diff suppressed because it is too large Load diff

480
po/ne.po

File diff suppressed because it is too large Load diff

785
po/nl.po

File diff suppressed because it is too large Load diff

480
po/nn.po

File diff suppressed because it is too large Load diff

480
po/oc.po

File diff suppressed because it is too large Load diff

480
po/or.po

File diff suppressed because it is too large Load diff

480
po/pa.po

File diff suppressed because it is too large Load diff

502
po/pl.po

File diff suppressed because it is too large Load diff

480
po/pms.po

File diff suppressed because it is too large Load diff

480
po/ps.po

File diff suppressed because it is too large Load diff

509
po/pt.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more