/* 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); }