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