Hi there,
The followong patch replaces the hardcoded TEXT_TO_INSET_OFFSET=4 and
the workarea margin of 10 by respectively 1mm and 2.5mm. These values
should be equivalent when dpi=100 and zoom=100%.
This idea was triggered by a message (a bug) saying that in HiDPI
situations, placing the cursor was very difficult.
Please try it out. I'd be interested to know how it fares in different
situations.
JMarc
>From a6c9f8a782d561ccea0bd5c2bb70c71527280c0e Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <[email protected]>
Date: Thu, 12 Nov 2015 10:19:08 +0100
Subject: [PATCH] Replace hardcoded TEXT_TO_INSET_OFFSET by dynamic value
The value is counted as 1 millimeter now (the same at 100 dpi). We also ensures that it measures at least 1 pixel.
Similarly, the Workarea default margin is now 2.5mm instead of being hardcoded to 10.
This should improve the situation for HiDPI systems.
---
src/BufferView.cpp | 6 ++++--
src/RowPainter.cpp | 2 +-
src/frontends/qt4/GuiFontMetrics.cpp | 6 +++---
src/frontends/qt4/GuiPainter.cpp | 4 ++--
src/insets/Inset.cpp | 9 +++++++++
src/insets/Inset.h | 2 +-
src/insets/InsetCaption.cpp | 8 ++++----
src/insets/InsetCollapsable.cpp | 6 +++---
src/insets/InsetIPA.cpp | 12 ++++++------
src/insets/InsetPhantom.cpp | 4 ++--
src/insets/InsetPreview.cpp | 12 ++++++------
src/insets/InsetTabular.cpp | 4 ++--
src/insets/InsetText.cpp | 28 ++++++++++++++--------------
src/insets/RenderGraphic.cpp | 18 +++++++++---------
src/insets/RenderPreview.cpp | 2 +-
15 files changed, 67 insertions(+), 56 deletions(-)
diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 0030f33..902f8a7 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -351,11 +351,13 @@ BufferView::~BufferView()
int BufferView::rightMargin() const
{
+ // THe value used to be hardcoded to 10, which is 2.5mm at 100dpi
+ int const default_margin = Length(2.5, Length::MM).inPixels(0);
// The additional test for the case the outliner is opened.
if (!full_screen_ ||
!lyxrc.full_screen_limit ||
- width_ < lyxrc.full_screen_width + 20)
- return 10;
+ width_ < lyxrc.full_screen_width + 2 * default_margin)
+ return default_margin;
return (width_ - lyxrc.full_screen_width) / 2;
}
diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp
index ce5780b..3d360d4 100644
--- a/src/RowPainter.cpp
+++ b/src/RowPainter.cpp
@@ -540,7 +540,7 @@ void RowPainter::paintLast()
FontMetrics const & fm = theFontMetrics(font);
int const size = int(0.75 * fm.maxAscent());
int const y = yo_ - size;
- int const max_row_width = width_ - size - Inset::TEXT_TO_INSET_OFFSET;
+ int const max_row_width = width_ - size - Inset::textToInsetOffset();
int x = is_rtl ? nestMargin() + changebarMargin()
: max_row_width - row_.right_margin;
diff --git a/src/frontends/qt4/GuiFontMetrics.cpp b/src/frontends/qt4/GuiFontMetrics.cpp
index 8d0b026..d4f3585 100644
--- a/src/frontends/qt4/GuiFontMetrics.cpp
+++ b/src/frontends/qt4/GuiFontMetrics.cpp
@@ -237,9 +237,9 @@ bool GuiFontMetrics::breakAt(docstring & s, int & x, bool const rtl, bool const
void GuiFontMetrics::rectText(docstring const & str,
int & w, int & ascent, int & descent) const
{
- static int const d = Inset::TEXT_TO_INSET_OFFSET / 2;
+ static int const d = Inset::textToInsetOffset() / 2;
- w = width(str) + Inset::TEXT_TO_INSET_OFFSET;
+ w = width(str) + Inset::textToInsetOffset();
ascent = metrics_.ascent() + d;
descent = metrics_.descent() + d;
}
@@ -250,7 +250,7 @@ void GuiFontMetrics::buttonText(docstring const & str,
int & w, int & ascent, int & descent) const
{
rectText(str, w, ascent, descent);
- w += Inset::TEXT_TO_INSET_OFFSET;
+ w += Inset::textToInsetOffset();
}
diff --git a/src/frontends/qt4/GuiPainter.cpp b/src/frontends/qt4/GuiPainter.cpp
index 2b024d8..af75547 100644
--- a/src/frontends/qt4/GuiPainter.cpp
+++ b/src/frontends/qt4/GuiPainter.cpp
@@ -533,10 +533,10 @@ void GuiPainter::buttonText(int x, int y, docstring const & str,
FontMetrics const & fm = theFontMetrics(font);
fm.buttonText(str, width, ascent, descent);
- static int const d = Inset::TEXT_TO_INSET_OFFSET / 2;
+ static int const d = Inset::textToInsetOffset() / 2;
button(x + d, y - ascent, width - d, descent + ascent, mouseHover);
- text(x + Inset::TEXT_TO_INSET_OFFSET, y, str, font);
+ text(x + Inset::textToInsetOffset(), y, str, font);
}
diff --git a/src/insets/Inset.cpp b/src/insets/Inset.cpp
index 0fce648..1d8e9f4 100644
--- a/src/insets/Inset.cpp
+++ b/src/insets/Inset.cpp
@@ -27,6 +27,7 @@
#include "DispatchResult.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
+#include "Length.h"
#include "MetricsInfo.h"
#include "output_xhtml.h"
#include "Text.h"
@@ -617,6 +618,14 @@ ColorCode Inset::labelColor() const
}
+int Inset::textToInsetOffset()
+{
+ // Hardcoded value was 4. At 100dpi default resolution, this is
+ // equivalent to 1 millimeter.
+ return Length(1, Length::MM).inPixels(0);
+}
+
+
void Inset::setPosCache(PainterInfo const & pi, int x, int y) const
{
//LYXERR("Inset: set position cache to " << x << " " << y);
diff --git a/src/insets/Inset.h b/src/insets/Inset.h
index f928830..9639ccc 100644
--- a/src/insets/Inset.h
+++ b/src/insets/Inset.h
@@ -567,7 +567,7 @@ public:
///
virtual ColorCode labelColor() const;
//
- enum { TEXT_TO_INSET_OFFSET = 4 };
+ static int textToInsetOffset();
protected:
/// Constructors
diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp
index 21b834a..fb26166 100644
--- a/src/insets/InsetCaption.cpp
+++ b/src/insets/InsetCaption.cpp
@@ -118,7 +118,7 @@ void InsetCaption::metrics(MetricsInfo & mi, Dimension & dim) const
mi.base.font = mi.base.bv->buffer().params().getFont().fontInfo();
labelwidth_ = theFontMetrics(mi.base.font).width(full_label_);
// add some space to separate the label from the inset text
- labelwidth_ += 2 * TEXT_TO_INSET_OFFSET;
+ labelwidth_ += 2 * textToInsetOffset();
dim.wid = labelwidth_;
Dimension textdim;
// Correct for button and label width
@@ -135,8 +135,8 @@ void InsetCaption::metrics(MetricsInfo & mi, Dimension & dim) const
void InsetCaption::drawBackground(PainterInfo & pi, int x, int y) const
{
TextMetrics & tm = pi.base.bv->textMetrics(&text());
- int const h = tm.height() + 2 * TEXT_TO_INSET_OFFSET;
- int const yy = y - TEXT_TO_INSET_OFFSET - tm.ascent();
+ int const h = tm.height() + 2 * textToInsetOffset();
+ int const yy = y - textToInsetOffset() - tm.ascent();
pi.pain.fillRectangle(x, yy, labelwidth_, h, pi.backgroundColor(this));
}
@@ -154,7 +154,7 @@ void InsetCaption::draw(PainterInfo & pi, int x, int y) const
FontInfo tmpfont = pi.base.font;
pi.base.font = pi.base.bv->buffer().params().getFont().fontInfo();
pi.base.font.setColor(pi.textColor(pi.base.font.color()).baseColor);
- int const xx = x + TEXT_TO_INSET_OFFSET;
+ int const xx = x + textToInsetOffset();
pi.pain.text(xx, y, full_label_, pi.base.font);
InsetText::draw(pi, x + labelwidth_, y);
pi.base.font = tmpfont;
diff --git a/src/insets/InsetCollapsable.cpp b/src/insets/InsetCollapsable.cpp
index aeac8b3..47728f1 100644
--- a/src/insets/InsetCollapsable.cpp
+++ b/src/insets/InsetCollapsable.cpp
@@ -230,7 +230,7 @@ void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
dim.des = max(dim.des - textdim.asc + dim.asc, textdim.des);
dim.asc = textdim.asc;
} else {
- dim.des += textdim.height() + TEXT_TO_INSET_OFFSET;
+ dim.des += textdim.height() + textToInsetOffset();
dim.wid = max(dim.wid, textdim.wid);
}
}
@@ -314,8 +314,8 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
if (geometry(bv) == Corners)
desc -= 3;
- const int xx1 = x + TEXT_TO_INSET_OFFSET - 1;
- const int xx2 = x + textdim.wid - TEXT_TO_INSET_OFFSET + 1;
+ const int xx1 = x + textToInsetOffset() - 1;
+ const int xx2 = x + textdim.wid - textToInsetOffset() + 1;
pi.pain.line(xx1, y + desc - 4,
xx1, y + desc,
Color_foreground);
diff --git a/src/insets/InsetIPA.cpp b/src/insets/InsetIPA.cpp
index 8bc3d46..d641d42 100644
--- a/src/insets/InsetIPA.cpp
+++ b/src/insets/InsetIPA.cpp
@@ -153,7 +153,7 @@ void InsetIPA::draw(PainterInfo & pi, int x, int y) const
use_preview_ = previewState(pi.base.bv);
if (use_preview_) {
- preview_->draw(pi, x + TEXT_TO_INSET_OFFSET, y);
+ preview_->draw(pi, x + textToInsetOffset(), y);
setPosCache(pi, x, y);
return;
}
@@ -183,16 +183,16 @@ void InsetIPA::metrics(MetricsInfo & mi, Dimension & dim) const
{
if (previewState(mi.base.bv)) {
preview_->metrics(mi, dim);
- mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
+ mi.base.textwidth += 2 * textToInsetOffset();
dim.wid = max(dim.wid, 4);
dim.asc = max(dim.asc, 4);
- dim.asc += TEXT_TO_INSET_OFFSET;
- dim.des += TEXT_TO_INSET_OFFSET;
- dim.wid += TEXT_TO_INSET_OFFSET;
+ dim.asc += textToInsetOffset();
+ dim.des += textToInsetOffset();
+ dim.wid += textToInsetOffset();
dim_ = dim;
- dim.wid += TEXT_TO_INSET_OFFSET;
+ dim.wid += textToInsetOffset();
// insert a one pixel gap
dim.wid += 1;
// Cache the inset dimension.
diff --git a/src/insets/InsetPhantom.cpp b/src/insets/InsetPhantom.cpp
index c6efe9a..aa04467 100644
--- a/src/insets/InsetPhantom.cpp
+++ b/src/insets/InsetPhantom.cpp
@@ -203,10 +203,10 @@ void InsetPhantom::draw(PainterInfo & pi, int x, int y) const
// | | | |
// x1 x2 x3 x4
- x = x + TEXT_TO_INSET_OFFSET;
+ x = x + textToInsetOffset();
int const x1 = x;
int const x2 = x + arrow_size;
- int const x4 = x + dim.wid - 2 * TEXT_TO_INSET_OFFSET;
+ int const x4 = x + dim.wid - 2 * textToInsetOffset();
int const x3 = x4 - arrow_size;
int const y2 = y + (dim.des - dim.asc) / 2;
diff --git a/src/insets/InsetPreview.cpp b/src/insets/InsetPreview.cpp
index d327fe5..aaf6feb 100644
--- a/src/insets/InsetPreview.cpp
+++ b/src/insets/InsetPreview.cpp
@@ -141,7 +141,7 @@ void InsetPreview::draw(PainterInfo & pi, int x, int y) const
if (use_preview_) {
// one pixel gap in front
- preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);
+ preview_->draw(pi, x + 1 + textToInsetOffset(), y);
setPosCache(pi, x, y);
return;
}
@@ -171,16 +171,16 @@ void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const
{
if (previewState(mi.base.bv)) {
preview_->metrics(mi, dim);
- mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
+ mi.base.textwidth += 2 * textToInsetOffset();
dim.wid = max(dim.wid, 4);
dim.asc = max(dim.asc, 4);
- dim.asc += TEXT_TO_INSET_OFFSET;
- dim.des += TEXT_TO_INSET_OFFSET;
- dim.wid += TEXT_TO_INSET_OFFSET;
+ dim.asc += textToInsetOffset();
+ dim.des += textToInsetOffset();
+ dim.wid += textToInsetOffset();
dim_ = dim;
- dim.wid += TEXT_TO_INSET_OFFSET;
+ dim.wid += textToInsetOffset();
// insert a one pixel gap
dim.wid += 1;
// Cache the inset dimension.
diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
index 437ac7e..57238df 100644
--- a/src/insets/InsetTabular.cpp
+++ b/src/insets/InsetTabular.cpp
@@ -3648,9 +3648,9 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
tabular.cell_info[r][c].decimal_width = decimal_width;
// with LYX_VALIGN_BOTTOM the descent is relative to the last par
- // = descent of text in last par + TEXT_TO_INSET_OFFSET:
+ // = descent of text in last par + textToInsetOffset():
int const lastpardes = tm.last().second->descent()
- + TEXT_TO_INSET_OFFSET;
+ + textToInsetOffset();
int offset = 0;
switch (tabular.getVAlignment(cell)) {
case Tabular::LYX_VALIGN_TOP:
diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
index 80b0bac..3c86d73 100644
--- a/src/insets/InsetText.cpp
+++ b/src/insets/InsetText.cpp
@@ -141,9 +141,9 @@ Dimension const InsetText::dimension(BufferView const & bv) const
{
TextMetrics const & tm = bv.textMetrics(&text_);
Dimension dim = tm.dimension();
- dim.wid += 2 * TEXT_TO_INSET_OFFSET;
- dim.des += TEXT_TO_INSET_OFFSET;
- dim.asc += TEXT_TO_INSET_OFFSET;
+ dim.wid += 2 * textToInsetOffset();
+ dim.des += textToInsetOffset();
+ dim.asc += textToInsetOffset();
return dim;
}
@@ -192,7 +192,7 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
// Hand font through to contained lyxtext:
tm.font_.fontInfo() = mi.base.font;
- mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
+ mi.base.textwidth -= 2 * textToInsetOffset();
// This can happen when a layout has a left and right margin,
// and the view is made very narrow. We can't do better than
@@ -204,10 +204,10 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
tm.metrics(mi, dim, mi.base.textwidth);
else
tm.metrics(mi, dim);
- mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
- dim.asc += TEXT_TO_INSET_OFFSET;
- dim.des += TEXT_TO_INSET_OFFSET;
- dim.wid += 2 * TEXT_TO_INSET_OFFSET;
+ mi.base.textwidth += 2 * textToInsetOffset();
+ dim.asc += textToInsetOffset();
+ dim.des += textToInsetOffset();
+ dim.wid += 2 * textToInsetOffset();
}
@@ -216,10 +216,10 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
TextMetrics & tm = pi.base.bv->textMetrics(&text_);
if (drawFrame_ || pi.full_repaint) {
- int const w = tm.width() + TEXT_TO_INSET_OFFSET;
- int const yframe = y - TEXT_TO_INSET_OFFSET - tm.ascent();
- int const h = tm.height() + 2 * TEXT_TO_INSET_OFFSET;
- int const xframe = x + TEXT_TO_INSET_OFFSET / 2;
+ int const w = tm.width() + textToInsetOffset();
+ int const yframe = y - textToInsetOffset() - tm.ascent();
+ int const h = tm.height() + 2 * textToInsetOffset();
+ int const xframe = x + textToInsetOffset() / 2;
if (pi.full_repaint)
pi.pain.fillRectangle(xframe, yframe, w, h,
pi.backgroundColor(this));
@@ -230,7 +230,7 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
ColorCode const old_color = pi.background_color;
pi.background_color = pi.backgroundColor(this, false);
- tm.draw(pi, x + TEXT_TO_INSET_OFFSET, y);
+ tm.draw(pi, x + textToInsetOffset(), y);
pi.background_color = old_color;
}
@@ -649,7 +649,7 @@ void InsetText::getArgs(otexstream & os, OutputParams const & runparams_in,
void InsetText::cursorPos(BufferView const & bv,
CursorSlice const & sl, bool boundary, int & x, int & y) const
{
- x = bv.textMetrics(&text_).cursorX(sl, boundary) + TEXT_TO_INSET_OFFSET;
+ x = bv.textMetrics(&text_).cursorX(sl, boundary) + textToInsetOffset();
y = bv.textMetrics(&text_).cursorY(sl, boundary);
}
diff --git a/src/insets/RenderGraphic.cpp b/src/insets/RenderGraphic.cpp
index 48b41e2..0f4d4b8 100644
--- a/src/insets/RenderGraphic.cpp
+++ b/src/insets/RenderGraphic.cpp
@@ -144,7 +144,7 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
bool const image_ready = displayGraphic(params_) && readyToDisplay(loader_);
if (image_ready) {
- dim.wid = loader_.image()->width() + 2 * Inset::TEXT_TO_INSET_OFFSET;
+ dim.wid = loader_.image()->width() + 2 * Inset::textToInsetOffset();
dim.asc = loader_.image()->height();
dim_ = dim;
return;
@@ -184,16 +184,16 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
// loaded yet, we draw just a rectangle.
if (displayGraphic(params_) && readyToDisplay(loader_)) {
- pi.pain.image(x + Inset::TEXT_TO_INSET_OFFSET,
+ pi.pain.image(x + Inset::textToInsetOffset(),
y - dim_.asc,
- dim_.wid - 2 * Inset::TEXT_TO_INSET_OFFSET,
+ dim_.wid - 2 * Inset::textToInsetOffset(),
dim_.asc + dim_.des,
*loader_.image());
} else {
- pi.pain.rectangle(x + Inset::TEXT_TO_INSET_OFFSET,
+ pi.pain.rectangle(x + Inset::textToInsetOffset(),
y - dim_.asc,
- dim_.wid - 2 * Inset::TEXT_TO_INSET_OFFSET,
+ dim_.wid - 2 * Inset::textToInsetOffset(),
dim_.asc + dim_.des,
Color_foreground);
@@ -204,8 +204,8 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
if (!justname.empty()) {
msgFont.setSize(FONT_SIZE_FOOTNOTE);
- pi.pain.text(x + Inset::TEXT_TO_INSET_OFFSET + 6,
- y - theFontMetrics(msgFont).maxAscent() - 4,
+ pi.pain.text(x + Inset::textToInsetOffset() * 5 / 2,
+ y - theFontMetrics(msgFont).maxAscent() - Inset::textToInsetOffset(),
from_utf8(justname), msgFont);
}
@@ -213,8 +213,8 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
docstring const msg = statusMessage(params_, loader_.status());
if (!msg.empty()) {
msgFont.setSize(FONT_SIZE_TINY);
- pi.pain.text(x + Inset::TEXT_TO_INSET_OFFSET + 6,
- y - 4, msg, msgFont);
+ pi.pain.text(x + Inset::textToInsetOffset() * 5 / 2,
+ y - Inset::textToInsetOffset(), msg, msgFont);
}
}
}
diff --git a/src/insets/RenderPreview.cpp b/src/insets/RenderPreview.cpp
index 9d7304f..489f37b 100644
--- a/src/insets/RenderPreview.cpp
+++ b/src/insets/RenderPreview.cpp
@@ -173,7 +173,7 @@ void RenderPreview::draw(PainterInfo & pi, int x, int y) const
pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(),
*image);
} else {
- int const offset = Inset::TEXT_TO_INSET_OFFSET;
+ int const offset = Inset::textToInsetOffset();
pi.pain.rectangle(x + offset,
y - dim_.asc,
--
2.5.0