<Swing Dev> [7] Review request for 7123767 Wrong tooltip location in Multi-Monitor configurations
Vladislav Karnaukhov
Vladislav.Karnaukhov at oracle.com
Mon Sep 10 14:21:06 UTC 2012
Hello Pavel, all,
please find new webrev here:
http://cr.openjdk.java.net/~vkarnauk/7123767/webrev.04/
Please see my comments inline.
Regards,
- Vlad
On 9/4/2012 8:35 PM, Pavel Porvatov wrote:
> Hi Vladislav,
>
> I have several comments for the fix:
> 1.
> if(preferredLocation != null) {
> location = toFind;
> if (!leftToRight) {
> location.x -= size.width;
> }
> } else {
> location.x = screenLocation.x + mouseEvent.getX();
> location.y = screenLocation.y + mouseEvent.getY() + 20;
>
> In case "preferredLocation != null" creation of new object
> Point location = new Point();
> is not used, so you could put location = new Point() in else block
Agreed, fixed.
>
> 2. adjustInsets changes values of arguments. So return the same value
> and assigning
> workingBounds = adjustInsets(workingBounds, insets);
> looks unnecessary
Agreed. I've removed adjustInsets() completely.
>
> 3. I run the test via jtreg and it failed on my environment with the
> attached log. Could you please investigate that?
My initial approach for the test was incorrect, I've run on several
issues on Mac platform. I've re-written the test completely and run it
against jdk7 and jdk8 on Windows and Mac OS X.
>
>
> Regards, Pavel
>> Hello Pavel, all,
>>
>> thank you for the review, please find new webrev here:
>> http://cr.openjdk.java.net/~vkarnauk/7123767/webrev.03/
>>
>> Please see my comments inline.
>>
>> Regards,
>> - Vlad
>>
>> On 8/31/2012 8:50 PM, Pavel Porvatov wrote:
>>> Hi Vladislav,
>>>
>>> I have several comments about the fix:
>>> 1. getDrawingRect: now localInsets should be requested only if
>>> localRect.contains(toFind) is true
>>> 2.
>>> + // Something's really wrong here - use the screen
>>> that our
>>> + // Component belongs to
>>> + if (workingBounds == null)
>>> + workingBounds =
>>> insideComponent.getGraphicsConfiguration().getBounds();
>>> a. You should always use {...} for if construction
>> Fixed.
>>
>>> b. It seems we should invoke adjustInsets there. To reduce the code
>>> I think you can rename getDrawingRect into getGraphicsConfiguration
>>> and return GraphicsConfiguration there. And only when
>>> GraphicsConfiguration is found calculate adjusted bounds...
>> Agreed. Fixed.
>>
>>> 3. getDrawingRect comment should have two ")" at the end
>> Fixed.
>>
>>>
>>> Abou the test:
>>> 1. You should use Toolkit.realSync after setVisible
>> Fixed.
>>
>>> 2. I run the test on jdk1.8.0b51 and it passes. Looks strange...
>> The reason why it didn't fail on non-patched JDK8 is because line 184
>>
>> 183 Component component = e.getChild();
>> 184 if (component.isShowing()) {
>> 185 if
>> (!config.equals(getGCByPoint(component.getLocationOnScreen()))) {
>>
>> returned "false" as AWT event queue was processed slower than test
>> thread, thus my check never actually happened. I've changed these
>> logic (please see new webrev), now this condition is processed
>> correctly. Test works on patched JDK and fails on non-patched JDK6,
>> 7, and 8.
>>
>>>
>>> Regards, Pavel
>>>> Hi Pavel, all,
>>>>
>>>> please find new webrev here:
>>>> http://cr.openjdk.java.net/~vkarnauk/7123767/webrev.02/
>>>> Please see my comments inline.
>>>>
>>>> Regards,
>>>> - Vlad
>>>>
>>>> On 8/17/2012 9:10 PM, Pavel Porvatov wrote:
>>>>> Hi Vladislav,
>>>>>
>>>>> I have several comments about the fix:
>>>>>
>>>>> 1. javax.swing.ToolTipManager#showTipWindow: I think toFind
>>>>> variable should be initialized in if(preferredLocation != null) {
>>>>> ....} else {...} block. It looks more logical and code will be
>>>>> more compact (adjustedPreferredLocation can be removed at all, I
>>>>> think)
>>>> Agreed. I've re-worked this piece.
>>>>
>>>>>
>>>>> 2. Could you please explain why you are using union of all
>>>>> rectangles in the getDrawingRect method? In case two monitors are
>>>>> aligned on a diagonal totalRect will contain areas that are not
>>>>> covered by screen devices and popups can be placed incorrectly.
>>>> Agreed again. I've re-designed getDrawingRect() function and placed
>>>> additional condition into showTipWindow() function; now every
>>>> situation should be handled correctly.
>>>>
>>>> Automated test was added, please see the webrev.
>>>>
>>>> Regards,
>>>> - Vlad
>>>>
>>>>>
>>>>> Regards, Pavel
>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> please review the fix for 7123767: Wrong tooltip location in
>>>>>> Multi-Monitor configurations
>>>>>>
>>>>>> jdk7 webrev: http://cr.openjdk.java.net/~vkarnauk/7123767/webrev.00/
>>>>>> test source: http://cr.openjdk.java.net/~vkarnauk/7123767/test/
>>>>>> bug description:
>>>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7123767
>>>>>>
>>>>>> This is also a customer escalated issue in jdk6.
>>>>>>
>>>>>> On multi-monitor configurations Component.getLocationOnScreen()
>>>>>> may return negative values. Additionally,
>>>>>> ToolTipManager.showTipWindow() method calculates tip window
>>>>>> location from Component' getLocationOnScreen() return data and
>>>>>> draws tip window using the same GraphicsConfiguration instance as
>>>>>> component's top-left corner, which again can be of negative
>>>>>> value. When component is stretched across multiple screen
>>>>>> devices, this may lead to a situation when it's tooltip is drawn
>>>>>> on wrong monitor.
>>>>>>
>>>>>> To fix this we should count all GraphicsConfiguration instances
>>>>>> and determine correct screen device to draw on. We should also
>>>>>> take into account that:
>>>>>> 1) tip window preferred location could be set
>>>>>> 2) preferred location could be greater than total virtual bounds
>>>>>> of all monitors. To make tip window visible in such case we move
>>>>>> it to the corresponding corner of total virtual bounds
>>>>>> 3) exact order of monitors (left-to-right and top-to-bottom) is
>>>>>> unknown
>>>>>>
>>>>>> I run jtreg against ToolTipManager tests and all tests passed (I
>>>>>> run it several times with different monitor configurations). I
>>>>>> also tested the fix with custom test program (please see the link
>>>>>> provided) with 4 possible monitor configurations (left-to-right,
>>>>>> right-to-left, top-to-bottom and bottom-to-top) and saw no issues.
>>>>>>
>>>>>> I added no new automated test(s) because this at least would
>>>>>> require multiple monitors to run.
>>>>>>
>>>>>> Regards,
>>>>>> - Vlad
>>>>>
>>>>
>>>>
>>>
>>
>>
>
More information about the swing-dev
mailing list