[evince/617-get-dpi-from-gdk-monitor: 5/6] libdocument: Get DPI from GdkMonitor
- From: Germán Poo-Caamaño <gpoo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince/617-get-dpi-from-gdk-monitor: 5/6] libdocument: Get DPI from GdkMonitor
- Date: Sat, 23 Nov 2019 18:47:04 +0000 (UTC)
commit 91e015134643c6bd97ae2c037e06b61153ac2c7e
Author: Marek Kasik <mkasik redhat com>
Date: Thu Oct 24 16:28:21 2019 +0200
libdocument: Get DPI from GdkMonitor
Compute DPI from data provided by GdkMonitor instead of
GdkScreen.
Try to obtain current GdkMonitor from GdkDisplay
using gdk_display_get_monitor_at_window(),
if that fails (the GtkWindow has not been realized yet)
then just get primary monitor or the first monitor (primary monitor
has not been set).
Use DPI 96 if everything fails.
Fixes #617
.../libdocument/libevdocument-sections.txt | 1 +
help/reference/shell/evince-sections.txt | 1 -
libdocument/ev-document-misc.c | 48 ++++++++++++++++++++++
libdocument/ev-document-misc.h | 1 +
libview/ev-annotation-window.c | 11 +----
libview/ev-view.c | 23 +++++------
previewer/ev-previewer-window.c | 11 +----
shell/ev-window.c | 19 +++------
shell/ev-zoom-action.c | 10 ++---
9 files changed, 71 insertions(+), 54 deletions(-)
---
diff --git a/help/reference/libdocument/libevdocument-sections.txt
b/help/reference/libdocument/libevdocument-sections.txt
index d6cab6ec..95b0104c 100644
--- a/help/reference/libdocument/libevdocument-sections.txt
+++ b/help/reference/libdocument/libevdocument-sections.txt
@@ -851,6 +851,7 @@ EV_CHECK_VERSION
<TITLE>EvDocumentMisc</TITLE>
ev_document_misc_get_pointer_position
ev_document_misc_get_screen_dpi
+ev_document_misc_get_widget_dpi
ev_document_misc_surface_from_pixbuf
ev_document_misc_pixbuf_from_surface
ev_document_misc_surface_rotate_and_scale
diff --git a/help/reference/shell/evince-sections.txt b/help/reference/shell/evince-sections.txt
index cfbe15ae..d3d4e9e6 100644
--- a/help/reference/shell/evince-sections.txt
+++ b/help/reference/shell/evince-sections.txt
@@ -367,7 +367,6 @@ ev_pixbuf_add_shadow
ev_print_region_contents
ev_gui_menu_position_tree_selection
get_num_monitors
-get_screen_dpi
file_chooser_dialog_add_writable_pixbuf_formats
get_gdk_pixbuf_format_by_extension
</SECTION>
diff --git a/libdocument/ev-document-misc.c b/libdocument/ev-document-misc.c
index a3f239ce..fb6de3ec 100644
--- a/libdocument/ev-document-misc.c
+++ b/libdocument/ev-document-misc.c
@@ -524,6 +524,54 @@ ev_document_misc_get_screen_dpi (GdkScreen *screen)
return (dp / di);
}
+/**
+ * ev_document_misc_get_widget_dpi:
+ * @widget: a #GtkWidget
+ *
+ * Returns DPI for monitor on which given widget has been realized.
+ * Returns DPI of primary monitor or DPI of first monitor in the list inside
+ * of GdkDisplay if the widget has not been realized yet.
+ * Returns 96 as fallback value.
+ *
+ * Returns: DPI as gdouble
+ */
+gdouble
+ev_document_misc_get_widget_dpi (GtkWidget *widget)
+{
+ GdkRectangle geometry;
+ GdkDisplay *display;
+ GdkMonitor *monitor;
+ GdkWindow *window;
+ gdouble dp, di;
+
+ display = gtk_widget_get_display (widget);
+ window = gtk_widget_get_window (widget);
+ if (window != NULL) {
+ monitor = gdk_display_get_monitor_at_window (display, window);
+ } else {
+ monitor = gdk_display_get_primary_monitor (display);
+ if (monitor == NULL)
+ monitor = gdk_display_get_monitor (display, 0);
+ }
+
+ if (monitor != NULL) {
+ /* diagonal in pixels */
+ gdk_monitor_get_geometry (monitor, &geometry);
+ dp = hypot (geometry.width, geometry.height);
+ if (dp == 0)
+ return 96;
+
+ /* diagonal in inches */
+ di = hypot (gdk_monitor_get_width_mm (monitor), gdk_monitor_get_height_mm (monitor)) / 25.4;
+ if (di == 0)
+ return 96;
+
+ return (dp / di);
+ } else {
+ return 96;
+ }
+}
+
/* Returns a locale specific date and time representation */
gchar *
ev_document_misc_format_date (GTime utime)
diff --git a/libdocument/ev-document-misc.h b/libdocument/ev-document-misc.h
index 566d594d..2933e4fc 100644
--- a/libdocument/ev-document-misc.h
+++ b/libdocument/ev-document-misc.h
@@ -81,6 +81,7 @@ 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_widget_dpi (GtkWidget *widget);
gchar *ev_document_misc_format_date (GTime utime);
diff --git a/libview/ev-annotation-window.c b/libview/ev-annotation-window.c
index f5e99af5..f247ca5e 100644
--- a/libview/ev-annotation-window.c
+++ b/libview/ev-annotation-window.c
@@ -103,15 +103,6 @@ send_focus_change (GtkWidget *widget,
gdk_event_free (fevent);
}
-static gdouble
-get_screen_dpi (EvAnnotationWindow *window)
-{
- GdkScreen *screen;
-
- screen = gtk_window_get_screen (GTK_WINDOW (window));
- return ev_document_misc_get_screen_dpi (screen);
-}
-
static void
ev_annotation_window_sync_contents (EvAnnotationWindow *window)
{
@@ -471,7 +462,7 @@ ev_annotation_window_constructor (GType type,
rect = &window->rect;
/* Rectangle is at doc resolution (72.0) */
- scale = get_screen_dpi (window) / 72.0;
+ scale = ev_document_misc_get_widget_dpi (GTK_WIDGET (window)) / 72.0;
gtk_window_resize (GTK_WINDOW (window),
(gint)((rect->x2 - rect->x1) * scale),
(gint)((rect->y2 - rect->y1) * scale));
diff --git a/libview/ev-view.c b/libview/ev-view.c
index b44f38a3..cf75b061 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -254,7 +254,7 @@ static double zoom_for_size_fit_page (gdouble doc_width,
gdouble doc_height,
int target_width,
int target_height);
-static double zoom_for_size_automatic (GdkScreen *screen,
+static double zoom_for_size_automatic (GtkWidget *widget,
gdouble doc_width,
gdouble doc_height,
int target_width,
@@ -526,14 +526,12 @@ is_dual_page (EvView *view,
switch (view->page_layout) {
case EV_PAGE_LAYOUT_AUTOMATIC: {
- GdkScreen *screen;
double scale;
double doc_width;
double doc_height;
GtkAllocation allocation;
- screen = gtk_widget_get_screen (GTK_WIDGET (view));
- scale = ev_document_misc_get_screen_dpi (screen) / 72.0;
+ scale = ev_document_misc_get_widget_dpi (GTK_WIDGET (view)) / 72.0;
ev_document_get_max_page_size (view->document, &doc_width, &doc_height);
gtk_widget_get_allocation (GTK_WIDGET (view), &allocation);
@@ -7369,14 +7367,13 @@ view_update_scale_limits (EvView *view)
gdouble max_scale;
gdouble dpi;
gint rotation;
- GdkScreen *screen;
if (!view->document)
return;
rotation = ev_document_model_get_rotation (view->model);
- screen = gtk_widget_get_screen (GTK_WIDGET (view));
- dpi = ev_document_misc_get_screen_dpi (screen) / 72.0;
+
+ dpi = ev_document_misc_get_widget_dpi (GTK_WIDGET (view)) / 72.0;
ev_document_get_min_page_size (view->document, &min_width, &min_height);
width = (rotation == 0 || rotation == 180) ? min_width : min_height;
@@ -8742,7 +8739,7 @@ zoom_for_size_fit_page (gdouble doc_width,
}
static double
-zoom_for_size_automatic (GdkScreen *screen,
+zoom_for_size_automatic (GtkWidget *widget,
gdouble doc_width,
gdouble doc_height,
int target_width,
@@ -8761,7 +8758,7 @@ zoom_for_size_automatic (GdkScreen *screen,
} else {
double actual_scale;
- actual_scale = ev_document_misc_get_screen_dpi (screen) / 72.0;
+ actual_scale = ev_document_misc_get_widget_dpi (widget) / 72.0;
scale = MIN (fit_width_scale, actual_scale);
}
@@ -8803,7 +8800,7 @@ ev_view_zoom_for_size_continuous_and_dual_page (EvView *view,
scale = zoom_for_size_fit_page (doc_width, doc_height, width - sb_size, height);
break;
case EV_SIZING_AUTOMATIC:
- scale = zoom_for_size_automatic (gtk_widget_get_screen (GTK_WIDGET (view)),
+ scale = zoom_for_size_automatic (GTK_WIDGET (view),
doc_width, doc_height, width - sb_size, height);
break;
default:
@@ -8847,7 +8844,7 @@ ev_view_zoom_for_size_continuous (EvView *view,
scale = zoom_for_size_fit_page (doc_width, doc_height, width - sb_size, height);
break;
case EV_SIZING_AUTOMATIC:
- scale = zoom_for_size_automatic (gtk_widget_get_screen (GTK_WIDGET (view)),
+ scale = zoom_for_size_automatic (GTK_WIDGET (view),
doc_width, doc_height, width - sb_size, height);
break;
default:
@@ -8897,7 +8894,7 @@ ev_view_zoom_for_size_dual_page (EvView *view,
break;
case EV_SIZING_AUTOMATIC:
sb_size = ev_view_get_scrollbar_size (view, GTK_ORIENTATION_VERTICAL);
- scale = zoom_for_size_automatic (gtk_widget_get_screen (GTK_WIDGET (view)),
+ scale = zoom_for_size_automatic (GTK_WIDGET (view),
doc_width, doc_height, width - sb_size, height);
break;
default:
@@ -8935,7 +8932,7 @@ ev_view_zoom_for_size_single_page (EvView *view,
break;
case EV_SIZING_AUTOMATIC:
sb_size = ev_view_get_scrollbar_size (view, GTK_ORIENTATION_VERTICAL);
- scale = zoom_for_size_automatic (gtk_widget_get_screen (GTK_WIDGET (view)),
+ scale = zoom_for_size_automatic (GTK_WIDGET (view),
doc_width, doc_height, width - sb_size, height);
break;
default:
diff --git a/previewer/ev-previewer-window.c b/previewer/ev-previewer-window.c
index fd95274b..6678aa75 100644
--- a/previewer/ev-previewer-window.c
+++ b/previewer/ev-previewer-window.c
@@ -64,15 +64,6 @@ enum {
G_DEFINE_TYPE (EvPreviewerWindow, ev_previewer_window, GTK_TYPE_APPLICATION_WINDOW)
-static gdouble
-get_screen_dpi (EvPreviewerWindow *window)
-{
- GdkScreen *screen;
-
- screen = gtk_window_get_screen (GTK_WINDOW (window));
- return ev_document_misc_get_screen_dpi (screen);
-}
-
#if GTKUNIXPRINT_ENABLED
static void
ev_previewer_window_error_dialog_run (EvPreviewerWindow *window,
@@ -446,7 +437,7 @@ ev_previewer_window_constructor (GType type,
construct_params);
window = EV_PREVIEWER_WINDOW (object);
- dpi = get_screen_dpi (window);
+ dpi = ev_document_misc_get_widget_dpi (GTK_WIDGET (window));
ev_document_model_set_min_scale (window->model, MIN_SCALE * dpi / 72.0);
ev_document_model_set_max_scale (window->model, MAX_SCALE * dpi / 72.0);
ev_document_model_set_sizing_mode (window->model, EV_SIZING_AUTOMATIC);
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 0aa490cf..e46eb250 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -395,15 +395,6 @@ static gchar *nautilus_sendto = NULL;
G_DEFINE_TYPE_WITH_PRIVATE (EvWindow, ev_window, GTK_TYPE_APPLICATION_WINDOW)
-static gdouble
-get_screen_dpi (EvWindow *window)
-{
- GdkScreen *screen;
-
- screen = gtk_window_get_screen (GTK_WINDOW (window));
- return ev_document_misc_get_screen_dpi (screen);
-}
-
static gboolean
ev_window_is_recent_view (EvWindow *ev_window)
{
@@ -1234,7 +1225,7 @@ setup_model_from_metadata (EvWindow *window)
/* Zoom */
if (ev_document_model_get_sizing_mode (priv->model) == EV_SIZING_FREE) {
if (ev_metadata_get_double (priv->metadata, "zoom", &zoom)) {
- zoom *= get_screen_dpi (window) / 72.0;
+ zoom *= ev_document_misc_get_widget_dpi (GTK_WIDGET (window)) / 72.0;
ev_document_model_set_scale (priv->model, zoom);
}
}
@@ -4186,7 +4177,7 @@ ev_window_cmd_view_zoom (GSimpleAction *action,
ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
ev_document_model_set_scale (priv->model,
- zoom * get_screen_dpi (ev_window) / 72.0);
+ zoom * ev_document_misc_get_widget_dpi (GTK_WIDGET (ev_window)) / 72.0);
}
static void
@@ -4199,7 +4190,7 @@ ev_window_cmd_set_default_zoom (GSimpleAction *action,
ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
ev_document_model_set_scale (priv->model,
- 1. * get_screen_dpi (ev_window) / 72.0);
+ 1. * ev_document_misc_get_widget_dpi (GTK_WIDGET (ev_window)) / 72.0);
}
static void
@@ -4917,7 +4908,7 @@ ev_window_cmd_edit_save_settings (GSimpleAction *action,
if (sizing_mode == EV_SIZING_FREE) {
gdouble zoom = ev_document_model_get_scale (model);
- zoom *= 72.0 / get_screen_dpi (ev_window);
+ zoom *= 72.0 / ev_document_misc_get_widget_dpi (GTK_WIDGET (ev_window));
g_settings_set_double (settings, "zoom", zoom);
}
g_settings_set_boolean (settings, "show-sidebar",
@@ -5238,7 +5229,7 @@ ev_window_zoom_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWindow *
gdouble zoom;
zoom = ev_document_model_get_scale (model);
- zoom *= 72.0 / get_screen_dpi (ev_window);
+ zoom *= 72.0 / ev_document_misc_get_widget_dpi (GTK_WIDGET (ev_window));
ev_metadata_set_double (priv->metadata, "zoom", zoom);
}
}
diff --git a/shell/ev-zoom-action.c b/shell/ev-zoom-action.c
index 91f4c4c7..fc11c47c 100644
--- a/shell/ev-zoom-action.c
+++ b/shell/ev-zoom-action.c
@@ -112,10 +112,10 @@ ev_zoom_action_update_zoom_level (EvZoomAction *zoom_action)
{
EvZoomActionPrivate *priv = GET_PRIVATE (zoom_action);
- float zoom = ev_document_model_get_scale (priv->model);
- GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (zoom_action));
+ float zoom = ev_document_model_get_scale (priv->model);
+
+ zoom *= 72.0 / ev_document_misc_get_widget_dpi (GTK_WIDGET (zoom_action));
- zoom *= 72.0 / ev_document_misc_get_screen_dpi (screen);
ev_zoom_action_set_zoom_level (zoom_action, zoom);
}
@@ -202,7 +202,6 @@ entry_activated_cb (GtkEntry *entry,
{
EvZoomActionPrivate *priv = GET_PRIVATE (zoom_action);
- GdkScreen *screen;
double zoom_perc;
float zoom;
const gchar *text = gtk_entry_get_text (entry);
@@ -221,11 +220,10 @@ entry_activated_cb (GtkEntry *entry,
return;
}
- screen = gtk_widget_get_screen (GTK_WIDGET (zoom_action));
zoom = zoom_perc / 100.;
ev_document_model_set_sizing_mode (priv->model, EV_SIZING_FREE);
ev_document_model_set_scale (priv->model,
- zoom * ev_document_misc_get_screen_dpi (screen) / 72.0);
+ zoom * ev_document_misc_get_widget_dpi (GTK_WIDGET (zoom_action)) /
72.0);
g_signal_emit (zoom_action, signals[ACTIVATED], 0, NULL);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]