aboutsummaryrefslogtreecommitdiffstats
path: root/src/w32term.c
diff options
context:
space:
mode:
authorKaroly Lorentey <[email protected]>2007-02-24 19:26:54 +0000
committerKaroly Lorentey <[email protected]>2007-02-24 19:26:54 +0000
commitf65f7603312547e51230192daf34349b8ac569a0 (patch)
treecbc5877854d00bbdd5ecd4906d130ab8fbb44430 /src/w32term.c
parent9440b75fccbf763e3fb23a31a128d97eb4debdf5 (diff)
parent735895f1fa28f88c559e73910ea0ff0bda0f228c (diff)
Merged from [email protected]
Patches applied: * [email protected]/emacs--devo--0--patch-619 Update from CVS * [email protected]/emacs--devo--0--patch-620 Update from CVS * [email protected]/emacs--devo--0--patch-621 Merge from gnus--rel--5.10 * [email protected]/emacs--devo--0--patch-622 Update from CVS * [email protected]/emacs--devo--0--patch-623 Remove RCS keywords * [email protected]/emacs--devo--0--patch-624 Update from CVS * [email protected]/emacs--devo--0--patch-625 Update from CVS * [email protected]/emacs--devo--0--patch-626 Update from CVS * [email protected]/emacs--devo--0--patch-627 Update from CVS * [email protected]/emacs--devo--0--patch-628 Update from CVS * [email protected]/emacs--devo--0--patch-629 Merge from gnus--rel--5.10 * [email protected]/emacs--devo--0--patch-630 Update from CVS * [email protected]/emacs--devo--0--patch-631 Update from CVS * [email protected]/emacs--devo--0--patch-632 Update from CVS * [email protected]/emacs--devo--0--patch-633 Update from CVS * [email protected]/emacs--devo--0--patch-634 Update from CVS * [email protected]/emacs--devo--0--patch-635 Update from CVS * [email protected]/emacs--devo--0--patch-636 Update from CVS * [email protected]/emacs--devo--0--patch-637 Remove RCS keywords * [email protected]/emacs--devo--0--patch-638 Update from CVS * [email protected]/emacs--devo--0--patch-639 Update from CVS * [email protected]/emacs--devo--0--patch-640 Update from CVS * [email protected]/emacs--devo--0--patch-641 Update from CVS * [email protected]/emacs--devo--0--patch-642 Merge from gnus--rel--5.10 * [email protected]/emacs--devo--0--patch-643 Update from CVS * [email protected]/emacs--devo--0--patch-644 Update from CVS * [email protected]/emacs--devo--0--patch-645 Update from CVS * [email protected]/emacs--devo--0--patch-646 Update from CVS * [email protected]/emacs--devo--0--patch-647 Update from CVS * [email protected]/emacs--devo--0--patch-648 Update from CVS * [email protected]/emacs--devo--0--patch-649 Update from CVS * [email protected]/gnus--rel--5.10--patch-197 Merge from emacs--devo--0 * [email protected]/gnus--rel--5.10--patch-198 Update from CVS * [email protected]/gnus--rel--5.10--patch-199 Update from CVS * [email protected]/gnus--rel--5.10--patch-200 Merge from emacs--devo--0 * [email protected]/gnus--rel--5.10--patch-201 Update from CVS: lisp/nnweb.el (nnweb-google-parse-1): Update parser. * [email protected]/gnus--rel--5.10--patch-202 Update from CVS git-archimport-id: [email protected]/emacs--multi-tty--0--patch-596
Diffstat (limited to 'src/w32term.c')
-rw-r--r--src/w32term.c62
1 files changed, 43 insertions, 19 deletions
diff --git a/src/w32term.c b/src/w32term.c
index 8044e23d5a..e7118caa0d 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1,6 +1,7 @@
/* Implementation of GUI terminal on the Microsoft W32 API.
- Copyright (C) 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 1989, 1993, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ 2006, 2007 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@@ -3473,25 +3474,51 @@ w32_set_scroll_bar_thumb (bar, portion, position, whole)
int portion, position, whole;
{
Window w = SCROLL_BAR_W32_WINDOW (bar);
- double range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height));
+ /* We use the whole scroll-bar height in the calculations below, to
+ avoid strange effects like scrolling backwards when just clicking
+ on the handle (without moving it). */
+ double range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height))
+ + VERTICAL_SCROLL_BAR_MIN_HANDLE;
int sb_page, sb_pos;
BOOL draggingp = !NILP (bar->dragging) ? TRUE : FALSE;
SCROLLINFO si;
+ /* We used to change the nPage setting while dragging the handle,
+ but that had very strange effects (such as scrolling backwards
+ while dragging downwards).
+
+ Now, we don't change the nPage setting while dragging unless we
+ get near to the end of the buffer, in which case we often have to
+ resize the handle to "go all the way". */
+
+ if (draggingp)
+ {
+ int near_bottom_p;
+ BLOCK_INPUT;
+ si.cbSize = sizeof (si);
+ si.fMask = SIF_POS | SIF_PAGE;
+ GetScrollInfo(w, SB_CTL, &si);
+ near_bottom_p = si.nPos + si.nPage >= range;
+ UNBLOCK_INPUT;
+ if (!near_bottom_p)
+ return;
+ }
+
if (whole)
{
/* Position scroll bar at rock bottom if the bottom of the
buffer is visible. This avoids shinking the thumb away
to nothing if it is held at the bottom of the buffer. */
- if (position + portion >= whole)
- {
- sb_page = range * (whole - position) / whole
- + VERTICAL_SCROLL_BAR_MIN_HANDLE;
- sb_pos = range;
- }
-
- sb_page = portion * range / whole + VERTICAL_SCROLL_BAR_MIN_HANDLE;
- sb_pos = position * range / whole;
+ if (position + portion >= whole && !draggingp)
+ {
+ sb_page = range * (whole - position) / whole;
+ sb_pos = range;
+ }
+ else
+ {
+ sb_pos = position * range / whole;
+ sb_page = (min (portion, (whole - position)) * range) / whole;
+ }
}
else
{
@@ -3499,19 +3526,16 @@ w32_set_scroll_bar_thumb (bar, portion, position, whole)
sb_pos = 0;
}
+ sb_page = max (sb_page, VERTICAL_SCROLL_BAR_MIN_HANDLE);
+
BLOCK_INPUT;
si.cbSize = sizeof (si);
- /* Only update page size if currently dragging, to reduce
- flicker effects. */
- if (draggingp)
- si.fMask = SIF_PAGE;
- else
- si.fMask = SIF_PAGE | SIF_POS;
+ si.fMask = SIF_PAGE | SIF_POS;
si.nPage = sb_page;
si.nPos = sb_pos;
- SetScrollInfo (w, SB_CTL, &si, !draggingp);
+ SetScrollInfo (w, SB_CTL, &si, TRUE);
UNBLOCK_INPUT;
}