Closed
Bug 146108
Opened 23 years ago
Closed 22 years ago
popup menu position wrong after opening tabs.
Categories
(Core :: XUL, defect)
Tracking
()
RESOLVED
FIXED
People
(Reporter: schoepf, Assigned: blizzard)
References
(Blocks 1 open bug)
Details
(Whiteboard: [wgate])
Attachments
(2 files, 1 obsolete file)
(deleted),
image/png
|
Details | |
(deleted),
patch
|
blizzard
:
review+
bryner
:
superreview+
asa
:
approval+
|
Details | Diff | Splinter Review |
From Bugzilla Helper:
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0rc2) Gecko/20020520
Debian/1.0rc2-3
BuildID: 20020520 Debian/1.0rc2-3
Popup menus in the content area have an offset in y direction if the page was
loaded without visible tab bar and after loading a new tab was opened.
When the page on the old tab is reloaded (or a new url is opened) the menu is
back at the correct position. This bug also does not happen, when the menu has
not been opened before the new tab was added.
This also applies to menus for <input> elements and can cause accidental selections.
Reproducible: Always
Steps to Reproduce:
1.Open a new navigator window
2.Right-click into the content area
3.Open a new tab (so that the tab bar shows up)
4.Go back to the old tab
5.Right-click again.
Actual Results: Menu pops up at a wrong position, offset by about the height of
the tab bar.
Comment 1•23 years ago
|
||
This happens with combo boxes too.
Reporter | ||
Comment 2•23 years ago
|
||
same with the sidebar (open menu, toggle sidebar, open menu again)
Reporter | ||
Comment 3•23 years ago
|
||
Reporter | ||
Comment 4•23 years ago
|
||
Reason is that (widget/src/gtk/)nsWindow::GetWindowPos() uses cached x/y coords
and obviously these cached values are not invalidated when tabs or sidebars show
up/vanish.
Reporter | ||
Comment 5•23 years ago
|
||
This patch removes the position cache (that seems to be implemented only with
gtk, e.g. gtk2 doesn't cache) and therefore fixes the problem.
The reason why page reloading cured the symptom was not that the cache was
invalidated but rather a completely new nsWindow object was created.
Comment 6•23 years ago
|
||
=> blizzard, fast blast for 1.0 or 1.0.1.
/be
Assignee: hyatt → blizzard
Status: UNCONFIRMED → NEW
Ever confirmed: true
Reporter | ||
Comment 7•23 years ago
|
||
I'd like to ask for a review of attachment 85173 [details] [diff] [review]
Thanks
Assignee | ||
Comment 8•22 years ago
|
||
Wait, the position cache is there for a reason. Why not find the problem in the
cache instead of removing it wholesale?
Reporter | ||
Comment 9•22 years ago
|
||
As far as I can see, the cache invalidation is not working for the following
reasons:
- the gtk event handler that invokes InvalidateWindowPos() is only triggered,
when the whole mozilla window is moved or when it is resized (even without
changing the (x,y) position).
- nsWindow::Move() invalidates the cache only when the position changed but
viewing/hiding the sidebar/tabbar/main menus triggers a call to Move() with
unchanged coordinates (always 0,0). Obviously that document window is contained
in another window.
This containing window is indeed moved to the correct coordinates and calls
gdk_window_move(mSuperWin->shell_window, aX, aY) in its nsWindow::Move() method.
This gdk_window_move() does not trigger the InvalidateWindowPos event. So I
think the reason for this bug is that gdk_window_move() must invalidate all
position caches of all contained windows.
As I am quite unfamiliar with gdk/gtk I have no idea about what needs to be done
to have this event triggered.
Comment 10•22 years ago
|
||
Because signal toplevel_configure is only attached to toplevel widget, position
or size change of non-toplevel widget won't trigger the change of cached
position coordination, e.g, sidebar open/close. We can't attach every widget to
the configurenotify of their every ancestor because it is too inefficent. To
traverse all the child while get ConfigNotify to invalidate the cache is also
inefficent. So I choose to invalidate the cache in Move method. Althoug some
Move methed does not actually cause a move, this way at least saves the cache
and avoid a castcade invalidating. Fortunately, layout calls the Move of the
child widget when it's ancestor does a move.
Seeking review=?
Reporter | ||
Comment 11•22 years ago
|
||
Comment on attachment 85173 [details] [diff] [review]
patch, getting rid of the position cache
Would be ok with me, much better than having no cache at all.
Attachment #85173 -
Attachment is obsolete: true
Comment 12•22 years ago
|
||
*** Bug 94296 has been marked as a duplicate of this bug. ***
Comment 13•22 years ago
|
||
I duped bug 94296 (with a bunch of dups) to this one.
You don't have to open the menu/widget first before causing the toolbar/etc to
collapse/appear to see the problem. I.e.
With sidebar on
Go to page with dropdown select widget
Turn off sidebar (F9)
Open dropdown
Let's get reviews on this and determine if it's the right solution
Keywords: mozilla1.0.2,
mozilla1.2
Comment 14•22 years ago
|
||
I'd like to give a FAQ of this bug to push the review:
1. When does widget update its cached location coordinate?
Only when the widget revieves the toplevel_configure signal or someone calls
InvalidateWindowPos explicitly. ( See handle_invalidate_pos in
widget/src/gtk/nsWindow.cpp)
2. Who will send the toplevel_configure signal?
When the toplevel widget revieces the ConfigureNotify, it will send out the
signal. ( See attach_toplevel_listener and toplevel_window_filter in
widget/src/gtksuperwin/gtkmozarea.c)
3. Will the cached position be invalidated when a non-toplevel parent widget get
the position change? (e.g. sidebar show/hide, toolbar show/hide will cause the
position of the other widgets changed)
No.
4. Why mozilla for windows don't have such problem?
It does not use such cache. ( See nsWindow::Move in widget/src/window/nsWindow.cpp )
Assignee | ||
Comment 15•22 years ago
|
||
Comment on attachment 98852 [details] [diff] [review]
patch
r=blizzard
Attachment #98852 -
Flags: review+
Comment 16•22 years ago
|
||
Comment on attachment 98852 [details] [diff] [review]
patch
sr=bryner
Attachment #98852 -
Flags: superreview+
Comment 17•22 years ago
|
||
Comment on attachment 98852 [details] [diff] [review]
patch
a=asa for checkin to 1.2 (on behalf of drivers).
Attachment #98852 -
Flags: approval+
Comment 18•22 years ago
|
||
checked in.
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
Comment 19•22 years ago
|
||
*** Bug 53318 has been marked as a duplicate of this bug. ***
Comment 20•21 years ago
|
||
*** Bug 112853 has been marked as a duplicate of this bug. ***
Comment 21•21 years ago
|
||
*** Bug 118424 has been marked as a duplicate of this bug. ***
Comment 22•21 years ago
|
||
Note that this did not fix <select>s inside <iframe>s...
Component: XP Toolkit/Widgets: Menus → XUL
QA Contact: shrir → xptoolkit.widgets
You need to log in
before you can comment on or make changes to this bug.
Description
•