(svn r6036) -Codechange: do not handle SCROLL in a central function, but let windows handle them theirself. Added WE_SCROLL for this.
This commit is contained in:
		
							
								
								
									
										12
									
								
								main_gui.c
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								main_gui.c
									
									
									
									
									
								
							@@ -2317,6 +2317,18 @@ static void MainWindowWndProc(Window *w, WindowEvent *e)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		e->keypress.cont = false;
 | 
							e->keypress.cont = false;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case WE_SCROLL: {
 | 
				
			||||||
 | 
								ViewPort *vp = IsPtInWindowViewport(w, _cursor.pos.x, _cursor.pos.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (vp == NULL) {
 | 
				
			||||||
 | 
									_cursor.fix_at = false;
 | 
				
			||||||
 | 
									_scrolling_viewport = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								WP(w, vp_d).scrollpos_x += e->scroll.delta.x << vp->zoom;
 | 
				
			||||||
 | 
								WP(w, vp_d).scrollpos_y += e->scroll.delta.y << vp->zoom;
 | 
				
			||||||
 | 
							} break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -882,6 +882,67 @@ static void SmallMapWindowProc(Window *w, WindowEvent *e)
 | 
				
			|||||||
		/* update the window every now and then */
 | 
							/* update the window every now and then */
 | 
				
			||||||
		if ((++w->vscroll.pos & 0x1F) == 0) SetWindowDirty(w);
 | 
							if ((++w->vscroll.pos & 0x1F) == 0) SetWindowDirty(w);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case WE_SCROLL: {
 | 
				
			||||||
 | 
								int x;
 | 
				
			||||||
 | 
								int y;
 | 
				
			||||||
 | 
								int sub;
 | 
				
			||||||
 | 
								int hx;
 | 
				
			||||||
 | 
								int hy;
 | 
				
			||||||
 | 
								int hvx;
 | 
				
			||||||
 | 
								int hvy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								_cursor.fix_at = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								x = WP(w, smallmap_d).scroll_x;
 | 
				
			||||||
 | 
								y = WP(w, smallmap_d).scroll_y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								sub = WP(w, smallmap_d).subscroll + e->scroll.delta.x;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								x -= (sub >> 2) << 4;
 | 
				
			||||||
 | 
								y += (sub >> 2) << 4;
 | 
				
			||||||
 | 
								sub &= 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								x += (e->scroll.delta.y >> 1) << 4;
 | 
				
			||||||
 | 
								y += (e->scroll.delta.y >> 1) << 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (e->scroll.delta.y & 1) {
 | 
				
			||||||
 | 
									x += TILE_SIZE;
 | 
				
			||||||
 | 
									sub += 2;
 | 
				
			||||||
 | 
									if (sub > 3) {
 | 
				
			||||||
 | 
										sub -= 4;
 | 
				
			||||||
 | 
										x -= TILE_SIZE;
 | 
				
			||||||
 | 
										y += TILE_SIZE;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								hx = (w->widget[4].right  - w->widget[4].left) / 2;
 | 
				
			||||||
 | 
								hy = (w->widget[4].bottom - w->widget[4].top ) / 2;
 | 
				
			||||||
 | 
								hvx = hx * -4 + hy * 8;
 | 
				
			||||||
 | 
								hvy = hx *  4 + hy * 8;
 | 
				
			||||||
 | 
								if (x < -hvx) {
 | 
				
			||||||
 | 
									x = -hvx;
 | 
				
			||||||
 | 
									sub = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (x > (int)MapMaxX() * TILE_SIZE - hvx) {
 | 
				
			||||||
 | 
									x = MapMaxX() * TILE_SIZE - hvx;
 | 
				
			||||||
 | 
									sub = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (y < -hvy) {
 | 
				
			||||||
 | 
									y = -hvy;
 | 
				
			||||||
 | 
									sub = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (y > (int)MapMaxY() * TILE_SIZE - hvy) {
 | 
				
			||||||
 | 
									y = MapMaxY() * TILE_SIZE - hvy;
 | 
				
			||||||
 | 
									sub = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								WP(w, smallmap_d).scroll_x = x;
 | 
				
			||||||
 | 
								WP(w, smallmap_d).scroll_y = y;
 | 
				
			||||||
 | 
								WP(w, smallmap_d).subscroll = sub;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SetWindowDirty(w);
 | 
				
			||||||
 | 
							} break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -979,6 +1040,18 @@ static void ExtraViewPortWndProc(Window *w, WindowEvent *e)
 | 
				
			|||||||
		w->viewport->virtual_width  += e->sizing.diff.x;
 | 
							w->viewport->virtual_width  += e->sizing.diff.x;
 | 
				
			||||||
		w->viewport->virtual_height += e->sizing.diff.y;
 | 
							w->viewport->virtual_height += e->sizing.diff.y;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case WE_SCROLL: {
 | 
				
			||||||
 | 
								ViewPort *vp = IsPtInWindowViewport(w, _cursor.pos.x, _cursor.pos.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (vp == NULL) {
 | 
				
			||||||
 | 
									_cursor.fix_at = false;
 | 
				
			||||||
 | 
									_scrolling_viewport = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								WP(w, vp_d).scrollpos_x += e->scroll.delta.x << vp->zoom;
 | 
				
			||||||
 | 
								WP(w, vp_d).scrollpos_y += e->scroll.delta.y << vp->zoom;
 | 
				
			||||||
 | 
							} break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										91
									
								
								window.c
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								window.c
									
									
									
									
									
								
							@@ -1146,99 +1146,30 @@ static bool HandleScrollbarScrolling(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static bool HandleViewportScroll(void)
 | 
					static bool HandleViewportScroll(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						WindowEvent we;
 | 
				
			||||||
	Window *w;
 | 
						Window *w;
 | 
				
			||||||
	int dx;
 | 
					 | 
				
			||||||
	int dy;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!_scrolling_viewport) return true;
 | 
						if (!_scrolling_viewport) return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!_right_button_down) {
 | 
						w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
 | 
				
			||||||
stop_capt:;
 | 
					
 | 
				
			||||||
 | 
						if (!_right_button_down || w == NULL) {
 | 
				
			||||||
		_cursor.fix_at = false;
 | 
							_cursor.fix_at = false;
 | 
				
			||||||
		_scrolling_viewport = false;
 | 
							_scrolling_viewport = false;
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
 | 
					 | 
				
			||||||
	if (w == NULL) goto stop_capt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (_patches.reverse_scroll) {
 | 
						if (_patches.reverse_scroll) {
 | 
				
			||||||
		dx = -_cursor.delta.x;
 | 
							we.scroll.delta.x = -_cursor.delta.x;
 | 
				
			||||||
		dy = -_cursor.delta.y;
 | 
							we.scroll.delta.y = -_cursor.delta.y;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		dx = _cursor.delta.x;
 | 
							we.scroll.delta.x = _cursor.delta.x;
 | 
				
			||||||
		dy = _cursor.delta.y;
 | 
							we.scroll.delta.y = _cursor.delta.y;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (w->window_class != WC_SMALLMAP) {
 | 
						/* Create a scroll-event and send it to the window */
 | 
				
			||||||
		ViewPort *vp = IsPtInWindowViewport(w, _cursor.pos.x, _cursor.pos.y);
 | 
						we.event = WE_SCROLL;
 | 
				
			||||||
 | 
						w->wndproc(w, &we);
 | 
				
			||||||
		if (vp == NULL)
 | 
					 | 
				
			||||||
			goto stop_capt;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		WP(w,vp_d).scrollpos_x += dx << vp->zoom;
 | 
					 | 
				
			||||||
		WP(w,vp_d).scrollpos_y += dy << vp->zoom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		int x;
 | 
					 | 
				
			||||||
		int y;
 | 
					 | 
				
			||||||
		int sub;
 | 
					 | 
				
			||||||
		int hx;
 | 
					 | 
				
			||||||
		int hy;
 | 
					 | 
				
			||||||
		int hvx;
 | 
					 | 
				
			||||||
		int hvy;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		_cursor.fix_at = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		x = WP(w,smallmap_d).scroll_x;
 | 
					 | 
				
			||||||
		y = WP(w,smallmap_d).scroll_y;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		sub = WP(w,smallmap_d).subscroll + dx;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		x -= (sub >> 2) << 4;
 | 
					 | 
				
			||||||
		y += (sub >> 2) << 4;
 | 
					 | 
				
			||||||
		sub &= 3;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		x += (dy >> 1) << 4;
 | 
					 | 
				
			||||||
		y += (dy >> 1) << 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (dy & 1) {
 | 
					 | 
				
			||||||
			x += TILE_SIZE;
 | 
					 | 
				
			||||||
			sub += 2;
 | 
					 | 
				
			||||||
			if (sub > 3) {
 | 
					 | 
				
			||||||
				sub -= 4;
 | 
					 | 
				
			||||||
				x -= TILE_SIZE;
 | 
					 | 
				
			||||||
				y += TILE_SIZE;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		hx = (w->widget[4].right  - w->widget[4].left) / 2;
 | 
					 | 
				
			||||||
		hy = (w->widget[4].bottom - w->widget[4].top ) / 2;
 | 
					 | 
				
			||||||
		hvx = hx * -4 + hy * 8;
 | 
					 | 
				
			||||||
		hvy = hx *  4 + hy * 8;
 | 
					 | 
				
			||||||
		if (x < -hvx) {
 | 
					 | 
				
			||||||
			x = -hvx;
 | 
					 | 
				
			||||||
			sub = 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (x > (int)MapMaxX() * TILE_SIZE - hvx) {
 | 
					 | 
				
			||||||
			x = MapMaxX() * TILE_SIZE - hvx;
 | 
					 | 
				
			||||||
			sub = 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (y < -hvy) {
 | 
					 | 
				
			||||||
			y = -hvy;
 | 
					 | 
				
			||||||
			sub = 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (y > (int)MapMaxY() * TILE_SIZE - hvy) {
 | 
					 | 
				
			||||||
			y = MapMaxY() * TILE_SIZE - hvy;
 | 
					 | 
				
			||||||
			sub = 0;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		WP(w,smallmap_d).scroll_x = x;
 | 
					 | 
				
			||||||
		WP(w,smallmap_d).scroll_y = y;
 | 
					 | 
				
			||||||
		WP(w,smallmap_d).subscroll = sub;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		SetWindowDirty(w);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_cursor.delta.x = 0;
 | 
						_cursor.delta.x = 0;
 | 
				
			||||||
	_cursor.delta.y = 0;
 | 
						_cursor.delta.y = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								window.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								window.h
									
									
									
									
									
								
							@@ -136,6 +136,11 @@ union WindowEvent {
 | 
				
			|||||||
		uint wparam; // additional message-specific information
 | 
							uint wparam; // additional message-specific information
 | 
				
			||||||
		uint lparam; // additional message-specific information
 | 
							uint lparam; // additional message-specific information
 | 
				
			||||||
	} message;
 | 
						} message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							byte event;
 | 
				
			||||||
 | 
							Point delta; // delta position against position of last call
 | 
				
			||||||
 | 
						} scroll;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum WindowKeyCodes {
 | 
					enum WindowKeyCodes {
 | 
				
			||||||
@@ -506,7 +511,8 @@ enum WindowEvents {
 | 
				
			|||||||
	WE_MOUSEOVER = 20,
 | 
						WE_MOUSEOVER = 20,
 | 
				
			||||||
	WE_ON_EDIT_TEXT_CANCEL = 21,
 | 
						WE_ON_EDIT_TEXT_CANCEL = 21,
 | 
				
			||||||
	WE_RESIZE = 22,
 | 
						WE_RESIZE = 22,
 | 
				
			||||||
	WE_MESSAGE = 23
 | 
						WE_MESSAGE = 23,
 | 
				
			||||||
 | 
						WE_SCROLL = 24,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user