Dylan Smith : richedit: Fixed scrollbar visiblility calculation after SetScrollInfo.

Alexandre Julliard julliard at winehq.org
Tue Feb 24 10:21:24 CST 2009


Module: wine
Branch: master
Commit: 5f51221d9c1b94040ef354e7f62a0ce9a838cdab
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5f51221d9c1b94040ef354e7f62a0ce9a838cdab

Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date:   Tue Feb 24 02:38:49 2009 -0500

richedit: Fixed scrollbar visiblility calculation after SetScrollInfo.

The scrollbar visibility can be changed from SetScrollRange or
SetScrollInfo, but the visiblity that is a result of these calls are
not consistent with the calculation made by richedit controls to
decide whether to show or hide the scrollbars.

---

 dlls/riched20/paint.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index f235082..620ac69 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -1111,6 +1111,18 @@ void ME_ScrollRight(ME_TextEditor *editor, int cx)
   ME_HScrollAbs(editor, editor->horz_si.nPos + cx);
 }
 
+/* Calculates the visiblity after a call to SetScrollRange or
+ * SetScrollInfo with SIF_RANGE. */
+static BOOL ME_PostSetScrollRangeVisibility(SCROLLINFO *si)
+{
+  if (si->fMask & SIF_DISABLENOSCROLL)
+    return TRUE;
+
+  /* This must match the check in SetScrollInfo to determine whether
+   * to show or hide the scrollbars. */
+  return si->nMin < si->nMax - max(si->nPage - 1, 0);
+}
+
 void ME_UpdateScrollBar(ME_TextEditor *editor)
 {
   /* Note that this is the only function that should ever call
@@ -1158,15 +1170,14 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
         ITextHost_TxSetScrollRange(editor->texthost, SB_HORZ, si.nMin, si.nMax, FALSE);
         ITextHost_TxSetScrollPos(editor->texthost, SB_HORZ, si.nPos, TRUE);
       }
+      /* SetScrollInfo or SetScrollRange change scrollbar visibility. */
+      bScrollBarWasVisible = ME_PostSetScrollRangeVisibility(&si);
     }
   }
 
   if (si.fMask & SIF_DISABLENOSCROLL) {
     bScrollBarWillBeVisible = TRUE;
   } else if (!(editor->styleFlags & WS_HSCROLL)) {
-    /* SetScrollInfo or SetScrollRange may cause the scrollbar to be
-     * shown, so hide the scrollbar if necessary. */
-    bScrollBarWasVisible = bScrollBarWillBeVisible;
     bScrollBarWillBeVisible = FALSE;
   }
 
@@ -1205,15 +1216,14 @@ void ME_UpdateScrollBar(ME_TextEditor *editor)
         ITextHost_TxSetScrollRange(editor->texthost, SB_VERT, si.nMin, si.nMax, FALSE);
         ITextHost_TxSetScrollPos(editor->texthost, SB_VERT, si.nPos, TRUE);
       }
+      /* SetScrollInfo or SetScrollRange change scrollbar visibility. */
+      bScrollBarWasVisible = ME_PostSetScrollRangeVisibility(&si);
     }
   }
 
   if (si.fMask & SIF_DISABLENOSCROLL) {
     bScrollBarWillBeVisible = TRUE;
   } else if (!(editor->styleFlags & WS_VSCROLL)) {
-    /* SetScrollInfo or SetScrollRange may cause the scrollbar to be
-     * shown, so hide the scrollbar if necessary. */
-    bScrollBarWasVisible = bScrollBarWillBeVisible;
     bScrollBarWillBeVisible = FALSE;
   }
 




More information about the wine-cvs mailing list