]> git.lyx.org Git - lyx.git/commitdiff
Set a maximum value to zoom level
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 8 Feb 2022 18:42:17 +0000 (19:42 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Wed, 23 Nov 2022 17:51:53 +0000 (18:51 +0100)
The minimal vamue is set to 10%, let's set the max to 1000%. This
avoids crashes when characters are too large.

The code is refactored to be more compact and the tests are more precise.

Fixes bug #12452.

(cherry picked from commit 5259b6ba62fd4e31c260d73cbdfdb66847afcb98)

src/frontends/qt4/GuiView.cpp
src/frontends/qt4/GuiView.h
status.23x

index b28d926fa624612a3f459701510251fab402754a..f53df68a1845623eebcb80ab5b1a7723bd876470 100644 (file)
@@ -780,9 +780,8 @@ bool GuiView::restoreLayout()
        QSettings settings;
        zoom_ratio_ = settings.value("zoom_ratio", 1.0).toDouble();
        // Actual zoom value: default zoom + fractional offset
-       int zoom = lyxrc.defaultZoom * zoom_ratio_;
-       if (zoom < static_cast<int>(zoom_min_))
-               zoom = zoom_min_;
+       int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_);
+       zoom = min(max(zoom, zoom_min_), zoom_max_);
        lyxrc.currentZoom = zoom;
        devel_mode_ = settings.value("devel_mode", devel_mode_).toBool();
        settings.beginGroup("views");
@@ -1818,6 +1817,30 @@ void GuiView::resetAutosaveTimers()
 }
 
 
+namespace {
+
+double zoomRatio(FuncRequest const & cmd, double const zr)
+{
+       if (cmd.argument().empty()) {
+               if (cmd.action() == LFUN_BUFFER_ZOOM)
+                       return 1.0;
+               else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
+                       return zr + 0.1;
+               else // cmd.action() == LFUN_BUFFER_ZOOM_OUT
+                       return zr - 0.1;
+       } else {
+               if (cmd.action() == LFUN_BUFFER_ZOOM)
+                       return convert<int>(cmd.argument()) / double(lyxrc.defaultZoom);
+               else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
+                       return zr + convert<int>(cmd.argument()) / 100.0;
+               else // cmd.action() == LFUN_BUFFER_ZOOM_OUT
+                       return zr - convert<int>(cmd.argument()) / 100.0;
+       }
+}
+
+}
+
+
 bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 {
        bool enable = true;
@@ -2122,32 +2145,20 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_BUFFER_ZOOM_OUT:
-       case LFUN_BUFFER_ZOOM_IN: {
-               // only diff between these two is that the default for ZOOM_OUT
-               // is a neg. number
-               bool const neg_zoom =
-                       convert<int>(cmd.argument()) < 0 ||
-                       (cmd.action() == LFUN_BUFFER_ZOOM_OUT && cmd.argument().empty());
-               if (lyxrc.currentZoom <= zoom_min_ && neg_zoom) {
+       case LFUN_BUFFER_ZOOM_IN:
+       case LFUN_BUFFER_ZOOM: {
+               int const zoom = (int)(lyxrc.defaultZoom * zoomRatio(cmd, zoom_ratio_));
+               if (zoom < zoom_min_) {
                        docstring const msg =
                                bformat(_("Zoom level cannot be less than %1$d%."), zoom_min_);
                        flag.message(msg);
                        enable = false;
-               } else
-                       enable = doc_buffer;
-               break;
-       }
-
-       case LFUN_BUFFER_ZOOM: {
-               bool const less_than_min_zoom =
-                       !cmd.argument().empty() && convert<int>(cmd.argument()) < zoom_min_;
-               if (lyxrc.currentZoom <= zoom_min_ && less_than_min_zoom) {
+               } else if (zoom > zoom_max_) {
                        docstring const msg =
-                               bformat(_("Zoom level cannot be less than %1$d%."), zoom_min_);
+                               bformat(_("Zoom level cannot be more than %1$d%."), zoom_max_);
                        flag.message(msg);
                        enable = false;
-               }
-               else
+               } else
                        enable = doc_buffer;
                break;
        }
@@ -4223,26 +4234,11 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                case LFUN_BUFFER_ZOOM_IN:
                case LFUN_BUFFER_ZOOM_OUT:
                case LFUN_BUFFER_ZOOM: {
-                       if (cmd.argument().empty()) {
-                               if (cmd.action() == LFUN_BUFFER_ZOOM)
-                                       zoom_ratio_ = 1.0;
-                               else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
-                                       zoom_ratio_ += 0.1;
-                               else
-                                       zoom_ratio_ -= 0.1;
-                       } else {
-                               if (cmd.action() == LFUN_BUFFER_ZOOM)
-                                       zoom_ratio_ = convert<int>(cmd.argument()) / double(lyxrc.defaultZoom);
-                               else if (cmd.action() == LFUN_BUFFER_ZOOM_IN)
-                                       zoom_ratio_ += convert<int>(cmd.argument()) / 100.0;
-                               else
-                                       zoom_ratio_ -= convert<int>(cmd.argument()) / 100.0;
-                       }
+                       zoom_ratio_ = zoomRatio(cmd, zoom_ratio_);
 
                        // Actual zoom value: default zoom + fractional extra value
-                       int zoom = lyxrc.defaultZoom * zoom_ratio_;
-                       if (zoom < static_cast<int>(zoom_min_))
-                               zoom = zoom_min_;
+                       int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_);
+                       zoom = min(max(zoom, zoom_min_), zoom_max_);
 
                        lyxrc.currentZoom = zoom;
 
index e78df4b7a9542bc8641967fce624cf7d8f447779..0b2b1f335639ec73fc1b11cf6c6a0a82c7a2dc21 100644 (file)
@@ -478,6 +478,8 @@ private:
        double zoom_ratio_ = 1.0;
        /// Minimum zoom percentage
        static int const zoom_min_ = 10;
+       /// Maximum zoom percentage
+       static int const zoom_max_ = 1000;
 
        // movability flag of all toolbars
        bool toolbarsMovable_;
index c3d63f9083442897fe4297e2e1f2f716e801c31e..b6c8761a7177d2e1e1adf67cd131dd927e57da99 100644 (file)
@@ -149,6 +149,7 @@ What's new
 
 - Fix broken modifier handling for Qt-5.12 on Mac (bug 12247).
 
+- Limit zoom value to 1000% to avoid crashes (bug 12452).
 
 
 * INTERNALS