<Swing Dev> [7] Review request for 7123767 Wrong tooltip location in Multi-Monitor configurations
Pavel Porvatov
pavel.porvatov at oracle.com
Tue Sep 4 16:35:35 UTC 2012
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
2. adjustInsets changes values of arguments. So return the same value
and assigning
workingBounds = adjustInsets(workingBounds, insets);
looks unnecessary
3. I run the test via jtreg and it failed on my environment with the
attached log. Could you please investigate that?
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
>>>>
>>>
>>>
>>
>
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: bug7123767.jtr
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20120904/93444794/bug7123767.jtr>
More information about the swing-dev
mailing list