Changeset - r4489:8dad611d0fcc
[Not reviewed]
master
0 1 0
tron - 18 years ago 2006-08-31 14:50:12
tron@openttd.org
(svn r6274) Clean up a bit
1 file changed with 55 insertions and 39 deletions:
0 comments (0 inline, 0 general)
video/win32_v.c
Show inline comments
 
@@ -17,14 +17,16 @@ static struct {
 
	HWND main_wnd;
 
	HBITMAP dib_sect;
 
	Pixel *bitmap_bits;
 
	Pixel *buffer_bits;
 
	Pixel *alloced_bits;
 
	HPALETTE gdi_palette;
 
	int width,height;
 
	int width_org, height_org;
 
	int width;
 
	int height;
 
	int width_org;
 
	int height_org;
 
	bool fullscreen;
 
	bool double_size;
 
	bool has_focus;
 
	bool running;
 
} _wnd;
 

	
 
@@ -49,14 +51,13 @@ static void MakePalette(void)
 
		pal->palPalEntry[i].peGreen = _cur_palette[i].g;
 
		pal->palPalEntry[i].peBlue  = _cur_palette[i].b;
 
		pal->palPalEntry[i].peFlags = 0;
 

	
 
	}
 
	_wnd.gdi_palette = CreatePalette(pal);
 
	if (_wnd.gdi_palette == NULL)
 
		error("CreatePalette failed!\n");
 
	if (_wnd.gdi_palette == NULL) error("CreatePalette failed!\n");
 
}
 

	
 
static void UpdatePalette(HDC dc, uint start, uint count)
 
{
 
	RGBQUAD rgb[256];
 
	uint i;
 
@@ -217,12 +218,13 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 

	
 
	case WM_PAINT: {
 
		PAINTSTRUCT ps;
 
		HDC dc,dc2;
 
		HBITMAP old_bmp;
 
		HPALETTE old_palette;
 

	
 
		BeginPaint(hwnd, &ps);
 
		dc = ps.hdc;
 
		dc2 = CreateCompatibleDC(dc);
 
		old_bmp = SelectObject(dc2, _wnd.dib_sect);
 
		old_palette = SelectPalette(dc, _wnd.gdi_palette, FALSE);
 

	
 
@@ -233,23 +235,24 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 

	
 
		BitBlt(dc, 0, 0, _wnd.width, _wnd.height, dc2, 0, 0, SRCCOPY);
 
		SelectPalette(dc, old_palette, TRUE);
 
		SelectObject(dc2, old_bmp);
 
		DeleteDC(dc2);
 
		EndPaint(hwnd, &ps);
 
			return 0;
 
		}
 
		return 0;
 

	
 
	case WM_PALETTECHANGED:
 
		if ((HWND)wParam == hwnd)
 
			return 0;
 
		// FALL THROUGH
 
			if ((HWND)wParam == hwnd) return 0;
 
			/* FALLTHROUGH */
 

	
 
	case WM_QUERYNEWPALETTE: {
 
		HDC hDC = GetWindowDC(hwnd);
 
		HPALETTE hOldPalette = SelectPalette(hDC, _wnd.gdi_palette, FALSE);
 
		UINT nChanged = RealizePalette(hDC);
 

	
 
		SelectPalette(hDC, hOldPalette, TRUE);
 
		ReleaseDC(hwnd, hDC);
 
		if (nChanged) InvalidateRect(hwnd, NULL, FALSE);
 
		return 0;
 
	}
 

	
 
@@ -345,60 +348,65 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 
		return 0;
 
	}
 

	
 
	case WM_KEYDOWN: {
 
		// this is the rewritten ascii input function
 
		// it disables windows deadkey handling --> more linux like :D
 
		unsigned short w = 0;
 
		int r = 0;
 
			WORD w = 0;
 
		byte ks[256];
 
		unsigned int scan = 0;
 
		uint16 scancode = (( lParam & 0xFF0000 ) >> 16 );
 
			uint scancode;
 

	
 
		GetKeyboardState(ks);
 
		r = ToAscii(wParam, scan, ks, &w, 0);
 
		if (r == 0) w = 0; // no translation was possible
 
			if (ToAscii(wParam, 0, ks, &w, 0) == 0) {
 
				w = 0; // no translation was possible
 
			}
 

	
 
		_pressed_key = w | MapWindowsKey(wParam) << 16;
 

	
 
		if (scancode == 41)
 
			_pressed_key = w | WKC_BACKQUOTE << 16;
 
			scancode = GB(lParam, 16, 8);
 
			if (scancode == 41) _pressed_key = w | WKC_BACKQUOTE << 16;
 

	
 
		if ((_pressed_key >> 16) == ('D' | WKC_CTRL) && !_wnd.fullscreen) {
 
			_double_size ^= 1;
 
			_wnd.double_size = _double_size;
 
			ClientSizeChanged(_wnd.width, _wnd.height);
 
			MarkWholeScreenDirty();
 
		}
 
	} break;
 
			break;
 
		}
 

	
 
	case WM_SYSKEYDOWN: /* user presses F10 or Alt, both activating the title-menu */
 
		switch (wParam) {
 
		case VK_RETURN: case 0x46: /* Full Screen on ALT + ENTER/F(VK_F) */
 
				case VK_RETURN:
 
				case 'F': /* Full Screen on ALT + ENTER/F */
 
			ToggleFullScreen(!_wnd.fullscreen);
 
			return 0;
 

	
 
		case VK_MENU: /* Just ALT */
 
			return 0; // do nothing
 

	
 
		case VK_F10: /* F10, ignore activation of menu */
 
			_pressed_key = MapWindowsKey(wParam) << 16;
 
			return 0;
 

	
 
		default: /* ALT in combination with something else */
 
			_pressed_key = MapWindowsKey(wParam) << 16;
 
			break;
 
		}
 
		break;
 

	
 
	case WM_NCMOUSEMOVE:
 
		MyShowCursor(true);
 
		return 0;
 

	
 
	case WM_SIZE: {
 
		case WM_SIZE:
 
		if (wParam != SIZE_MINIMIZED) {
 
			ClientSizeChanged(LOWORD(lParam), HIWORD(lParam));
 
		}
 
		return 0;
 
	}
 

	
 
	case WM_SIZING: {
 
		RECT* r = (RECT*)lParam;
 
		RECT r2;
 
		int w, h;
 

	
 
		SetRect(&r2, 0, 0, 0, 0);
 
@@ -423,33 +431,40 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 
		h = r2.bottom - r2.top;
 

	
 
		switch (wParam) {
 
		case WMSZ_BOTTOM:
 
			r->bottom = r->top + h;
 
			break;
 

	
 
		case WMSZ_BOTTOMLEFT:
 
			r->bottom = r->top + h;
 
			r->left = r->right - w;
 
			break;
 

	
 
		case WMSZ_BOTTOMRIGHT:
 
			r->bottom = r->top + h;
 
			r->right = r->left + w;
 
			break;
 

	
 
		case WMSZ_LEFT:
 
			r->left = r->right - w;
 
			break;
 

	
 
		case WMSZ_RIGHT:
 
			r->right = r->left + w;
 
			break;
 

	
 
		case WMSZ_TOP:
 
			r->top = r->bottom - h;
 
			break;
 

	
 
		case WMSZ_TOPLEFT:
 
			r->top = r->bottom - h;
 
			r->left = r->right - w;
 
			break;
 

	
 
		case WMSZ_TOPRIGHT:
 
			r->top = r->bottom - h;
 
			r->right = r->left + w;
 
			break;
 
		}
 
		return TRUE;
 
@@ -480,13 +495,14 @@ static LRESULT CALLBACK WndProcGdi(HWND 
 
	}
 
	return DefWindowProc(hwnd, msg, wParam, lParam);
 
}
 

	
 
static void RegisterWndClass(void)
 
{
 
	static bool registered;
 
	static bool registered = false;
 

	
 
	if (!registered) {
 
		HINSTANCE hinst = GetModuleHandle(NULL);
 
		WNDCLASS wnd = {
 
			0,
 
			WndProcGdi,
 
			0,
 
@@ -495,15 +511,15 @@ static void RegisterWndClass(void)
 
			LoadIcon(hinst, MAKEINTRESOURCE(100)),
 
			LoadCursor(NULL, IDC_ARROW),
 
			0,
 
			0,
 
			"OTTD"
 
		};
 

	
 
		registered = true;
 
		if (!RegisterClass(&wnd))
 
			error("RegisterClass failed");
 
		if (!RegisterClass(&wnd)) error("RegisterClass failed");
 
	}
 
}
 

	
 
extern const char _openttd_revision[];
 

	
 
static void MakeWindow(bool full_screen)
 
@@ -517,25 +533,25 @@ static void MakeWindow(bool full_screen)
 
		DestroyWindow(_wnd.main_wnd);
 
		_wnd.main_wnd = 0;
 
	}
 

	
 
	if (full_screen) {
 
		DEVMODE settings;
 
		memset(&settings, 0, sizeof(DEVMODE));
 
		settings.dmSize = sizeof(DEVMODE);
 
		settings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
 

	
 
		if (_fullscreen_bpp) {
 
		memset(&settings, 0, sizeof(settings));
 
		settings.dmSize = sizeof(settings);
 
		settings.dmFields =
 
			(_fullscreen_bpp != 0 ? DM_BITSPERPEL : 0) |
 
			DM_PELSWIDTH |
 
			DM_PELSHEIGHT |
 
			(_display_hz != 0 ? DM_DISPLAYFREQUENCY : 0);
 
			settings.dmBitsPerPel = _fullscreen_bpp;
 
			settings.dmFields |= DM_BITSPERPEL;
 
		}
 
		settings.dmPelsWidth = _wnd.width_org;
 
		settings.dmPelsHeight = _wnd.height_org;
 
		settings.dmDisplayFrequency = _display_hz;
 
		if (settings.dmDisplayFrequency != 0)
 
			settings.dmFields |= DM_DISPLAYFREQUENCY;
 

	
 
		if (ChangeDisplaySettings(&settings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {
 
			MakeWindow(false);
 
			return;
 
		}
 
	} else if (_wnd.fullscreen) {
 
		// restore display?
 
@@ -618,23 +634,20 @@ static bool AllocateDibSection(int w, in
 
	bi->bmiHeader.biHeight = -(_wnd.height = h);
 

	
 
	bi->bmiHeader.biPlanes = 1;
 
	bi->bmiHeader.biBitCount = 8;
 
	bi->bmiHeader.biCompression = BI_RGB;
 

	
 
	if (_wnd.dib_sect)
 
		DeleteObject(_wnd.dib_sect);
 
	if (_wnd.dib_sect) DeleteObject(_wnd.dib_sect);
 

	
 
	dc = GetDC(0);
 
	_wnd.dib_sect = CreateDIBSection(dc, bi, DIB_RGB_COLORS, (void**)&_wnd.bitmap_bits, NULL, 0);
 
	if (_wnd.dib_sect == NULL)
 
		error("CreateDIBSection failed");
 
	_wnd.dib_sect = CreateDIBSection(dc, bi, DIB_RGB_COLORS, (VOID**)&_wnd.bitmap_bits, NULL, 0);
 
	if (_wnd.dib_sect == NULL) error("CreateDIBSection failed");
 
	ReleaseDC(0, dc);
 

	
 
	if (!_wnd.double_size)
 
		_wnd.buffer_bits = _wnd.bitmap_bits;
 
	if (!_wnd.double_size) _wnd.buffer_bits = _wnd.bitmap_bits;
 

	
 
	return true;
 
}
 

	
 
static const uint16 default_resolutions[][2] = {
 
	{ 640,  480},
 
@@ -843,13 +856,16 @@ static bool Win32GdiChangeRes(int w, int
 

	
 
	MakeWindow(_fullscreen); // _wnd.fullscreen screws up ingame resolution switching
 

	
 
	return true;
 
}
 

	
 
static void Win32GdiFullScreen(bool full_screen) {MakeWindow(full_screen);}
 
static void Win32GdiFullScreen(bool full_screen)
 
{
 
	MakeWindow(full_screen);
 
}
 

	
 
const HalVideoDriver _win32_video_driver = {
 
	Win32GdiStart,
 
	Win32GdiStop,
 
	Win32GdiMakeDirty,
 
	Win32GdiMainLoop,
0 comments (0 inline, 0 general)