All pastes #517186 Raw Edit

Unnamed

public text v1 · immutable
#517186 ·published 2007-05-29 00:03 UTC
rendered paste body
/* Quit the program on close button press for now */
static LRESULT CALLBACK window_callback(HWND hWnd, UINT message, 
    WPARAM wParam, LPARAM lParam)
{
	AL_DISPLAY_D3D *d;
	WINDOWINFO wi;
	int w;
	int h;
	int x;
	int y;
	unsigned int i;
	int fActive;
	AL_EVENT_SOURCE *es;

	if (message == msg_call_proc) {
		return ((int (*)(void))wParam) ();
	}

	if (message == msg_suicide) {
		DestroyWindow(hWnd);
		return 0;
	}


	for (i = 0; i < d3d_system->system.displays._size; i++) {
		AL_DISPLAY_D3D **dptr = _al_vector_ref(&d3d_system->system.displays, i);
		d = *dptr;
		if (d->window == hWnd) {
			break;
		}
	}
	es = &d->display.es;

	switch (message) { 
		case WM_SIZING:
			return 0;
		case WM_ACTIVATE:
			fActive = LOWORD(wParam);
			if (fActive != WA_INACTIVE) {
				for (i = 0; i < d3d_system->system.displays._size; i++) {
					AL_DISPLAY_D3D **dptr = _al_vector_ref(&d3d_system->system.displays, i);
					d = *dptr;
					if (d->window == hWnd) {
						break;
					}
				}
				_al_current_display = (AL_DISPLAY *)d;
				d3d_active_window = d->window;
				//d3d_win_grab_input();
				key_dinput_acquire();
			}
			return 0;
		case WM_CLOSE:
			_al_event_source_lock(es);
			if (_al_event_source_needs_to_generate_event(es, AL_EVENT_DISPLAY_CLOSE)) {
				AL_EVENT *event = _al_event_source_get_unused_event(es);
				if (event) {
					event->display.type = AL_EVENT_DISPLAY_CLOSE;
					event->display.timestamp = al_current_time();
					_al_event_source_emit_event(es, event);
				}
			}
			_al_event_source_unlock(es);
			return 0;
		case WM_SIZE:
			if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED) {
				/* Generate a resize event if the size has changed. We cannot asynchronously
				 * change the display size here yet, since the user will only know about a
				 * changed size after receiving the resize event. Here we merely add the
				 * event to the queue.
				 */
				h = HIWORD(lParam);
				w = LOWORD(lParam);
				wi.cbSize = sizeof(WINDOWINFO);
				GetWindowInfo(d->window, &wi);
				x = wi.rcClient.left;
				y = wi.rcClient.top;
				if (d->display.w != w || d->display.h != h) {
					_al_event_source_lock(es);
					if (_al_event_source_needs_to_generate_event(es, AL_EVENT_DISPLAY_RESIZE)) {
						AL_EVENT *event = _al_event_source_get_unused_event(es);
						if (event) {
							event->display.type = AL_EVENT_DISPLAY_RESIZE;
							event->display.timestamp = al_current_time();
							event->display.x = x;
							event->display.y = y;
							event->display.width = w;
							event->display.height = h;
							_al_event_source_emit_event(es, event);
						}
					}

					/* Generate an expose event. */
					if (_al_event_source_needs_to_generate_event(es, AL_EVENT_DISPLAY_EXPOSE)) {
						AL_EVENT *event = _al_event_source_get_unused_event(es);
						if (event) {
							event->display.type = AL_EVENT_DISPLAY_EXPOSE;
							event->display.timestamp = al_current_time();
							event->display.x = x;
							event->display.y = y;
							event->display.width = w;
							event->display.height = h;
							_al_event_source_emit_event(es, event);
						}
					}
					_al_event_source_unlock(es);
				}
				return 0;
			}
	} 

	return DefWindowProc(hWnd,message,wParam,lParam); 
}

/* wnd_thread_proc:
 *  Thread function that handles the messages of the directx window.
 */
static void d3d_wnd_thread_proc(HANDLE setup_event)
{
   DWORD result;
   MSG msg;
   unsigned int i;
   HWND my_window;

    // Create A Window Class Structure 
    WNDCLASSEX wc;
    wc.cbClsExtra = 0;
    wc.cbSize = sizeof(wc); 
    wc.cbWndExtra = 0; 
    wc.hbrBackground = NULL;
    wc.hCursor = NULL; 
    wc.hIcon = NULL; 
    wc.hIconSm = NULL; 
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpfnWndProc = window_callback;
    wc.lpszClassName = "X3D"; 
    wc.lpszMenuName = NULL;
    wc.style = CS_VREDRAW|CS_HREDRAW|CS_OWNDC;

    // Register Window Class
    RegisterClassEx(&wc); 

    // Create Window 
    my_window = CreateWindowEx(0, 
       "X3D", "D3D Window", 
       WS_OVERLAPPEDWINDOW|WS_VISIBLE,
       100, 100, new_window_width, new_window_height,
       NULL,NULL,wc.hInstance,0);

    new_window = my_window;

   _win_thread_init();

	for (;;) {
	 while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
	    if (GetMessage(&msg, NULL, 0, 0)) {
	       DispatchMessage(&msg);
	    }
	    else {
	       goto End;
	    }
	 }
	}

End:
   _TRACE("window thread exits\n");

   _win_thread_exit();
}

static void start_window_thread()
{
	HANDLE hThread;
	hThread= (HANDLE) _beginthread(d3d_wnd_thread_proc, 0, hThread);
}

HWND d3d_create_window(int width, int height)
{
	new_window = (HWND)-1;
	new_window_width = width;
	new_window_height = height;
	start_window_thread();
	while (new_window == (HWND)-1)
		;
	if (_d3d_keyboard_initialized) {
		AL_DISPLAY_D3D *d = (AL_DISPLAY_D3D *)_al_current_display;
		key_dinput_set_cooperation_level(new_window);
		d->keyboard_initialized = true;
	}
	d3d_active_window = new_window;
	return new_window;
}