Mercurial > hg > xemacs-beta
comparison src/scrollbar-msw.c @ 227:0e522484dd2a r20-5b12
Import from CVS: tag r20-5b12
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:12:37 +0200 |
parents | 12579d965149 |
children | 83b3d10dcba9 |
comparison
equal
deleted
inserted
replaced
226:eea38c7ad7b4 | 227:0e522484dd2a |
---|---|
30 #include "frame.h" | 30 #include "frame.h" |
31 #include "window.h" | 31 #include "window.h" |
32 #include "scrollbar-msw.h" | 32 #include "scrollbar-msw.h" |
33 #include "events.h" | 33 #include "events.h" |
34 #include "event-msw.h" | 34 #include "event-msw.h" |
35 | |
36 /* This has really different semantics in Windows than in Motif. | |
37 There's no corresponding method; we just do not change slider | |
38 size while dragging. It makes the scrollbar look smother and | |
39 prevents some weird behavior when scrolled near the bottom */ | |
40 static int inhibit_slider_size_change = 0; | |
35 | 41 |
36 static void | 42 static void |
37 mswindows_create_scrollbar_instance (struct frame *f, int vertical, | 43 mswindows_create_scrollbar_instance (struct frame *f, int vertical, |
38 struct scrollbar_instance *sb) | 44 struct scrollbar_instance *sb) |
39 { | 45 { |
106 struct frame *f; | 112 struct frame *f; |
107 int pos_changed = 0; | 113 int pos_changed = 0; |
108 | 114 |
109 f = XFRAME (w->frame); | 115 f = XFRAME (w->frame); |
110 | 116 |
117 #if 0 | |
118 stderr_out ("[%d, %d], page = %d, pos = %d, inhibit = %d\n", new_minimum, new_maximum, | |
119 new_slider_size, new_slider_position,inhibit_slider_size_change); | |
120 #endif | |
121 | |
111 /* These might be optimized, but since at least one will change at each | 122 /* These might be optimized, but since at least one will change at each |
112 call, it's probably not worth it. */ | 123 call, it's probably not worth it. */ |
113 SCROLLBAR_MSW_INFO (sb).nMin = new_minimum - 1; | 124 SCROLLBAR_MSW_INFO (sb).nMin = new_minimum; |
114 SCROLLBAR_MSW_INFO (sb).nMax = new_maximum - 1; | 125 SCROLLBAR_MSW_INFO (sb).nMax = new_maximum; |
115 SCROLLBAR_MSW_INFO (sb).nPage = new_slider_size; | 126 SCROLLBAR_MSW_INFO (sb).nPage = new_slider_size + 1; /* for DISABLENOSCROLL */ |
116 SCROLLBAR_MSW_INFO (sb).nPos = new_slider_position; | 127 SCROLLBAR_MSW_INFO (sb).nPos = new_slider_position; |
117 SCROLLBAR_MSW_INFO (sb).fMask = SIF_ALL; | 128 SCROLLBAR_MSW_INFO (sb).fMask = (inhibit_slider_size_change |
129 ? SIF_RANGE | SIF_POS | |
130 : SIF_ALL | SIF_DISABLENOSCROLL); | |
118 | 131 |
119 SetScrollInfo(SCROLLBAR_MSW_HANDLE (sb), SB_CTL, &SCROLLBAR_MSW_INFO (sb), | 132 SetScrollInfo(SCROLLBAR_MSW_HANDLE (sb), SB_CTL, &SCROLLBAR_MSW_INFO (sb), |
120 TRUE); | 133 !pos_changed); |
121 | 134 |
122 UPDATE_POS_FIELD (scrollbar_x); | 135 UPDATE_POS_FIELD (scrollbar_x); |
123 UPDATE_POS_FIELD (scrollbar_y); | 136 UPDATE_POS_FIELD (scrollbar_y); |
124 UPDATE_POS_FIELD (scrollbar_width); | 137 UPDATE_POS_FIELD (scrollbar_width); |
125 UPDATE_POS_FIELD (scrollbar_height); | 138 UPDATE_POS_FIELD (scrollbar_height); |
142 | 155 |
143 if (SCROLLBAR_MSW_SIZE (sb) != size) { | 156 if (SCROLLBAR_MSW_SIZE (sb) != size) { |
144 SCROLLBAR_MSW_SIZE (sb) = size; | 157 SCROLLBAR_MSW_SIZE (sb) = size; |
145 ShowScrollBar (SCROLLBAR_MSW_HANDLE (sb), SB_CTL, | 158 ShowScrollBar (SCROLLBAR_MSW_HANDLE (sb), SB_CTL, |
146 SCROLLBAR_MSW_SIZE (sb)); | 159 SCROLLBAR_MSW_SIZE (sb)); |
160 SCROLLBAR_MSW_INFO(sb).fMask |= SIF_DISABLENOSCROLL; | |
161 SetScrollInfo(SCROLLBAR_MSW_HANDLE (sb), SB_CTL, &SCROLLBAR_MSW_INFO (sb), TRUE); | |
147 FRAMEMETH (f, set_frame_size, (f, FRAME_WIDTH (f), FRAME_HEIGHT (f))); | 162 FRAMEMETH (f, set_frame_size, (f, FRAME_WIDTH (f), FRAME_HEIGHT (f))); |
148 } | 163 } |
149 } | 164 } |
150 | 165 |
151 void | 166 void |
153 { | 168 { |
154 struct frame *f; | 169 struct frame *f; |
155 Lisp_Object win; | 170 Lisp_Object win; |
156 struct scrollbar_instance *sb; | 171 struct scrollbar_instance *sb; |
157 SCROLLINFO scrollinfo; | 172 SCROLLINFO scrollinfo; |
173 int vert = GetWindowLong (hwnd, GWL_STYLE) & SBS_VERT; | |
158 | 174 |
159 sb = (struct scrollbar_instance *)GetWindowLong (hwnd, GWL_USERDATA); | 175 sb = (struct scrollbar_instance *)GetWindowLong (hwnd, GWL_USERDATA); |
160 win = real_window (sb->mirror, 1); | 176 win = real_window (sb->mirror, 1); |
161 f = XFRAME (XWINDOW (win)->frame); | 177 f = XFRAME (XWINDOW (win)->frame); |
162 | 178 |
179 inhibit_slider_size_change = code == SB_THUMBTRACK; | |
180 | |
181 /* SB_LINEDOWN == SB_CHARLEFT etc. This is the way they will | |
182 always be - any Windows is binary compatible backward with | |
183 old programs */ | |
184 | |
163 switch (code) | 185 switch (code) |
164 { | 186 { |
165 case SB_LINEDOWN: | 187 case SB_LINEDOWN: |
166 enqueue_misc_user_event(win, Qscrollbar_line_down, win); | 188 enqueue_misc_user_event(win, |
189 vert ? Qscrollbar_line_down : Qscrollbar_char_right, | |
190 win); | |
167 break; | 191 break; |
168 | 192 |
169 case SB_LINEUP: | 193 case SB_LINEUP: |
170 enqueue_misc_user_event(win, Qscrollbar_line_up, win); | 194 enqueue_misc_user_event(win, |
195 vert ? Qscrollbar_line_up : Qscrollbar_char_left, | |
196 win); | |
171 break; | 197 break; |
172 | 198 |
173 case SB_PAGEDOWN: | 199 case SB_PAGEDOWN: |
174 enqueue_misc_user_event(win, Qscrollbar_page_down, Fcons (win, Qnil)); | 200 enqueue_misc_user_event(win, |
201 vert ? Qscrollbar_page_down : Qscrollbar_page_right, | |
202 vert ? Fcons (win, Qnil) : win); | |
175 break; | 203 break; |
176 | 204 |
177 case SB_PAGEUP: | 205 case SB_PAGEUP: |
178 enqueue_misc_user_event(win, Qscrollbar_page_up, Fcons (win, Qnil)); | 206 enqueue_misc_user_event(win, |
207 vert ? Qscrollbar_page_up : Qscrollbar_page_left, | |
208 vert ? Fcons (win, Qnil) : win); | |
179 break; | 209 break; |
180 | 210 |
181 case SB_BOTTOM: | 211 case SB_BOTTOM: |
182 enqueue_misc_user_event(win, Qscrollbar_to_bottom, win); | 212 enqueue_misc_user_event(win, |
213 vert ? Qscrollbar_to_bottom : Qscrollbar_to_right, | |
214 win); | |
183 break; | 215 break; |
184 | 216 |
185 case SB_TOP: | 217 case SB_TOP: |
186 enqueue_misc_user_event(win, Qscrollbar_to_top, win); | 218 enqueue_misc_user_event(win, |
219 vert ? Qscrollbar_to_top : Qscrollbar_to_left, | |
220 win); | |
187 break; | 221 break; |
188 | 222 |
189 case SB_THUMBTRACK: | 223 case SB_THUMBTRACK: |
190 case SB_THUMBPOSITION: | 224 case SB_THUMBPOSITION: |
191 enqueue_misc_user_event (win, Qscrollbar_vertical_drag, | 225 scrollinfo.cbSize = sizeof(SCROLLINFO); |
192 Fcons (win, make_int (pos))); | 226 scrollinfo.fMask = SIF_TRACKPOS; |
227 GetScrollInfo (hwnd, SB_CTL, &scrollinfo); | |
228 enqueue_misc_user_event (win, | |
229 (vert ? Qscrollbar_vertical_drag | |
230 : Qscrollbar_horizontal_drag), | |
231 Fcons (win, make_int (scrollinfo.nTrackPos))); | |
193 break; | 232 break; |
194 } | 233 } |
195 } | 234 } |
196 | 235 |
197 #ifdef MEMORY_USAGE_STATS | 236 #ifdef MEMORY_USAGE_STATS |