Take font metrics into account for EC_USEFONTINFO margins.
diff --git a/controls/edit.c b/controls/edit.c
index 1ed12d9..38d438d 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -3296,25 +3296,48 @@
* EM_SETMARGINS
*
* EC_USEFONTINFO is used as a left or right value i.e. lParam and not as an
- * action wParam despite what the docs say. EC_USEFONTINFO means one third
- * of the char's width, according to the new docs.
+ * action wParam despite what the docs say. EC_USEFONTINFO calculates the
+ * margin according to the textmetrics of the current font.
+ *
+ * FIXME - With TrueType or vector fonts EC_USEFONTINFO currently sets one third
+ * of the char's width as the margin, but this is not how Windows handles this.
+ * For all other fonts Windows sets the margins to zero.
*
*/
static void EDIT_EM_SetMargins(EDITSTATE *es, INT action,
INT left, INT right)
{
+ TEXTMETRICW tm;
+ INT default_left_margin = 0; /* in pixels */
+ INT default_right_margin = 0; /* in pixels */
+
+ /* Set the default margins depending on the font */
+ if (es->font && (left == EC_USEFONTINFO || right == EC_USEFONTINFO)) {
+ HDC dc = GetDC(es->hwndSelf);
+ HFONT old_font = SelectObject(dc, es->font);
+ GetTextMetricsW(dc, &tm);
+ /* The default margins are only non zero for TrueType or Vector fonts */
+ if (tm.tmPitchAndFamily & ( TMPF_VECTOR | TMPF_TRUETYPE )) {
+ /* This must be calculated more exactly! But how? */
+ default_left_margin = tm.tmAveCharWidth / 3;
+ default_right_margin = tm.tmAveCharWidth / 3;
+ }
+ SelectObject(dc, old_font);
+ ReleaseDC(es->hwndSelf, dc);
+ }
+
if (action & EC_LEFTMARGIN) {
if (left != EC_USEFONTINFO)
es->left_margin = left;
else
- es->left_margin = es->char_width / 3;
+ es->left_margin = default_left_margin;
}
if (action & EC_RIGHTMARGIN) {
if (right != EC_USEFONTINFO)
es->right_margin = right;
else
- es->right_margin = es->char_width / 3;
+ es->right_margin = default_right_margin;
}
TRACE("left=%d, right=%d\n", es->left_margin, es->right_margin);
}