int XButtonRelease(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XButtonRelease(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XButtonEvent xEvent = new XButtonEvent(); OS.memmove(xEvent, call_data, XButtonEvent.sizeof); if (xEvent.button != 1) return result; if (!dragging) return result; dragging = false; int[] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(handle, argList, argList.length / 2); int border = argList[5]; int width = argList[1] + (border * 2), height = argList[3] + (border * 2); Event event = new Event(); event.time = xEvent.time; event.x = lastX; event.y = lastY; event.width = width; event.height = height; drawBand(lastX, lastY, width, height); sendEvent(SWT.Selection, event); if (isDisposed()) return result; if (event.doit) { if ((style & SWT.SMOOTH) != 0) { setBounds(event.x, event.y, width, height); // widget could be disposed at this point } } return result; }
void drawWidget(GC gc, RECT rect) { drawBackground(gc.handle, rect); int selStart = selection.x; int selEnd = selection.y; if (selStart > selEnd) { selStart = selection.y; selEnd = selection.x; } // temporary code to disable text selection selStart = selEnd = -1; if (!OS.IsWindowEnabled(handle)) gc.setForeground(disabledColor); layout.draw(gc, 0, 0, selStart, selEnd, null, null); if (hasFocus() && focusIndex != -1) { Rectangle[] rects = getRectangles(focusIndex); for (int i = 0; i < rects.length; i++) { Rectangle rectangle = rects[i]; gc.drawFocus(rectangle.x, rectangle.y, rectangle.width, rectangle.height); } } if (hooks(SWT.Paint) || filters(SWT.Paint)) { Event event = new Event(); event.gc = gc; event.x = rect.left; event.y = rect.top; event.width = rect.right - rect.left; event.height = rect.bottom - rect.top; sendEvent(SWT.Paint, event); event.gc = null; } }
long /*int*/ menuItemSelected(long /*int*/ widget, ToolItem item) { Event event = new Event(); switch (item.style) { case SWT.DROP_DOWN: /* * Feature in GTK. The DROP_DOWN item does not * contain arrow button in the overflow menu. So, it * is impossible to select the menu of that item. * The fix is to consider the item selection * as Arrow click, in order to popup the drop-down. */ event.detail = SWT.ARROW; GtkAllocation allocation = new GtkAllocation(); OS.gtk_widget_get_allocation(widget, allocation); event.x = allocation.x; if ((style & SWT.MIRRORED) != 0) event.x = getClientWidth() - allocation.width - event.x; event.y = allocation.y + allocation.height; break; case SWT.RADIO: if ((style & SWT.NO_RADIO_GROUP) == 0) item.selectRadio(); break; case SWT.CHECK: boolean currentSelection = item.getSelection(); item.setSelection(!currentSelection); } item.sendSelectionEvent(SWT.Selection, event, false); return 0; }
long /*int*/ gtk_clicked(long /*int*/ widget) { Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { long /*int*/ eventPtr = OS.gtk_get_current_event(); if (eventPtr != 0) { GdkEvent gdkEvent = new GdkEvent(); OS.memmove(gdkEvent, eventPtr, GdkEvent.sizeof); long /*int*/ topHandle = topHandle(); switch (gdkEvent.type) { case OS.GDK_KEY_RELEASE: // Fall Through.. case OS.GDK_BUTTON_PRESS: case OS.GDK_2BUTTON_PRESS: case OS.GDK_BUTTON_RELEASE: { boolean isArrow = false; if (OS.GTK_VERSION < OS.VERSION(2, 6, 0)) { double[] x_win = new double[1]; double[] y_win = new double[1]; OS.gdk_event_get_coords(eventPtr, x_win, y_win); int x = OS.GTK_WIDGET_X(arrowHandle) - OS.GTK_WIDGET_X(handle); int width = OS.GTK_WIDGET_WIDTH(arrowHandle); if ((((parent.style & SWT.RIGHT_TO_LEFT) == 0) && x <= (int) x_win[0]) || (((parent.style & SWT.RIGHT_TO_LEFT) != 0) && (int) x_win[0] <= x + width)) { isArrow = true; } } else if (widget == arrowHandle) { isArrow = true; topHandle = widget; /* * Feature in GTK. ArrowButton stays in toggled state if there is no popup menu. * It is required to set back the state of arrow to normal state after it is clicked. */ OS.g_signal_handlers_block_matched( widget, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED); OS.gtk_toggle_button_set_active(widget, false); OS.g_signal_handlers_unblock_matched( widget, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED); } if (isArrow) { event.detail = SWT.ARROW; event.x = OS.GTK_WIDGET_X(topHandle); if ((parent.style & SWT.MIRRORED) != 0) event.x = parent.getClientWidth() - OS.GTK_WIDGET_WIDTH(topHandle) - event.x; event.y = OS.GTK_WIDGET_Y(topHandle) + OS.GTK_WIDGET_HEIGHT(topHandle); } break; } } OS.gdk_event_free(eventPtr); } } if ((style & SWT.RADIO) != 0) { if ((parent.getStyle() & SWT.NO_RADIO_GROUP) == 0) { selectRadio(); } } sendSelectionEvent(SWT.Selection, event, false); return 0; }
/* * This overloaded method is for TrayIcon. * Its popup has special parent. */ void show(Component origin, Point p) { WComponentPeer peer = (WComponentPeer) WToolkit.targetToPeer(origin); Event e = new Event(origin, 0, Event.MOUSE_DOWN, p.x, p.y, 0, 0); if (peer == null) { Component nativeOrigin = WToolkit.getNativeContainer(origin); e.target = nativeOrigin; } e.x = p.x; e.y = p.y; _show(e); }
int XPointerMotion(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XPointerMotion(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XMotionEvent xEvent = new XMotionEvent(); OS.memmove(xEvent, call_data, XMotionEvent.sizeof); if (!dragging || (xEvent.state & OS.Button1Mask) == 0) return result; short[] x_root = new short[1], y_root = new short[1]; OS.XtTranslateCoords(handle, (short) 0, (short) 0, x_root, y_root); int eventX = xEvent.x_root - x_root[0], eventY = xEvent.y_root - y_root[0]; int[] argList1 = { OS.XmNx, 0, OS.XmNy, 0, OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0 }; OS.XtGetValues(handle, argList1, argList1.length / 2); int border = argList1[9], x = ((short) argList1[1]) - border, y = ((short) argList1[3]) - border; int width = argList1[5] + (border * 2), height = argList1[7] + (border * 2); int[] argList2 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(parent.handle, argList2, argList2.length / 2); int parentBorder = argList2[5]; int parentWidth = argList2[1] + (parentBorder * 2); int parentHeight = argList2[3] + (parentBorder * 2); int newX = lastX, newY = lastY; if ((style & SWT.VERTICAL) != 0) { newX = Math.min(Math.max(0, eventX + x - startX - parentBorder), parentWidth - width); } else { newY = Math.min(Math.max(0, eventY + y - startY - parentBorder), parentHeight - height); } if (newX == lastX && newY == lastY) return result; drawBand(lastX, lastY, width, height); Event event = new Event(); event.time = xEvent.time; event.x = newX; event.y = newY; event.width = width; event.height = height; if ((style & SWT.SMOOTH) == 0) { event.detail = SWT.DRAG; } sendEvent(SWT.Selection, event); if (isDisposed()) return result; if (event.doit) { lastX = event.x; lastY = event.y; } parent.update(true); drawBand(lastX, lastY, width, height); if ((style & SWT.SMOOTH) != 0) { setBounds(lastX, lastY, width, height); // widget could be disposed at this point } return result; }
private void notifyPaintListeners() { if (paintListeners != null) { Event e = new Event(); e.widget = ctrl; e.gc = new GC(ctrl); e.height = ctrl.getSize().y; e.width = ctrl.getSize().x; e.x = ctrl.getLocation().x; e.y = ctrl.getLocation().y; e.data = ctrl.getData(); for (int i = 0; i < paintListeners.size(); i++) { ((PaintListener) paintListeners.get(i)).paintControl(new PaintEvent(e)); } } }
void click(boolean dropDown, int state) { if ((style & SWT.RADIO) != 0) { selectRadio(); } else { if ((style & SWT.CHECK) != 0) setSelection(!set); } Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { if (dropDown) { event.detail = SWT.ARROW; int[] argList = {OS.XmNx, 0, OS.XmNy, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList, argList.length / 2); event.x = (short) argList[1]; event.y = (short) argList[3] + (short) argList[5]; } } if (state != 0) setInputState(event, state); postEvent(SWT.Selection, event); }
public void show(Event e) { Component origin = (Component) e.target; WComponentPeer peer = (WComponentPeer) WToolkit.targetToPeer(origin); if (peer == null) { // A failure to map the peer should only happen for a // lightweight component, then find the actual native parent from // that component. The event coorinates are going to have to be // remapped as well. Component nativeOrigin = WToolkit.getNativeContainer(origin); e.target = nativeOrigin; // remove the event coordinates for (Component c = origin; c != nativeOrigin; c = c.getParent()) { Point p = c.getLocation(); e.x += p.x; e.y += p.y; } } _show(e); }
void HandleClick(int sender, int e) { if (!checkEvent(e)) return; if (ignoreSelection) return; Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { int mousePos = OS.Mouse_GetPosition(handle); int zero = OS.gcnew_Point(0, OS.FrameworkElement_ActualHeight(topHandle())); int arrowPos = OS.UIElement_TranslatePoint(arrowHandle, zero, handle); if (OS.Point_X(mousePos) > OS.Point_X(arrowPos)) { event.detail = SWT.ARROW; int location = OS.UIElement_TranslatePoint(handle, zero, parent.handle); event.x = (int) OS.Point_X(location); event.y = (int) OS.Point_Y(location); OS.GCHandle_Free(location); } OS.GCHandle_Free(arrowPos); OS.GCHandle_Free(zero); OS.GCHandle_Free(mousePos); } postEvent(SWT.Selection, event); }
int XButtonPress(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XButtonPress(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XButtonEvent xEvent = new XButtonEvent(); OS.memmove(xEvent, call_data, XButtonEvent.sizeof); if (xEvent.button != 1) return result; short[] x_root = new short[1], y_root = new short[1]; OS.XtTranslateCoords(handle, (short) 0, (short) 0, x_root, y_root); startX = xEvent.x_root - x_root[0]; startY = xEvent.y_root - y_root[0]; int[] argList = {OS.XmNx, 0, OS.XmNy, 0, OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(handle, argList, argList.length / 2); int border = argList[9], width = argList[5] + (border * 2), height = argList[7] + (border * 2); lastX = ((short) argList[1]) - border; lastY = ((short) argList[3]) - border; Event event = new Event(); event.time = xEvent.time; event.x = lastX; event.y = lastY; event.width = width; event.height = height; if ((style & SWT.SMOOTH) == 0) { event.detail = SWT.DRAG; } sendEvent(SWT.Selection, event); if (isDisposed()) return result; if (event.doit) { dragging = true; lastX = event.x; lastY = event.y; parent.update(true); drawBand(event.x, event.y, width, height); if ((style & SWT.SMOOTH) != 0) { setBounds(event.x, event.y, width, height); // widget could be disposed at this point } } return result; }
void key(NSEvent nsEvent) { int nsType = (int) /*64*/ nsEvent.type(); long /*int*/ modifierFlags = nsEvent.modifierFlags(); int nsKeyCode = nsEvent.keyCode(); int keyCode = Display.translateKey(nsKeyCode); switch (nsType) { case OS.NSKeyDown: case OS.NSKeyUp: { Event event = new Event(); event.keyCode = keyCode; int type = nsType == OS.NSKeyDown ? SWT.KeyDown : SWT.KeyUp; if (!setKeyState(event, type, nsEvent)) break; if (!sendKeyEvent(type, event)) return; break; } case OS.NSFlagsChanged: { int mask = 0; switch (keyCode) { case SWT.ALT: mask = OS.NSAlternateKeyMask; break; case SWT.CONTROL: mask = OS.NSControlKeyMask; break; case SWT.COMMAND: mask = OS.NSCommandKeyMask; break; case SWT.SHIFT: mask = OS.NSShiftKeyMask; break; case SWT.CAPS_LOCK: Event event = new Event(); event.keyCode = keyCode; setInputState(event, nsEvent, SWT.KeyDown); sendKeyEvent(SWT.KeyDown, event); setInputState(event, nsEvent, SWT.KeyUp); sendKeyEvent(SWT.KeyUp, event); break; } if (mask != 0) { int type = (mask & modifierFlags) != 0 ? SWT.KeyDown : SWT.KeyUp; Event event = new Event(); event.keyCode = keyCode; setLocationMask(event, nsEvent); setInputState(event, nsEvent, type); if (!sendKeyEvent(type, event)) return; } break; } } int stepSize = (modifierFlags & OS.NSControlKeyMask) != 0 ? STEPSIZE_SMALL : STEPSIZE_LARGE; int xChange = 0, yChange = 0; switch (nsKeyCode) { case 53: /* Esc */ cancelled = true; tracking = false; break; case 76: /* KP Enter */ case 36: /* Return */ tracking = false; break; case 123: /* Left arrow */ xChange = -stepSize; break; case 124: /* Right arrow */ xChange = stepSize; break; case 126: /* Up arrow */ yChange = -stepSize; break; case 125: /* Down arrow */ yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); int newX = oldX + xChange; int newY = oldY + yChange; event.x = newX; event.y = newY; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustResizeCursor(true); } else { moveRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } }
void mouse(NSEvent nsEvent) { NSPoint location; if (nsEvent == null || nsEvent.type() == OS.NSMouseMoved) { location = NSEvent.mouseLocation(); } else { location = nsEvent.locationInWindow(); location = nsEvent.window().convertBaseToScreen(location); } location.y = display.getPrimaryFrame().height - location.y; int newX = (int) location.x, newY = (int) location.y; if (newX != oldX || newY != oldY) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); event.x = newX; event.y = newY; if ((style & SWT.RESIZE) != 0) { boolean orientationInit = resizeRectangles(newX - oldX, newY - oldY); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely), that application * code could have disposed the widget in the move * event. If this happens, return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } Point cursorPos = adjustResizeCursor(orientationInit); if (cursorPos != null) { newX = cursorPos.x; newY = cursorPos.y; } } else { moveRectangles(newX - oldX, newY - oldY); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely), that application * code could have disposed the widget in the move * event. If this happens, return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } } oldX = newX; oldY = newY; } switch ((int) /*64*/ nsEvent.type()) { case OS.NSLeftMouseUp: case OS.NSRightMouseUp: case OS.NSOtherMouseUp: tracking = false; } }
int xMouse(int type, int w, int client_data, int call_data, int continue_to_dispatch) { int xDisplay = display.xDisplay; int[] newX = new int[1], newY = new int[1], unused = new int[1]; OS.XQueryPointer(xDisplay, window, unused, unused, newX, newY, unused, unused, unused); if (oldX != newX[0] || oldY != newY[0]) { Rectangle[] oldRectangles = rectangles; boolean oldStippled = stippled; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); event.x = newX[0]; event.y = newY[0]; if ((style & SWT.RESIZE) != 0) { resizeRectangles(newX[0] - oldX, newY[0] - oldY); sendEvent(SWT.Resize, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the resize event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } Point cursorPos = adjustResizeCursor(); if (cursorPos != null) { newX[0] = cursorPos.x; newY[0] = cursorPos.y; } } else { moveRectangles(newX[0] - oldX, newY[0] - oldY); sendEvent(SWT.Move, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the move event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } } oldX = newX[0]; oldY = newY[0]; } tracking = type != OS.ButtonRelease; return 0; }
void key(NSEvent nsEvent) { // TODO send event // if (!sendKeyEvent (SWT.KeyDown, theEvent)) return OS.noErr; int modifierFlags = nsEvent.modifierFlags(); int stepSize = (modifierFlags & OS.NSControlKeyMask) != 0 ? STEPSIZE_SMALL : STEPSIZE_LARGE; int xChange = 0, yChange = 0; switch (nsEvent.keyCode()) { case 53: /* Esc */ cancelled = true; tracking = false; break; case 76: /* KP Enter */ case 36: /* Return */ tracking = false; break; case 123: /* Left arrow */ xChange = -stepSize; break; case 124: /* Right arrow */ xChange = stepSize; break; case 126: /* Up arrow */ yChange = -stepSize; break; case 125: /* Down arrow */ yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); int newX = oldX + xChange; int newY = oldY + yChange; event.x = newX; event.y = newY; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Resize, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustResizeCursor(true); } else { moveRectangles(xChange, yChange); inEvent = true; sendEvent(SWT.Move, event); inEvent = false; /* * It is possible (but unlikely) that application * code could have disposed the widget in the move * event. If this happens return false to indicate * that the tracking has failed. */ if (isDisposed()) { cancelled = true; return; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(window, rectsToErase, true); drawRectangles(window, rectangles, false); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } }
int XKeyPress(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XKeyPress(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XKeyEvent xEvent = new XKeyEvent(); OS.memmove(xEvent, call_data, XKeyEvent.sizeof); byte[] buffer = new byte[1]; int[] keysym = new int[1]; OS.XLookupString(xEvent, buffer, buffer.length, keysym, null); switch (keysym[0]) { case OS.XK_Left: case OS.XK_Right: case OS.XK_Up: case OS.XK_Down: int xChange = 0, yChange = 0; int stepSize = PAGE_INCREMENT; if ((xEvent.state & OS.ControlMask) != 0) stepSize = INCREMENT; if ((style & SWT.VERTICAL) != 0) { if (keysym[0] == OS.XK_Up || keysym[0] == OS.XK_Down) break; xChange = keysym[0] == OS.XK_Left ? -stepSize : stepSize; } else { if (keysym[0] == OS.XK_Left || keysym[0] == OS.XK_Right) break; yChange = keysym[0] == OS.XK_Up ? -stepSize : stepSize; } int[] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(handle, argList1, argList1.length / 2); int border = argList1[5]; int width = argList1[1] + (border * 2), height = argList1[3] + (border * 2); int[] argList2 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; OS.XtGetValues(parent.handle, argList2, argList2.length / 2); int parentBorder = argList2[5]; int parentWidth = argList2[1] + (parentBorder * 2); int parentHeight = argList2[3] + (parentBorder * 2); int newX = lastX, newY = lastY; if ((style & SWT.VERTICAL) != 0) { newX = Math.min(Math.max(0, lastX + xChange - parentBorder - startX), parentWidth - width); } else { newY = Math.min(Math.max(0, lastY + yChange - parentBorder - startY), parentHeight - height); } if (newX == lastX && newY == lastY) return result; /* Ensure that the pointer image does not change */ int xDisplay = display.xDisplay; int xWindow = OS.XtWindow(parent.handle); int ptrGrabResult = OS.XGrabPointer( xDisplay, xWindow, 1, OS.None, OS.GrabModeAsync, OS.GrabModeAsync, OS.None, cursor, OS.CurrentTime); Event event = new Event(); event.time = xEvent.time; event.x = newX; event.y = newY; event.width = width; event.height = height; sendEvent(SWT.Selection, event); if (ptrGrabResult == OS.GrabSuccess) OS.XUngrabPointer(xDisplay, OS.CurrentTime); if (isDisposed()) break; if (event.doit) { lastX = event.x; lastY = event.y; if ((style & SWT.SMOOTH) != 0) { setBounds(event.x, event.y, width, height); if (isDisposed()) break; } int cursorX = event.x, cursorY = event.y; if ((style & SWT.VERTICAL) != 0) { cursorY += height / 2; } else { cursorX += width / 2; } OS.XWarpPointer(xDisplay, OS.None, xWindow, 0, 0, 0, 0, cursorX, cursorY); } break; } return result; }
int XKeyPress(int w, int client_data, int call_data, int continue_to_dispatch) { int result = super.XKeyPress(w, client_data, call_data, continue_to_dispatch); if (result != 0) return result; XKeyEvent keyEvent = new XKeyEvent(); OS.memmove(keyEvent, call_data, XKeyEvent.sizeof); if (keyEvent.keycode != 0) { int[] keysym = new int[1]; OS.XLookupString(keyEvent, null, 0, keysym, null); keysym[0] &= 0xFFFF; int xChange = 0, yChange = 0; int stepSize = ((keyEvent.state & OS.ControlMask) != 0) ? STEPSIZE_SMALL : STEPSIZE_LARGE; switch (keysym[0]) { case OS.XK_KP_Enter: case OS.XK_Return: tracking = false; /* Eat the subsequent KeyRelease event */ OS.XtAppNextEvent(OS.XtDisplayToApplicationContext(keyEvent.display), call_data); break; case OS.XK_Escape: tracking = false; cancelled = true; /* Eat the subsequent KeyRelease event */ OS.XtAppNextEvent(OS.XtDisplayToApplicationContext(keyEvent.display), call_data); break; case OS.XK_Left: xChange = -stepSize; break; case OS.XK_Right: xChange = stepSize; break; case OS.XK_Up: yChange = -stepSize; break; case OS.XK_Down: yChange = stepSize; break; } if (xChange != 0 || yChange != 0) { Rectangle[] oldRectangles = rectangles; boolean oldStippled = stippled; Rectangle[] rectsToErase = new Rectangle[rectangles.length]; for (int i = 0; i < rectangles.length; i++) { Rectangle current = rectangles[i]; rectsToErase[i] = new Rectangle(current.x, current.y, current.width, current.height); } Event event = new Event(); event.x = oldX + xChange; event.y = oldY + yChange; Point cursorPos; if ((style & SWT.RESIZE) != 0) { resizeRectangles(xChange, yChange); sendEvent(SWT.Resize, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the resize event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the resize event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } cursorPos = adjustResizeCursor(); } else { moveRectangles(xChange, yChange); sendEvent(SWT.Move, event); /* * It is possible (but unlikely) that application code * could have disposed the widget in the move event. * If this happens then return false to indicate that * the move failed. */ if (isDisposed()) { cancelled = true; return 1; } boolean draw = false; /* * It is possible that application code could have * changed the rectangles in the move event. If this * happens then only redraw the tracker if the rectangle * values have changed. */ if (rectangles != oldRectangles) { int length = rectangles.length; if (length != rectsToErase.length) { draw = true; } else { for (int i = 0; i < length; i++) { if (!rectangles[i].equals(rectsToErase[i])) { draw = true; break; } } } } else { draw = true; } if (draw) { drawRectangles(rectsToErase, oldStippled); update(); drawRectangles(rectangles, stippled); } cursorPos = adjustMoveCursor(); } if (cursorPos != null) { oldX = cursorPos.x; oldY = cursorPos.y; } } } return result; }