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