All pastes #513154 Raw Edit

Untitled

public text v1 · immutable
#513154 ·published 2007-05-27 04:14 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;

	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;
		}
	}

	switch (message) { 
		case WM_CLOSE:
			printf("WM_CLOSE\n");
			PostQuitMessage(0); 
			return 0;
		case WM_SIZE:
			if (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED) {
				AL_EVENT_SOURCE *es = &d->display.es;
				_al_event_source_lock(es);

				/* 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 = lParam >> (sizeof(lParam)*4); // high word
				w = lParam - (h << (sizeof(lParam)*4)); // low word
				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) {
					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); 
}