void drawRectangles(Rectangle[] rects, boolean stippled) { int xDisplay = display.xDisplay; int color = OS.XWhitePixel(xDisplay, 0); int xWindow = OS.XDefaultRootWindow(xDisplay); if (parent != null) { xWindow = OS.XtWindow(parent.handle); if (xWindow == 0) return; int foreground = parent.getForegroundPixel(); Control control = parent.findBackgroundControl(); if (control == null) control = parent; int background = control.getBackgroundPixel(); color = foreground ^ background; } int gc = OS.XCreateGC(xDisplay, xWindow, 0, null); OS.XSetForeground(xDisplay, gc, color); OS.XSetSubwindowMode(xDisplay, gc, OS.IncludeInferiors); OS.XSetFunction(xDisplay, gc, OS.GXxor); int stipplePixmap = 0; if (stippled) { byte[] bits = {-86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0, -86, 0, 85, 0}; stipplePixmap = OS.XCreateBitmapFromData(xDisplay, xWindow, bits, 8, 8); OS.XSetStipple(xDisplay, gc, stipplePixmap); OS.XSetFillStyle(xDisplay, gc, OS.FillStippled); OS.XSetLineAttributes(xDisplay, gc, 3, OS.LineSolid, OS.CapButt, OS.JoinMiter); } for (int i = 0; i < rects.length; i++) { Rectangle rect = rects[i]; OS.XDrawRectangle(xDisplay, xWindow, gc, rect.x, rect.y, rect.width, rect.height); } if (stippled) { OS.XFreePixmap(xDisplay, stipplePixmap); } OS.XFreeGC(xDisplay, gc); }
boolean hasCursor() { int[] unused = new int[1], buffer = new int[1]; int xDisplay = OS.XtDisplay(handle); int xWindow, xParent = OS.XDefaultRootWindow(xDisplay); do { if (OS.XQueryPointer( xDisplay, xParent, unused, buffer, unused, unused, unused, unused, unused) == 0) return false; if ((xWindow = buffer[0]) != 0) xParent = xWindow; } while (xWindow != 0); return handle == OS.XtWindowToWidget(xDisplay, xParent); }
/** * Displays the Tracker rectangles for manipulation by the user. Returns when the user has either * finished manipulating the rectangles or has cancelled the Tracker. * * @return <code>true</code> if the user did not cancel the Tracker, <code>false</code> otherwise * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public boolean open() { checkWidget(); int xDisplay = display.xDisplay; window = OS.XDefaultRootWindow(xDisplay); if (parent != null) { window = OS.XtWindow(parent.handle); if (window == 0) return false; } cancelled = false; tracking = true; update(); drawRectangles(rectangles, stippled); int[] oldX = new int[1], oldY = new int[1]; int[] unused = new int[1], mask = new int[1]; OS.XQueryPointer(xDisplay, window, unused, unused, oldX, oldY, unused, unused, mask); /* * If exactly one of UP/DOWN is specified as a style then set the cursor * orientation accordingly (the same is done for LEFT/RIGHT styles below). */ int vStyle = style & (SWT.UP | SWT.DOWN); if (vStyle == SWT.UP || vStyle == SWT.DOWN) { cursorOrientation |= vStyle; } int hStyle = style & (SWT.LEFT | SWT.RIGHT); if (hStyle == SWT.LEFT || hStyle == SWT.RIGHT) { cursorOrientation |= hStyle; } int mouseMasks = OS.Button1Mask | OS.Button2Mask | OS.Button3Mask; boolean mouseDown = (mask[0] & mouseMasks) != 0; if (!mouseDown) { Point cursorPos = null; if ((style & SWT.RESIZE) != 0) { cursorPos = adjustResizeCursor(); } else { cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX[0] = cursorPos.x; oldY[0] = cursorPos.y; } } this.oldX = oldX[0]; this.oldY = oldY[0]; int ptrGrabResult = OS.XGrabPointer( xDisplay, window, 0, OS.ButtonPressMask | OS.ButtonReleaseMask | OS.PointerMotionMask, OS.GrabModeAsync, OS.GrabModeAsync, OS.None, OS.None, OS.CurrentTime); int kbdGrabResult = OS.XGrabKeyboard(xDisplay, window, 0, OS.GrabModeAsync, OS.GrabModeAsync, OS.CurrentTime); /* Tracker behaves like a Dialog with its own OS event loop. */ XAnyEvent anyEvent = new XAnyEvent(); int xEvent = OS.XtMalloc(XEvent.sizeof); int dispatch = OS.XtMalloc(4); int xtContext = OS.XtDisplayToApplicationContext(xDisplay); while (tracking) { if (parent != null && parent.isDisposed()) break; OS.XtAppNextEvent(xtContext, xEvent); OS.memmove(anyEvent, xEvent, XAnyEvent.sizeof); int widget = OS.XtWindowToWidget(anyEvent.display, anyEvent.window); switch (anyEvent.type) { case OS.MotionNotify: XPointerMotion(widget, 0, xEvent, dispatch); break; case OS.ButtonRelease: XButtonRelease(widget, 0, xEvent, dispatch); break; case OS.KeyPress: XKeyPress(widget, 0, xEvent, dispatch); break; case OS.KeyRelease: XKeyRelease(widget, 0, xEvent, dispatch); break; case OS.ButtonPress: case OS.EnterNotify: case OS.LeaveNotify: /* Do not dispatch these */ break; case OS.Expose: update(); drawRectangles(rectangles, stippled); OS.XtDispatchEvent(xEvent); drawRectangles(rectangles, stippled); break; default: OS.XtDispatchEvent(xEvent); } } if (xEvent != 0) OS.XtFree(xEvent); if (dispatch != 0) OS.XtFree(dispatch); if (!isDisposed()) { update(); drawRectangles(rectangles, stippled); } if (ptrGrabResult == OS.GrabSuccess) OS.XUngrabPointer(xDisplay, OS.CurrentTime); if (kbdGrabResult == OS.GrabSuccess) OS.XUngrabKeyboard(xDisplay, OS.CurrentTime); window = 0; return !cancelled; }