void WIMP_UpdateRects(_THIS, int numrects, SDL_Rect *rects) { _kernel_swi_regs regs; int update_block[12]; int xeig = this->hidden->xeig; int yeig = this->hidden->yeig; int j; update_block[0] = this->hidden->window_handle; for (j = 0; j < numrects; j++) { update_block[1] = rects[j].x << xeig; /* Min X */ update_block[4] = -(rects[j].y << yeig); update_block[3] = update_block[1] + (rects[j].w << xeig); update_block[2] = update_block[4] - (rects[j].h << yeig); regs.r[1] = (int)update_block; /* Update window can fail if called before first poll */ if (_kernel_swi(Wimp_UpdateWindow, ®s, ®s) == 0) { while (regs.r[0]) { WIMP_PlotSprite(this, update_block[1], update_block[2]); _kernel_swi(Wimp_GetRectangle, ®s, ®s); } } } }
void WIMP_Poll(_THIS, int waitTime) { _kernel_swi_regs regs; int message[64]; unsigned int code; int pollMask = 0; int doPoll = 1; int sysEvent; int sdlWindow = this->hidden->window_handle; if (this->PumpEvents != WIMP_PumpEvents) return; if (waitTime > 0) { _kernel_swi(OS_ReadMonotonicTime, ®s, ®s); waitTime += regs.r[0]; } while (doPoll) { if (waitTime <= 0) { regs.r[0] = pollMask; /* Poll Mask */ /* For no wait time mask out null event so we wait until something happens */ if (waitTime < 0) regs.r[0] |= 1; regs.r[1] = (int)message; _kernel_swi(Wimp_Poll, ®s, ®s); } else { regs.r[0] = pollMask; regs.r[1] = (int)message; regs.r[2] = waitTime; _kernel_swi(Wimp_PollIdle, ®s, ®s); } /* Flag to specify if we post a SDL_SysWMEvent */ sysEvent = 0; code = (unsigned int)regs.r[0]; switch(code) { case 0: /* Null Event - drop out for standard processing*/ doPoll = 0; break; case 1: /* Redraw window */ _kernel_swi(Wimp_RedrawWindow, ®s,®s); if (message[0] == sdlWindow) { while (regs.r[0]) { WIMP_PlotSprite(this, message[1], message[2]); _kernel_swi(Wimp_GetRectangle, ®s, ®s); } } else { /* TODO: Currently we just eat them - we may need to pass them on */ while (regs.r[0]) { _kernel_swi(Wimp_GetRectangle, ®s, ®s); } } break; case 2: /* Open window */ if ( resizeOnOpen && message[0] == sdlWindow) { /* Ensure window is correct size */ resizeOnOpen = 0; message[3] = message[1] + (this->screen->w << this->hidden->xeig); message[4] = message[2] + (this->screen->h << this->hidden->yeig); } _kernel_swi(Wimp_OpenWindow, ®s, ®s); break; case 3: /* Close window */ if (message[0] == sdlWindow) { /* Documentation makes it looks as if the following line is correct: ** if (SDL_PrivateQuit() == 1) _kernel_swi(Wimp_CloseWindow, ®s, ®s); ** However some programs don't process this message and so sit there invisibly ** in the background so I just post the quit message and hope the application ** does the correct thing. */ SDL_PrivateQuit(); } else sysEvent = 1; doPoll = 0; break; case 4: /* Pointer_Leaving_Window */ if (message[0] == sdlWindow) { mouseInWindow = 0; //TODO: Lose buttons / dragging /* Reset to default pointer */ regs.r[0] = 106; regs.r[1] = 1; regs.r[2] = 0; _kernel_swi(OS_Byte, ®s, ®s); SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); } else sysEvent = 1; break; case 5: /* Pointer_Entering_Window */ if (message[0] == sdlWindow) { mouseInWindow = 1; WIMP_ReshowCursor(this); SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); } else sysEvent = 1; break; case 6: /* Mouse_Click */ if (hasFocus == 0) { /* First click gives focus if it's not a menu */ /* we only count non-menu clicks on a window that has the focus */ WIMP_SetFocus(message[3]); } else doPoll = 0; // So PollMouse gets a chance to pick it up break; case 7: /* User_Drag_Box - Used for mouse release */ //TODO: May need to implement this in the future sysEvent = 1; break; case 8: /* Keypressed */ doPoll = 0; /* PollKeyboard should pick it up */ if (message[0] != sdlWindow) sysEvent = 1; /*TODO: May want to always pass F12 etc to the wimp { regs.r[0] = message[6]; _kernel_swi(Wimp_ProcessKey, ®s, ®s); } */ break; case 11: /* Lose Caret */ hasFocus = 0; if (message[0] == sdlWindow) SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS); else sysEvent = 1; break; case 12: /* Gain Caret */ hasFocus = 1; if (message[0] == sdlWindow) SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); else sysEvent = 1; break; case 17: case 18: sysEvent = 1; /* All messages are passed on */ switch(message[4]) { case 0: /* Quit Event */ /* No choice - have to quit */ SDL_Quit(); exit(0); break; case 8: /* Pre Quit */ SDL_PrivateQuit(); break; case 0x400c1: /* Mode change */ WIMP_ModeChanged(this); resizeOnOpen = 1; break; case 9: /* Palette changed */ WIMP_PaletteChanged(this); break; } break; default: /* Pass unknown events on */ sysEvent = 1; break; } if (sysEvent) { SDL_SysWMmsg wmmsg; SDL_VERSION(&wmmsg.version); wmmsg.eventCode = code; memcpy(wmmsg.pollBlock, message, 64 * sizeof(int)); /* Fall out of polling loop if message is successfully posted */ if (SDL_PrivateSysWMEvent(&wmmsg)) doPoll = 0; } } }