Example #1
0
  Point adjustResizeCursor() {
    if (bounds == null) return null;
    int newX, newY;

    if ((cursorOrientation & SWT.LEFT) != 0) {
      newX = bounds.x;
    } else if ((cursorOrientation & SWT.RIGHT) != 0) {
      newX = bounds.x + bounds.width;
    } else {
      newX = bounds.x + bounds.width / 2;
    }

    if ((cursorOrientation & SWT.UP) != 0) {
      newY = bounds.y;
    } else if ((cursorOrientation & SWT.DOWN) != 0) {
      newY = bounds.y + bounds.height;
    } else {
      newY = bounds.y + bounds.height / 2;
    }

    final int unused[] = new int[1];
    int actualX[] = new int[1];
    int actualY[] = new int[1];
    int xDisplay = display.xDisplay;
    OS.XWarpPointer(xDisplay, 0, window, 0, 0, 0, 0, newX, newY);
    /*
     * The call to XWarpPointer does not always place the pointer on the
     * exact location that is specified, so do a query (below) to get the
     * actual location of the pointer after it has been moved.
     */
    OS.XQueryPointer(xDisplay, window, unused, unused, actualX, actualY, unused, unused, unused);
    return new Point(actualX[0], actualY[0]);
  }
Example #2
0
  Point adjustMoveCursor() {
    if (bounds == null) return null;
    final int unused[] = new int[1];
    int actualX[] = new int[1];
    int actualY[] = new int[1];

    int newX = bounds.x + bounds.width / 2;
    int newY = bounds.y;

    int xDisplay = display.xDisplay;
    OS.XWarpPointer(xDisplay, OS.None, window, 0, 0, 0, 0, newX, newY);
    /*
     * The call to XWarpPointer does not always place the pointer on the
     * exact location that is specified, so do a query (below) to get the
     * actual location of the pointer after it has been moved.
     */
    OS.XQueryPointer(xDisplay, window, unused, unused, actualX, actualY, unused, unused, unused);
    return new Point(actualX[0], actualY[0]);
  }
Example #3
0
  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;
  }