home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unreleased / patches / old / 5.4p.4 < prev    next >
Encoding:
Internet Message Format  |  1999-07-19  |  6.1 KB

  1. To: "John Mullin" <mullin@tinet.ie>
  2. In-Reply-To: <000e01bed232$da9d6b20$97f9869f@tristan>
  3. Cc: <vim-dev@vim.org>
  4. Subject: patch 5.4p.4 (was: gvimole5.4o : vertical scrollbar jumping bug?)
  5. Fcc: outbox
  6. From: Bram Moolenaar <Bram@moolenaar.net>
  7. ------------
  8.  
  9. John Mullin wrote:
  10.  
  11. > I noticed a problem with gvimole5.4n
  12. > With the vertical scrollbar enabled,
  13. > open file about "32767 - &lines" long.
  14. > (with text in at least some of the lines (32767i<cr> won't work:) )
  15. > hit G to goto end,
  16. > click the up arrow scroll bar button a few times
  17. > and the thumb (and the cursor) moves up to the middle of the file
  18. > (approx line 32767/2)
  19. >
  20. > click again, and the thumb and the cursor moves up by half the remaining file
  21.  
  22. Hmm, don't see this.
  23.  
  24. > Unfortunately I don't have visual C installed but my  best guess
  25. > points to a problem in 
  26. > gui_win32.c: function gui_mch_set_scrollbar_thumb,
  27. > I'm guessing something about the left shifting by one
  28.  
  29. Probably.  There is one problem that someone reported that I can reproduce:
  30. When the file is longer than 32768 lines, the up arrow moves two lines at a
  31. time (OK, can accept that), and the down arrow doesn't move at all (oops).
  32.  
  33. Another thing I noticed: the scroll_shift, which is used to remember by how
  34. much the values are shifted, is used for all scrollbars.  There should be a
  35. separate value for each scrollbar.  Otherwise things go very wrong when using
  36. more than one window.
  37.  
  38. > sorry it's not more specific,
  39. > I've included my vimrc and gvimrc
  40.  
  41. Hmm, it's too long to search for specific settings.  You better try this with
  42. "gvim -u NONE -U NONE", or rename your vimrc for a moment.
  43.  
  44. Anyway, I fixed the mixup of scroll_shift between windows.  I worked around
  45. the down-arrow not working by having it scroll several lines.  It's not a real
  46. solution, but at least it does scroll now.
  47.  
  48. A real solution could be tricky, because there are roundoff problems.  I
  49. notice that there is first a scroll of one line when the mouse button goes
  50. down, and then an extra line when the button goes up.  This means there is an
  51. extra event that reports the scrollbar position.  If we can avoid that it
  52. would work.  But that might be a bit tricky.
  53.  
  54.  
  55. Patch 5.4p.4
  56. Problem:    Win32 GUI: The scrollbar values were reduced for a file with more
  57.         than 32767 lines.  But this info was kept global for all
  58.         scrollbars, causing a mixup between the windows.
  59.         Using the down arrow of a scrollbar in a large file didn't work.
  60.         Because of round-off errors there is no scroll at all.
  61. Solution:   Give each scrollbar its own scroll_shift field.  When the down
  62.         arrow is used, scroll several lines.
  63. Files:        src/gui.h, src/gui_w32.c
  64.  
  65.  
  66. *** ../vim-5.4p/src/gui.h    Mon Jul 19 11:08:54 1999
  67. --- src/gui.h    Tue Jul 20 11:17:36 1999
  68. ***************
  69. *** 175,180 ****
  70. --- 175,184 ----
  71.   #endif
  72.   #ifdef USE_GUI_MSWIN
  73.       HWND    id;        /* Id of real scroll bar */
  74. +     int        scroll_shift;    /* The scrollbar stuff can handle only up to
  75. +                    32767 lines.  When the file is longer,
  76. +                    scroll_shift is set to the number of shifts
  77. +                    to reduce the count.  */
  78.   #endif
  79.   #if USE_GUI_BEOS
  80.       VimScrollBar *id;        /* Pointer to real scroll bar */
  81. *** ../vim-5.4p/src/gui_w32.c    Mon Jul 19 11:09:06 1999
  82. --- src/gui_w32.c    Tue Jul 20 12:05:09 1999
  83. ***************
  84. *** 323,334 ****
  85.   
  86.   static int dialog_default_button = -1;
  87.   
  88. - /*
  89. -  * The scrollbar stuff can handle only up to 32767 lines.  When the file is
  90. -  * longer, scroll_shift is set to the number of shifts to reduce the count.
  91. -  */
  92. - static int scroll_shift = 0;
  93.   /* Intellimouse support */
  94.   static int mouse_scroll_lines = 0;
  95.   static UINT msh_msgmousewheel = 0;
  96. --- 323,328 ----
  97. ***************
  98. *** 1140,1151 ****
  99.           /* TRACE("SB_THUMBTRACK, %d\n", pos); */
  100.           val = pos;
  101.           dragging = TRUE;
  102. !         if (scroll_shift > 0)
  103. !         val <<= scroll_shift;
  104.           break;
  105.       case SB_LINEDOWN:
  106.           /* TRACE("SB_LINEDOWN\n"); */
  107. !         val++;
  108.           break;
  109.       case SB_LINEUP:
  110.           /* TRACE("SB_LINEUP\n"); */
  111. --- 1134,1150 ----
  112.           /* TRACE("SB_THUMBTRACK, %d\n", pos); */
  113.           val = pos;
  114.           dragging = TRUE;
  115. !         if (sb->scroll_shift > 0)
  116. !         val <<= sb->scroll_shift;
  117.           break;
  118.       case SB_LINEDOWN:
  119.           /* TRACE("SB_LINEDOWN\n"); */
  120. !         /* Because of round-off errors we can't move one line when
  121. !          * scroll_shift is non-zero.  Scroll some extra. */
  122. !         if (sb->scroll_shift > 0)
  123. !         val += (1 << sb->scroll_shift);
  124. !         else
  125. !         val++;
  126.           break;
  127.       case SB_LINEUP:
  128.           /* TRACE("SB_LINEUP\n"); */
  129. ***************
  130. *** 1175,1182 ****
  131.            */
  132.           /* TRACE("SB_ENDSCROLL\n"); */
  133.           val = GetScrollPos(hwndCtl, SB_CTL);
  134. !         if (scroll_shift > 0)
  135. !         val <<= scroll_shift;
  136.           break;
  137.   
  138.       default:
  139. --- 1174,1181 ----
  140.            */
  141.           /* TRACE("SB_ENDSCROLL\n"); */
  142.           val = GetScrollPos(hwndCtl, SB_CTL);
  143. !         if (sb->scroll_shift > 0)
  144. !         val <<= sb->scroll_shift;
  145.           break;
  146.   
  147.       default:
  148. ***************
  149. *** 1186,1193 ****
  150.   
  151.       si.cbSize = sizeof(si);
  152.       si.fMask = SIF_POS;
  153. !     if (scroll_shift > 0)
  154. !     si.nPos = val >> scroll_shift;
  155.       else
  156.       si.nPos = val;
  157.       SetScrollInfo(hwndCtl, SB_CTL, &si, TRUE);
  158. --- 1185,1192 ----
  159.   
  160.       si.cbSize = sizeof(si);
  161.       si.fMask = SIF_POS;
  162. !     if (sb->scroll_shift > 0)
  163. !     si.nPos = val >> sb->scroll_shift;
  164.       else
  165.       si.nPos = val;
  166.       SetScrollInfo(hwndCtl, SB_CTL, &si, TRUE);
  167. ***************
  168. *** 2229,2244 ****
  169.   {
  170.       SCROLLINFO    info;
  171.   
  172. !     scroll_shift = 0;
  173.       while (max > 32767)
  174.       {
  175.       max = (max + 1) >> 1;
  176.       val  >>= 1;
  177.       size >>= 1;
  178. !     ++scroll_shift;
  179.       }
  180.   
  181. !     if (scroll_shift > 0)
  182.       ++size;
  183.   
  184.       info.cbSize = sizeof(info);
  185. --- 2228,2243 ----
  186.   {
  187.       SCROLLINFO    info;
  188.   
  189. !     sb->scroll_shift = 0;
  190.       while (max > 32767)
  191.       {
  192.       max = (max + 1) >> 1;
  193.       val  >>= 1;
  194.       size >>= 1;
  195. !     ++sb->scroll_shift;
  196.       }
  197.   
  198. !     if (sb->scroll_shift > 0)
  199.       ++size;
  200.   
  201.       info.cbSize = sizeof(info);
  202.  
  203. --
  204. hundred-and-one symptoms of being an internet addict:
  205. 171. You invent another person and chat with yourself in empty chat rooms.
  206.  
  207. --/-/---- Bram Moolenaar ---- Bram@moolenaar.net ---- Bram@vim.org ---\-\--
  208.   \ \    www.vim.org/iccf      www.moolenaar.net       www.vim.org    / /
  209.