[evince/617-get-dpi-from-gdk-monitor] libdocument: Get DPI from GdkMonitor



commit 360b07a912f214f65a5e65bfcd59db8d8ad8d259
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 4b3e0406..83a0b9a7 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)
 {
@@ -1231,7 +1222,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);
                }
        }
@@ -4183,7 +4174,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
@@ -4196,7 +4187,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
@@ -4914,7 +4905,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",
@@ -5235,7 +5226,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]