static void EatGrabEvents( TkDisplay *dispPtr, /* Display from which to consume events. */ unsigned int serial) /* Only discard events that have a serial * number at least this great. */ { Tk_RestrictProc *oldProc; GrabInfo info; ClientData oldArg, dummy; info.display = dispPtr->display; info.serial = serial; TkpSync(info.display); oldProc = Tk_RestrictEvents(GrabRestrictProc, &info, &oldArg); while (Tcl_ServiceEvent(TCL_WINDOW_EVENTS)) { /* EMPTY */ } Tk_RestrictEvents(oldProc, oldArg, &dummy); }
int TkScrollWindow( Tk_Window tkwin, /* The window to be scrolled. */ GC gc, /* GC for window to be scrolled. */ int x, int y, int width, int height, /* Position rectangle to be scrolled. */ int dx, int dy, /* Distance rectangle should be moved. */ TkRegion damageRgn) /* Region to accumulate damage in. */ { Tk_RestrictProc *oldProc; ClientData oldArg, dummy; ScrollInfo info; XCopyArea(Tk_Display(tkwin), Tk_WindowId(tkwin), Tk_WindowId(tkwin), gc, x, y, (unsigned) width, (unsigned) height, x+dx, y+dy); info.done = 0; info.window = Tk_WindowId(tkwin); info.display = Tk_Display(tkwin); info.region = damageRgn; info.dx = dx; info.dy = dy; /* * Sync the event stream so all of the expose events will be on the Tk * event queue before we start filtering. This avoids busy waiting while * we filter events. */ TkpSync(info.display); oldProc = Tk_RestrictEvents(ScrollRestrictProc, (ClientData) &info, &oldArg); while (!info.done) { Tcl_ServiceEvent(TCL_WINDOW_EVENTS); } Tk_RestrictEvents(oldProc, oldArg, &dummy); if (XEmptyRegion((Region) damageRgn)) { return 0; } else { return 1; } }