void miSendExposures(WindowPtr pWin, RegionPtr pRgn, int dx, int dy) { BoxPtr pBox; int numRects; xEvent *pEvent, *pe; int i; pBox = RegionRects(pRgn); numRects = RegionNumRects(pRgn); if (!(pEvent = calloc(1, numRects * sizeof(xEvent)))) return; for (i = numRects, pe = pEvent; --i >= 0; pe++, pBox++) { pe->u.u.type = Expose; pe->u.expose.window = pWin->drawable.id; pe->u.expose.x = pBox->x1 - dx; pe->u.expose.y = pBox->y1 - dy; pe->u.expose.width = pBox->x2 - pBox->x1; pe->u.expose.height = pBox->y2 - pBox->y1; pe->u.expose.count = i; } #ifdef PANORAMIX if (!noPanoramiXExtension) { int scrnum = pWin->drawable.pScreen->myNum; int x = 0, y = 0; XID realWin = 0; if (!pWin->parent) { x = screenInfo.screens[scrnum]->x; y = screenInfo.screens[scrnum]->y; pWin = screenInfo.screens[0]->root; realWin = pWin->drawable.id; } else if (scrnum) { PanoramiXRes *win; win = PanoramiXFindIDByScrnum(XRT_WINDOW, pWin->drawable.id, scrnum); if (!win) { free(pEvent); return; } realWin = win->info[0].id; dixLookupWindow(&pWin, realWin, serverClient, DixSendAccess); } if (x || y || scrnum) for (i = 0; i < numRects; i++) { pEvent[i].u.expose.window = realWin; pEvent[i].u.expose.x += x; pEvent[i].u.expose.y += y; } } #endif DeliverEvents(pWin, pEvent, numRects, NullWindow); free(pEvent); }
//--------------------------------------------------------------------------- void __fastcall TTVPMainForm::ApplicationIdle(TObject *Sender, bool &Done) { DeliverEvents(); bool cont = ContinuousEventCalling; Done = !cont; MixedIdleTick += GetTickCount(); }
//--------------------------------------------------------------------------- void __fastcall TTVPMainForm::SystemWatchTimerTimer(TObject *Sender) { if(TVPTerminated) { // this will ensure terminating the application. // the WM_QUIT message disappears in some unknown situations... ::PostMessage(TVPMainForm->Handle, WM_USER+0x31/*dummy msg*/, 0, 0); Application->Terminate(); ::PostMessage(TVPMainForm->Handle, WM_USER+0x31/*dummy msg*/, 0, 0); } // call events DWORD tick = GetTickCount(); // push environ noise TVPPushEnvironNoise(&tick, sizeof(tick)); TVPPushEnvironNoise(&LastCompactedTick, sizeof(LastCompactedTick)); TVPPushEnvironNoise(&LastShowModalWindowSentTick, sizeof(LastShowModalWindowSentTick)); TVPPushEnvironNoise(&MixedIdleTick, sizeof(MixedIdleTick)); POINT pt; GetCursorPos(&pt); TVPPushEnvironNoise(&pt, sizeof(pt)); // CPU clock monitoring { static bool clock_rough_printed = false; if(!clock_rough_printed && TVPCPUClockAccuracy == ccaRough) { tjs_char msg[80]; TJS_sprintf(msg, TJS_W("(info) CPU clock (roughly) : %dMHz"), (int)TVPCPUClock); TVPAddImportantLog(msg); clock_rough_printed = true; } static bool clock_printed = false; if(!clock_printed && TVPCPUClockAccuracy == ccaAccurate) { tjs_char msg[80]; TJS_sprintf(msg, TJS_W("(info) CPU clock : %.1fMHz"), (float)TVPCPUClock); TVPAddImportantLog(msg); clock_printed = true; } } // check status and deliver events DeliverEvents(); // call TickBeat tjs_int count = TVPGetWindowCount(); for(tjs_int i = 0; i<count; i++) { tTJSNI_Window *win = TVPGetWindowListAt(i); win->TickBeat(); } if(!ContinuousEventCalling && tick - LastCompactedTick > 4000) { // idle state over 4 sec. LastCompactedTick = tick; // fire compact event TVPDeliverCompactEvent(TVP_COMPACT_LEVEL_IDLE); } if(!ContinuousEventCalling && tick > LastRehashedTick + 1500) { // TJS2 object rehash LastRehashedTick = tick; TJSDoRehash(); } if(LastCloseClickedTick && tick - LastCloseClickedTick > 3100) { // display force suicide confirmation form if(TVPHaltWarnForm) { TVPHaltWarnForm->Visible = true; } else { TVPHaltWarnForm = new TTVPHaltWarnForm(Application); TVPHaltWarnForm->Visible = true; } } // ensure modal window visible if(tick > LastShowModalWindowSentTick + 4100) { // ::PostMessage(Handle, WM_USER+0x32, 0, 0); // This is currently disabled because IME composition window // hides behind the window which is bringed top by the // window-rearrangement. LastShowModalWindowSentTick = tick; } }
void miSendGraphicsExpose(ClientPtr client, RegionPtr pRgn, XID drawable, int major, int minor) { if (pRgn && !RegionNil(pRgn)) { xEvent *pEvent; xEvent *pe; BoxPtr pBox; int i; int numRects; numRects = RegionNumRects(pRgn); pBox = RegionRects(pRgn); if (!(pEvent = calloc(numRects, sizeof(xEvent)))) return; pe = pEvent; for (i = 1; i <= numRects; i++, pe++, pBox++) { pe->u.u.type = GraphicsExpose; pe->u.graphicsExposure.drawable = drawable; pe->u.graphicsExposure.x = pBox->x1; pe->u.graphicsExposure.y = pBox->y1; pe->u.graphicsExposure.width = pBox->x2 - pBox->x1; pe->u.graphicsExposure.height = pBox->y2 - pBox->y1; pe->u.graphicsExposure.count = numRects - i; pe->u.graphicsExposure.majorEvent = major; pe->u.graphicsExposure.minorEvent = minor; } /* GraphicsExpose is a "critical event", which TryClientEvents * handles specially. */ TryClientEvents(client, NULL, pEvent, numRects, (Mask) 0, NoEventMask, NullGrab); free(pEvent); } else { xEvent event = { .u.noExposure.drawable = drawable, .u.noExposure.majorEvent = major, .u.noExposure.minorEvent = minor }; event.u.u.type = NoExpose; WriteEventsToClient(client, 1, &event); } } void miSendExposures(WindowPtr pWin, RegionPtr pRgn, int dx, int dy) { BoxPtr pBox; int numRects; xEvent *pEvent, *pe; int i; pBox = RegionRects(pRgn); numRects = RegionNumRects(pRgn); if (!(pEvent = calloc(1, numRects * sizeof(xEvent)))) return; for (i = numRects, pe = pEvent; --i >= 0; pe++, pBox++) { pe->u.u.type = Expose; pe->u.expose.window = pWin->drawable.id; pe->u.expose.x = pBox->x1 - dx; pe->u.expose.y = pBox->y1 - dy; pe->u.expose.width = pBox->x2 - pBox->x1; pe->u.expose.height = pBox->y2 - pBox->y1; pe->u.expose.count = i; } #ifdef PANORAMIX if (!noPanoramiXExtension) { int scrnum = pWin->drawable.pScreen->myNum; int x = 0, y = 0; XID realWin = 0; if (!pWin->parent) { x = screenInfo.screens[scrnum]->x; y = screenInfo.screens[scrnum]->y; pWin = screenInfo.screens[0]->root; realWin = pWin->drawable.id; } else if (scrnum) { PanoramiXRes *win; win = PanoramiXFindIDByScrnum(XRT_WINDOW, pWin->drawable.id, scrnum); if (!win) { free(pEvent); return; } realWin = win->info[0].id; dixLookupWindow(&pWin, realWin, serverClient, DixSendAccess); } if (x || y || scrnum) for (i = 0; i < numRects; i++) { pEvent[i].u.expose.window = realWin; pEvent[i].u.expose.x += x; pEvent[i].u.expose.y += y; } } #endif DeliverEvents(pWin, pEvent, numRects, NullWindow); free(pEvent); }