diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index b28d926fa6..f53df68a18 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -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(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(cmd.argument()) / double(lyxrc.defaultZoom); + else if (cmd.action() == LFUN_BUFFER_ZOOM_IN) + return zr + convert(cmd.argument()) / 100.0; + else // cmd.action() == LFUN_BUFFER_ZOOM_OUT + return zr - convert(cmd.argument()) / 100.0; + } +} + +} + + bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) { bool enable = true; @@ -2122,36 +2145,24 @@ 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(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 if (zoom > zoom_max_) { + docstring const msg = + bformat(_("Zoom level cannot be more than %1$d%."), zoom_max_); + flag.message(msg); + enable = false; } else enable = doc_buffer; break; } - case LFUN_BUFFER_ZOOM: { - bool const less_than_min_zoom = - !cmd.argument().empty() && convert(cmd.argument()) < zoom_min_; - if (lyxrc.currentZoom <= zoom_min_ && less_than_min_zoom) { - 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_MOVE_NEXT: case LFUN_BUFFER_MOVE_PREVIOUS: // we do not cycle when moving @@ -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(cmd.argument()) / double(lyxrc.defaultZoom); - else if (cmd.action() == LFUN_BUFFER_ZOOM_IN) - zoom_ratio_ += convert(cmd.argument()) / 100.0; - else - zoom_ratio_ -= convert(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(zoom_min_)) - zoom = zoom_min_; + int zoom = (int)(lyxrc.defaultZoom * zoom_ratio_); + zoom = min(max(zoom, zoom_min_), zoom_max_); lyxrc.currentZoom = zoom; diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index e78df4b7a9..0b2b1f3356 100644 --- a/src/frontends/qt4/GuiView.h +++ b/src/frontends/qt4/GuiView.h @@ -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_; diff --git a/status.23x b/status.23x index c3d63f9083..b6c8761a71 100644 --- a/status.23x +++ b/status.23x @@ -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