Home » U++ Library support » TopWindow&PopUp, TrayIcon » [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow
| [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30902] |
Fri, 28 January 2011 06:41  |
 |
fudadmin
Messages: 1321 Registered: November 2005 Location: Kaunas, Lithuania
|
Ultimate Contributor Administrator |
|
|
on OSX, as it has been mentioned in the forums, upp menus are shown.
I have found out that they are displayed under the application window and parent is desktop root window. Or popups are displayed miles away on top of other apps.
As a quick fix, I applied in X11Wnd.cpp
void Ctrl::Create0(Ctrl *owner, bool redirect, bool savebits)
{
...
Window dad;
if(IsPopUp())
{
dad = (owner->top)->window;
}
else
dad = RootWindow(Xdisplay, Xscreenno);
Window w = XCreateWindow(Xdisplay, dad,
r.left, r.top, r.Width(), r.Height(),
0, CopyFromParent, InputOutput, CopyFromParent,
CWBitGravity|CWSaveUnder|CWOverrideRedirect|
(IsCompositedGui() ? CWBackPixel : CWBackPixmap),
&swa);
if(!w) XError("XCreateWindow failed !");
...
also popup=true; before Create
the menus are displayed now but by the size of a window bar lower.
I guess that there is also a problem with focusCtrl.
Before I explore any deeper could someone tell:
Are menus supposed to have parent RootWindow(Xdisplay, Xscreenno); in upp?
and
void MenuBar::PopUp(Ctrl *owner, Point p, Size rsz)
{
bool szcx = true;
bool szcy = true;
bool szx = false;
bool szy = false;
if(parentmenu) {
if(parentmenu->IsChild())
szcx = false;
else
szcy = false;
WhenHelp = parentmenu->WhenHelp;
}
Rect r = GetWorkArea(p);
Rect r = the whole screen?
|
|
|
|
| Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30922 is a reply to message #30902] |
Fri, 28 January 2011 12:37   |
 |
mirek
Messages: 14271 Registered: November 2005
|
Ultimate Member |
|
|
| fudadmin wrote on Fri, 28 January 2011 00:41 | on OSX, as it has been mentioned in the forums, upp menus are shown.
I have found out that they are displayed under the application window and parent is desktop root window. Or popups are displayed miles away on top of other apps.
As a quick fix, I applied in X11Wnd.cpp
void Ctrl::Create0(Ctrl *owner, bool redirect, bool savebits)
{
...
Window dad;
if(IsPopUp())
{
dad = (owner->top)->window;
}
else
dad = RootWindow(Xdisplay, Xscreenno);
Window w = XCreateWindow(Xdisplay, dad,
r.left, r.top, r.Width(), r.Height(),
0, CopyFromParent, InputOutput, CopyFromParent,
CWBitGravity|CWSaveUnder|CWOverrideRedirect|
(IsCompositedGui() ? CWBackPixel : CWBackPixmap),
&swa);
if(!w) XError("XCreateWindow failed !");
...
also popup=true; before Create
the menus are displayed now but by the size of a window bar lower.
I guess that there is also a problem with focusCtrl.
Before I explore any deeper could someone tell:
Are menus supposed to have parent RootWindow(Xdisplay, Xscreenno); in upp?
|
Of course. Not possible to do this any other way. Parent clips content of its child, so if we want menus to extend "outside" its owner window, parent has to be RootWindow.
| Quote: |
void MenuBar::PopUp(Ctrl *owner, Point p, Size rsz)
{
bool szcx = true;
bool szcy = true;
bool szx = false;
bool szy = false;
if(parentmenu) {
if(parentmenu->IsChild())
szcx = false;
else
szcy = false;
WhenHelp = parentmenu->WhenHelp;
}
Rect r = GetWorkArea(p);
Rect r = the whole screen?
|
In most cases, yes.
|
|
|
|
|
|
|
|
| Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30927 is a reply to message #30924] |
Fri, 28 January 2011 14:03   |
 |
fudadmin
Messages: 1321 Registered: November 2005 Location: Kaunas, Lithuania
|
Ultimate Contributor Administrator |
|
|
I think I have the remedy.
in CtrlKbd.cpp,
if I comment the line
topwindow->SetWndForeground(); // cxl 2007-4-27
the menus are displayed properly. Any side effects from your point of view?
like this:
bool Ctrl::SetFocus0(bool activate)
{
GuiLock __;
if(IsUsrLog())
UsrLogT(6, String().Cat() << "SETFOCUS " << Desc(this));
LLOG("Ctrl::SetFocus " << Desc(this));
LLOG("focusCtrlWnd " << UPP::Name(focusCtrlWnd));
LLOG("Ctrl::SetFocus0 -> deferredSetFocus = NULL; was: " << UPP::Name(defferedSetFocus));
defferedSetFocus = NULL;
if(focusCtrl == this) return true;
if(!IsOpen() || !IsEnabled() || !IsVisible()) return false;
Ptr<Ctrl> pfocusCtrl = focusCtrl;
Ptr<Ctrl> topwindow = GetTopWindow();
Ptr<Ctrl> topctrl = GetTopCtrl();
Ptr<Ctrl> _this = this;
if(!topwindow) topwindow = topctrl;
LLOG("SetFocus -> SetWndFocus: topwindow = " << UPP::Name(topwindow) << ", focusCtrlWnd = " << UPP::Name(focusCtrlWnd));
if(!topwindow->HasWndFocus() && !topwindow->SetWndFocus()) return false;// cxl 31.1.2004
// topwindow->SetWndForeground(); // cxl 2007-4-27
LLOG("SetFocus -> focusCtrl = this: " << FormatIntHex(this) << ", _this = " << FormatIntHex(~_this) << ", " << UPP::Name(_this));
focusCtrl = _this;
focusCtrlWnd = topwindow;
DoKillFocus(pfocusCtrl, _this);
LLOG("SetFocus 2 - after DoKillFocus");
DoDeactivate(pfocusCtrl, _this);
DoSetFocus(pfocusCtrl, _this, activate);
if(topwindow)
lastActiveWnd = topwindow;
return true;
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30992 is a reply to message #30990] |
Mon, 31 January 2011 15:09   |
 |
mirek
Messages: 14271 Registered: November 2005
|
Ultimate Member |
|
|
| fudadmin wrote on Mon, 31 January 2011 09:01 |
| mirek wrote on Mon, 31 January 2011 13:13 |
| dolik.rce wrote on Mon, 31 January 2011 08:12 |
| fudadmin wrote on Mon, 31 January 2011 13:04 |
| mirek wrote on Sun, 30 January 2011 08:51 | Would
if(active) wnd->SetWndForeground();
work for you?
|
error: active is not declared
blind try - this works:if(focusCtrl) focusCtrl->SetWndForeground();
|
I believe it should have been if(activate) wnd->SetWndForeground(); At least that is what I did and it helped.
Honza
|
Did it? It's a great news then 
Mirek
|
Honza's proposed solution was based on a wrong believe . Because - error: "wnd is not declared". What works is:
if(activate) {
// topwindow->SetWndForeground(); //this prevents menus in OSX11
focusCtrl->SetWndForeground();
}
if I understand correctly, if a menu pane is activated it should become focusCtrl and it should be put into foreground
|
Oh, I guess I have made a mistake with ids, sorry.
Should have been:
if(activate)
topwindow->SetWndForeground();
It cannot be focusCtrl, as focusCtrl is not required to be topctrl...
Anyway, now looking at it, perhaps the really correct solution is
topctrl->SetWndForeground();
or maybe
if(activate)
topctrl->SetWndForeground();
If you have time to check in osx11 and/or linux, it would be very helpful.
[Updated on: Mon, 31 January 2011 15:19] Report message to a moderator
|
|
|
|
|
|
|
|
|
|
|
|
Goto Forum:
Current Time: Sun Oct 26 18:09:08 CET 2025
Total time taken to generate the page: 0.03753 seconds
|