531 protected void flush(){ 532 XToolkit.awtLock(); 533 try { 534 XlibWrapper.XFlush(XToolkit.getDisplay()); 535 } finally { 536 XToolkit.awtUnlock(); 537 } 538 } 539 540 public void popup(int x, int y, int width, int height) { 541 // TBD: grab the pointer 542 xSetBounds(x, y, width, height); 543 } 544 545 public void handleExposeEvent(XEvent xev) { 546 super.handleExposeEvent(xev); 547 XExposeEvent xe = xev.get_xexpose(); 548 if (isEventDisabled(xev)) { 549 return; 550 } 551 int x = xe.get_x(); 552 int y = xe.get_y(); 553 int w = xe.get_width(); 554 int h = xe.get_height(); 555 556 Component target = getEventSource(); 557 ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor(); 558 559 if (!compAccessor.getIgnoreRepaint(target) 560 && compAccessor.getWidth(target) != 0 561 && compAccessor.getHeight(target) != 0) 562 { 563 postPaintEvent(target, x, y, w, h); 564 } 565 } 566 567 public void postPaintEvent(Component target, int x, int y, int w, int h) { 568 PaintEvent event = PaintEventDispatcher.getPaintEventDispatcher(). 569 createPaintEvent(target, x, y, w, h); 570 if (event != null) { 571 postEventToEventQueue(event); 572 } 573 } 574 659 if (eventLog.isLoggable(PlatformLogger.Level.FINE)) { 660 eventLog.fine(xbe.toString()); 661 } 662 long when; 663 int modifiers; 664 boolean popupTrigger = false; 665 int button=0; 666 int lbutton = xbe.get_button(); 667 /* 668 * Ignore the buttons above 20 due to the bit limit for 669 * InputEvent.BUTTON_DOWN_MASK. 670 * One more bit is reserved for FIRST_HIGH_BIT. 671 */ 672 if (lbutton > SunToolkit.MAX_BUTTONS_SUPPORTED) { 673 return; 674 } 675 int type = xev.get_type(); 676 when = xbe.get_time(); 677 long jWhen = XToolkit.nowMillisUTC_offset(when); 678 679 int x = xbe.get_x(); 680 int y = xbe.get_y(); 681 if (xev.get_xany().get_window() != window) { 682 Point localXY = toLocal(xbe.get_x_root(), xbe.get_y_root()); 683 x = localXY.x; 684 y = localXY.y; 685 } 686 687 if (type == XConstants.ButtonPress) { 688 //Allow this mouse button to generate CLICK event on next ButtonRelease 689 mouseButtonClickAllowed |= XlibUtil.getButtonMask(lbutton); 690 XWindow lastWindow = (lastWindowRef != null) ? (lastWindowRef.get()):(null); 691 /* 692 multiclick checking 693 */ 694 if (eventLog.isLoggable(PlatformLogger.Level.FINEST)) { 695 eventLog.finest("lastWindow = " + lastWindow + ", lastButton " 696 + lastButton + ", lastTime " + lastTime + ", multiClickTime " 697 + XToolkit.getMultiClickTime()); 698 } 699 if (lastWindow == this && lastButton == lbutton && (when - lastTime) < XToolkit.getMultiClickTime()) { 700 clickCount++; 701 } else { 702 clickCount = 1; 713 */ 714 popupTrigger = (lbutton == 3); 715 } 716 717 button = XConstants.buttons[lbutton - 1]; 718 719 // mapping extra buttons to numbers starting from 4. 720 if ((button > XConstants.buttons[4]) && (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled())){ 721 return; 722 } 723 724 if (button > XConstants.buttons[4]){ 725 button -= 2; 726 } 727 728 if (!isWheel(lbutton)) { 729 modifiers = getModifiers(xbe.get_state(), button, 0); 730 MouseEvent me = new MouseEvent(getEventSource(), 731 type == XConstants.ButtonPress ? MouseEvent.MOUSE_PRESSED : MouseEvent.MOUSE_RELEASED, 732 jWhen,modifiers, x, y, 733 xbe.get_x_root(), 734 xbe.get_y_root(), 735 clickCount,popupTrigger,button); 736 737 postEventToEventQueue(me); 738 739 if ((type == XConstants.ButtonRelease) && 740 ((mouseButtonClickAllowed & XlibUtil.getButtonMask(lbutton)) != 0) ) // No up-button in the drag-state 741 { 742 postEventToEventQueue(me = new MouseEvent(getEventSource(), 743 MouseEvent.MOUSE_CLICKED, 744 jWhen, 745 modifiers, 746 x, y, 747 xbe.get_x_root(), 748 xbe.get_y_root(), 749 clickCount, 750 false, button)); 751 } 752 753 } 754 else { 755 modifiers = getWheelModifiers(xbe.get_state(), button); 756 if (xev.get_type() == XConstants.ButtonPress) { 757 MouseWheelEvent mwe = new MouseWheelEvent(getEventSource(),MouseEvent.MOUSE_WHEEL, jWhen, 758 modifiers, 759 x, y, 760 xbe.get_x_root(), 761 xbe.get_y_root(), 762 1,false,MouseWheelEvent.WHEEL_UNIT_SCROLL, 763 3,button==4 ? -1 : 1); 764 postEventToEventQueue(mwe); 765 } 766 } 767 768 /* Update the state variable AFTER the CLICKED event post. */ 769 if (type == XConstants.ButtonRelease) { 770 /* Exclude this mouse button from allowed list.*/ 771 mouseButtonClickAllowed &= ~ XlibUtil.getButtonMask(lbutton); 772 } 773 } 774 775 public void handleMotionNotify(XEvent xev) { 776 super.handleMotionNotify(xev); 777 XMotionEvent xme = xev.get_xmotion(); 778 if (isEventDisabled(xev)) { 779 return; 780 } 781 788 789 for (int i = 0; i < buttonsNumber; i++){ 790 // TODO : here is the bug in WM: extra buttons doesn't have state!=0 as they should. 791 if ((i != 4) && (i != 5)) { 792 mouseKeyState = mouseKeyState | (xme.get_state() & XlibUtil.getButtonMask(i + 1)); 793 } 794 } 795 796 boolean isDragging = (mouseKeyState != 0); 797 int mouseEventType = 0; 798 799 if (isDragging) { 800 mouseEventType = MouseEvent.MOUSE_DRAGGED; 801 } else { 802 mouseEventType = MouseEvent.MOUSE_MOVED; 803 } 804 805 /* 806 Fix for 6176814 . Add multiclick checking. 807 */ 808 int x = xme.get_x(); 809 int y = xme.get_y(); 810 XWindow lastWindow = (lastWindowRef != null) ? (lastWindowRef.get()):(null); 811 812 if (!(lastWindow == this && 813 (xme.get_time() - lastTime) < XToolkit.getMultiClickTime() && 814 (Math.abs(lastX - x) < AWT_MULTICLICK_SMUDGE && 815 Math.abs(lastY - y) < AWT_MULTICLICK_SMUDGE))) { 816 clickCount = 0; 817 lastWindowRef = null; 818 mouseButtonClickAllowed = 0; 819 lastTime = 0; 820 lastX = 0; 821 lastY = 0; 822 } 823 824 long jWhen = XToolkit.nowMillisUTC_offset(xme.get_time()); 825 int modifiers = getModifiers(xme.get_state(), 0, 0); 826 boolean popupTrigger = false; 827 828 Component source = getEventSource(); 829 830 if (xme.get_window() != window) { 831 Point localXY = toLocal(xme.get_x_root(), xme.get_y_root()); 832 x = localXY.x; 833 y = localXY.y; 834 } 835 /* Fix for 5039416. 836 * According to canvas.c we shouldn't post any MouseEvent if mouse is dragging and clickCount!=0. 837 */ 838 if ((isDragging && clickCount == 0) || !isDragging) { 839 MouseEvent mme = new MouseEvent(source, mouseEventType, jWhen, 840 modifiers, x, y, xme.get_x_root(), xme.get_y_root(), 841 clickCount, popupTrigger, MouseEvent.NOBUTTON); 842 postEventToEventQueue(mme); 843 } 844 } 845 846 847 // REMIND: need to implement looking for disabled events 848 private native boolean x11inputMethodLookupString(long event, 849 long[] keysymArray); 850 851 private native boolean haveCurrentX11InputMethodInstance(); 852 853 private boolean mouseAboveMe; 854 855 public boolean isMouseAbove() { 856 synchronized (getStateLock()) { 857 return mouseAboveMe; 858 } 859 } 860 protected void setMouseAbove(boolean above) { 932 // cursor is updated (in XGlobalCursorManager.findHeavyweightUnderCursor()). 933 XAwtState.setComponentMouseEntered(getEventSource()); 934 XGlobalCursorManager.nativeUpdateCursor(getEventSource()); 935 } else { // LeaveNotify: 936 XAwtState.setComponentMouseEntered(null); 937 } 938 } else { 939 ((XComponentPeer) AWTAccessor.getComponentAccessor().getPeer(target)) 940 .pSetCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 941 } 942 } 943 944 if (isEventDisabled(xev)) { 945 return; 946 } 947 948 long jWhen = XToolkit.nowMillisUTC_offset(xce.get_time()); 949 int modifiers = getModifiers(xce.get_state(),0,0); 950 int clickCount = 0; 951 boolean popupTrigger = false; 952 int x = xce.get_x(); 953 int y = xce.get_y(); 954 if (xce.get_window() != window) { 955 Point localXY = toLocal(xce.get_x_root(), xce.get_y_root()); 956 x = localXY.x; 957 y = localXY.y; 958 } 959 960 // This code tracks boundary crossing and ensures MOUSE_ENTER/EXIT 961 // are posted in alternate pairs 962 if (compWithMouse != null) { 963 MouseEvent me = new MouseEvent(compWithMouse, 964 MouseEvent.MOUSE_EXITED, jWhen, modifiers, xce.get_x(), 965 xce.get_y(), xce.get_x_root(), xce.get_y_root(), clickCount, popupTrigger, 966 MouseEvent.NOBUTTON); 967 postEventToEventQueue(me); 968 eventLog.finest("Clearing last window ref"); 969 lastWindowRef = null; 970 } 971 if (xce.get_type() == XConstants.EnterNotify) { 972 MouseEvent me = new MouseEvent(getEventSource(), MouseEvent.MOUSE_ENTERED, 973 jWhen, modifiers, xce.get_x(), xce.get_y(), xce.get_x_root(), xce.get_y_root(), clickCount, 974 popupTrigger, MouseEvent.NOBUTTON); 975 postEventToEventQueue(me); 976 } 977 } 978 979 public void doLayout(int x, int y, int width, int height) {} 980 981 public void handleConfigureNotifyEvent(XEvent xev) { 982 Rectangle oldBounds = getBounds(); 983 984 super.handleConfigureNotifyEvent(xev); 985 if (insLog.isLoggable(PlatformLogger.Level.FINER)) { 986 insLog.finer("Configure, {0}, event disabled: {1}", 987 xev.get_xconfigure(), isEventDisabled(xev)); 988 } 989 if (isEventDisabled(xev)) { 990 return; 991 } 992 993 // if ( Check if it's a resize, a move, or a stacking order change ) 994 // { 1514 /** 1515 * Indicates if the window is currently in the FSEM. 1516 * Synchronization: state lock. 1517 */ 1518 private boolean fullScreenExclusiveModeState = false; 1519 1520 // Implementation of the X11ComponentPeer 1521 @Override 1522 public void setFullScreenExclusiveModeState(boolean state) { 1523 synchronized (getStateLock()) { 1524 fullScreenExclusiveModeState = state; 1525 } 1526 } 1527 1528 public final boolean isFullScreenExclusiveMode() { 1529 synchronized (getStateLock()) { 1530 return fullScreenExclusiveModeState; 1531 } 1532 } 1533 1534 } | 531 protected void flush(){ 532 XToolkit.awtLock(); 533 try { 534 XlibWrapper.XFlush(XToolkit.getDisplay()); 535 } finally { 536 XToolkit.awtUnlock(); 537 } 538 } 539 540 public void popup(int x, int y, int width, int height) { 541 // TBD: grab the pointer 542 xSetBounds(x, y, width, height); 543 } 544 545 public void handleExposeEvent(XEvent xev) { 546 super.handleExposeEvent(xev); 547 XExposeEvent xe = xev.get_xexpose(); 548 if (isEventDisabled(xev)) { 549 return; 550 } 551 552 int x = scaleDown(xe.get_x()); 553 int y = scaleDown(xe.get_y()); 554 int w = scaleDown(xe.get_width()); 555 int h = scaleDown(xe.get_height()); 556 557 Component target = getEventSource(); 558 ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor(); 559 560 if (!compAccessor.getIgnoreRepaint(target) 561 && compAccessor.getWidth(target) != 0 562 && compAccessor.getHeight(target) != 0) 563 { 564 postPaintEvent(target, x, y, w, h); 565 } 566 } 567 568 public void postPaintEvent(Component target, int x, int y, int w, int h) { 569 PaintEvent event = PaintEventDispatcher.getPaintEventDispatcher(). 570 createPaintEvent(target, x, y, w, h); 571 if (event != null) { 572 postEventToEventQueue(event); 573 } 574 } 575 660 if (eventLog.isLoggable(PlatformLogger.Level.FINE)) { 661 eventLog.fine(xbe.toString()); 662 } 663 long when; 664 int modifiers; 665 boolean popupTrigger = false; 666 int button=0; 667 int lbutton = xbe.get_button(); 668 /* 669 * Ignore the buttons above 20 due to the bit limit for 670 * InputEvent.BUTTON_DOWN_MASK. 671 * One more bit is reserved for FIRST_HIGH_BIT. 672 */ 673 if (lbutton > SunToolkit.MAX_BUTTONS_SUPPORTED) { 674 return; 675 } 676 int type = xev.get_type(); 677 when = xbe.get_time(); 678 long jWhen = XToolkit.nowMillisUTC_offset(when); 679 680 int x = scaleDown(xbe.get_x()); 681 int y = scaleDown(xbe.get_y()); 682 if (xev.get_xany().get_window() != window) { 683 Point localXY = toLocal(scaleDown(xbe.get_x_root()), 684 scaleDown(xbe.get_y_root())); 685 x = localXY.x; 686 y = localXY.y; 687 } 688 689 if (type == XConstants.ButtonPress) { 690 //Allow this mouse button to generate CLICK event on next ButtonRelease 691 mouseButtonClickAllowed |= XlibUtil.getButtonMask(lbutton); 692 XWindow lastWindow = (lastWindowRef != null) ? (lastWindowRef.get()):(null); 693 /* 694 multiclick checking 695 */ 696 if (eventLog.isLoggable(PlatformLogger.Level.FINEST)) { 697 eventLog.finest("lastWindow = " + lastWindow + ", lastButton " 698 + lastButton + ", lastTime " + lastTime + ", multiClickTime " 699 + XToolkit.getMultiClickTime()); 700 } 701 if (lastWindow == this && lastButton == lbutton && (when - lastTime) < XToolkit.getMultiClickTime()) { 702 clickCount++; 703 } else { 704 clickCount = 1; 715 */ 716 popupTrigger = (lbutton == 3); 717 } 718 719 button = XConstants.buttons[lbutton - 1]; 720 721 // mapping extra buttons to numbers starting from 4. 722 if ((button > XConstants.buttons[4]) && (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled())){ 723 return; 724 } 725 726 if (button > XConstants.buttons[4]){ 727 button -= 2; 728 } 729 730 if (!isWheel(lbutton)) { 731 modifiers = getModifiers(xbe.get_state(), button, 0); 732 MouseEvent me = new MouseEvent(getEventSource(), 733 type == XConstants.ButtonPress ? MouseEvent.MOUSE_PRESSED : MouseEvent.MOUSE_RELEASED, 734 jWhen,modifiers, x, y, 735 scaleDown(xbe.get_x_root()), 736 scaleDown(xbe.get_y_root()), 737 clickCount,popupTrigger,button); 738 739 postEventToEventQueue(me); 740 741 if ((type == XConstants.ButtonRelease) && 742 ((mouseButtonClickAllowed & XlibUtil.getButtonMask(lbutton)) != 0) ) // No up-button in the drag-state 743 { 744 postEventToEventQueue(me = new MouseEvent(getEventSource(), 745 MouseEvent.MOUSE_CLICKED, 746 jWhen, 747 modifiers, 748 x, y, 749 scaleDown(xbe.get_x_root()), 750 scaleDown(xbe.get_y_root()), 751 clickCount, 752 false, button)); 753 } 754 755 } 756 else { 757 modifiers = getWheelModifiers(xbe.get_state(), button); 758 if (xev.get_type() == XConstants.ButtonPress) { 759 MouseWheelEvent mwe = new MouseWheelEvent(getEventSource(),MouseEvent.MOUSE_WHEEL, jWhen, 760 modifiers, 761 x, y, 762 scaleDown(xbe.get_x_root()), 763 scaleDown(xbe.get_y_root()), 764 1,false,MouseWheelEvent.WHEEL_UNIT_SCROLL, 765 3,button==4 ? -1 : 1); 766 postEventToEventQueue(mwe); 767 } 768 } 769 770 /* Update the state variable AFTER the CLICKED event post. */ 771 if (type == XConstants.ButtonRelease) { 772 /* Exclude this mouse button from allowed list.*/ 773 mouseButtonClickAllowed &= ~ XlibUtil.getButtonMask(lbutton); 774 } 775 } 776 777 public void handleMotionNotify(XEvent xev) { 778 super.handleMotionNotify(xev); 779 XMotionEvent xme = xev.get_xmotion(); 780 if (isEventDisabled(xev)) { 781 return; 782 } 783 790 791 for (int i = 0; i < buttonsNumber; i++){ 792 // TODO : here is the bug in WM: extra buttons doesn't have state!=0 as they should. 793 if ((i != 4) && (i != 5)) { 794 mouseKeyState = mouseKeyState | (xme.get_state() & XlibUtil.getButtonMask(i + 1)); 795 } 796 } 797 798 boolean isDragging = (mouseKeyState != 0); 799 int mouseEventType = 0; 800 801 if (isDragging) { 802 mouseEventType = MouseEvent.MOUSE_DRAGGED; 803 } else { 804 mouseEventType = MouseEvent.MOUSE_MOVED; 805 } 806 807 /* 808 Fix for 6176814 . Add multiclick checking. 809 */ 810 int x = scaleDown(xme.get_x()); 811 int y = scaleDown(xme.get_y()); 812 XWindow lastWindow = (lastWindowRef != null) ? (lastWindowRef.get()):(null); 813 814 if (!(lastWindow == this && 815 (xme.get_time() - lastTime) < XToolkit.getMultiClickTime() && 816 (Math.abs(lastX - x) < AWT_MULTICLICK_SMUDGE && 817 Math.abs(lastY - y) < AWT_MULTICLICK_SMUDGE))) { 818 clickCount = 0; 819 lastWindowRef = null; 820 mouseButtonClickAllowed = 0; 821 lastTime = 0; 822 lastX = 0; 823 lastY = 0; 824 } 825 826 long jWhen = XToolkit.nowMillisUTC_offset(xme.get_time()); 827 int modifiers = getModifiers(xme.get_state(), 0, 0); 828 boolean popupTrigger = false; 829 830 Component source = getEventSource(); 831 832 if (xme.get_window() != window) { 833 Point localXY = toLocal(scaleDown(xme.get_x_root()), 834 scaleDown(xme.get_y_root())); 835 x = localXY.x; 836 y = localXY.y; 837 } 838 /* Fix for 5039416. 839 * According to canvas.c we shouldn't post any MouseEvent if mouse is dragging and clickCount!=0. 840 */ 841 if ((isDragging && clickCount == 0) || !isDragging) { 842 MouseEvent mme = new MouseEvent(source, mouseEventType, jWhen, 843 modifiers, x, y, 844 scaleDown(xme.get_x_root()), 845 scaleDown(xme.get_y_root()), 846 clickCount, popupTrigger, MouseEvent.NOBUTTON); 847 postEventToEventQueue(mme); 848 } 849 } 850 851 852 // REMIND: need to implement looking for disabled events 853 private native boolean x11inputMethodLookupString(long event, 854 long[] keysymArray); 855 856 private native boolean haveCurrentX11InputMethodInstance(); 857 858 private boolean mouseAboveMe; 859 860 public boolean isMouseAbove() { 861 synchronized (getStateLock()) { 862 return mouseAboveMe; 863 } 864 } 865 protected void setMouseAbove(boolean above) { 937 // cursor is updated (in XGlobalCursorManager.findHeavyweightUnderCursor()). 938 XAwtState.setComponentMouseEntered(getEventSource()); 939 XGlobalCursorManager.nativeUpdateCursor(getEventSource()); 940 } else { // LeaveNotify: 941 XAwtState.setComponentMouseEntered(null); 942 } 943 } else { 944 ((XComponentPeer) AWTAccessor.getComponentAccessor().getPeer(target)) 945 .pSetCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 946 } 947 } 948 949 if (isEventDisabled(xev)) { 950 return; 951 } 952 953 long jWhen = XToolkit.nowMillisUTC_offset(xce.get_time()); 954 int modifiers = getModifiers(xce.get_state(),0,0); 955 int clickCount = 0; 956 boolean popupTrigger = false; 957 int x = scaleDown(xce.get_x()); 958 int y = scaleDown(xce.get_y()); 959 if (xce.get_window() != window) { 960 Point localXY = toLocal(scaleDown(xce.get_x_root()), 961 scaleDown(xce.get_y_root())); 962 x = localXY.x; 963 y = localXY.y; 964 } 965 966 // This code tracks boundary crossing and ensures MOUSE_ENTER/EXIT 967 // are posted in alternate pairs 968 if (compWithMouse != null) { 969 MouseEvent me = new MouseEvent(compWithMouse, MouseEvent.MOUSE_EXITED, 970 jWhen, modifiers, 971 scaleDown(xce.get_x()), 972 scaleDown(xce.get_y()), 973 scaleDown(xce.get_x_root()), 974 scaleDown(xce.get_y_root()), 975 clickCount, popupTrigger, 976 MouseEvent.NOBUTTON); 977 postEventToEventQueue(me); 978 eventLog.finest("Clearing last window ref"); 979 lastWindowRef = null; 980 } 981 if (xce.get_type() == XConstants.EnterNotify) { 982 MouseEvent me = new MouseEvent(getEventSource(), MouseEvent.MOUSE_ENTERED, 983 jWhen, modifiers, 984 scaleDown(xce.get_x()), 985 scaleDown(xce.get_y()), 986 scaleDown(xce.get_x_root()), 987 scaleDown(xce.get_y_root()), 988 clickCount, popupTrigger, 989 MouseEvent.NOBUTTON); 990 postEventToEventQueue(me); 991 } 992 } 993 994 public void doLayout(int x, int y, int width, int height) {} 995 996 public void handleConfigureNotifyEvent(XEvent xev) { 997 Rectangle oldBounds = getBounds(); 998 999 super.handleConfigureNotifyEvent(xev); 1000 if (insLog.isLoggable(PlatformLogger.Level.FINER)) { 1001 insLog.finer("Configure, {0}, event disabled: {1}", 1002 xev.get_xconfigure(), isEventDisabled(xev)); 1003 } 1004 if (isEventDisabled(xev)) { 1005 return; 1006 } 1007 1008 // if ( Check if it's a resize, a move, or a stacking order change ) 1009 // { 1529 /** 1530 * Indicates if the window is currently in the FSEM. 1531 * Synchronization: state lock. 1532 */ 1533 private boolean fullScreenExclusiveModeState = false; 1534 1535 // Implementation of the X11ComponentPeer 1536 @Override 1537 public void setFullScreenExclusiveModeState(boolean state) { 1538 synchronized (getStateLock()) { 1539 fullScreenExclusiveModeState = state; 1540 } 1541 } 1542 1543 public final boolean isFullScreenExclusiveMode() { 1544 synchronized (getStateLock()) { 1545 return fullScreenExclusiveModeState; 1546 } 1547 } 1548 1549 @Override 1550 protected int getScale() { 1551 return graphicsConfig.getScale(); 1552 } 1553 1554 @Override 1555 protected int scaleUp(int x) { 1556 return graphicsConfig.scaleUp(x); 1557 } 1558 1559 @Override 1560 protected int scaleDown(int x) { 1561 return graphicsConfig.scaleDown(x); 1562 } 1563 } |