Exemplo n.º 1
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;
  }
Exemplo n.º 2
0
  /**
   * 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;
  }