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