Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site
Search in forums












SourceForge.net Logo
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 Go to next message
fudadmin is currently offline  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 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
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 #30923 is a reply to message #30902] Fri, 28 January 2011 12:42 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
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.



Actually, on top of everything else is OK. This is the only way X11 can do...
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30924 is a reply to message #30923] Fri, 28 January 2011 13:29 Go to previous messageGo to next message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
mirek wrote on Fri, 28 January 2011 11:42

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.



Actually, on top of everything else is OK. This is the only way X11 can do...



index.php?t=getfile&id=3063&private=0

but this is not ok?
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 Go to previous messageGo to next message
fudadmin is currently offline  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 #30954 is a reply to message #30927] Sat, 29 January 2011 20:39 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
Registered: November 2005
Ultimate Member
fudadmin wrote on Fri, 28 January 2011 08:03

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?



Well looks like X11 on macosx is not really 100% compliant. No wonder, X11 is absolute mess.

Well, I guess there might be sideeffect - I would use

#ifndef PLATFORM_OSX11

there.

Mirek
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30956 is a reply to message #30954] Sat, 29 January 2011 21:15 Go to previous messageGo to next message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
mirek wrote on Sat, 29 January 2011 19:39

fudadmin wrote on Fri, 28 January 2011 08:03

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?



Well looks like X11 on macosx is not really 100% compliant. No wonder, X11 is absolute mess.

Well, I guess there might be sideeffect - I would use

#ifndef PLATFORM_OSX11

there.

Mirek


But have you read this?
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30959 is a reply to message #30956] Sun, 30 January 2011 09:51 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
Registered: November 2005
Ultimate Member
Would

if(active) wnd->SetWndForeground();

work for you?
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30984 is a reply to message #30959] Mon, 31 January 2011 13:04 Go to previous messageGo to next message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
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();

Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30986 is a reply to message #30984] Mon, 31 January 2011 14:12 Go to previous messageGo to next message
dolik.rce is currently offline  dolik.rce
Messages: 1789
Registered: August 2008
Location: Czech Republic
Ultimate Contributor

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

[Updated on: Mon, 31 January 2011 14:12]

Report message to a moderator

Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30987 is a reply to message #30984] Mon, 31 January 2011 14:12 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
Registered: November 2005
Ultimate Member
fudadmin wrote on Mon, 31 January 2011 07: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();




Ops, should have been 'activate' (param of the function).

BTW, FYI, this call to SetWndForeground is quite essential, as we simply expect that setting focus activates the window (puts it to foreground).

Mirek

Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30988 is a reply to message #30986] Mon, 31 January 2011 14:13 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
Registered: November 2005
Ultimate Member
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 Smile

Mirek
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30989 is a reply to message #30988] Mon, 31 January 2011 14:51 Go to previous messageGo to next message
dolik.rce is currently offline  dolik.rce
Messages: 1789
Registered: August 2008
Location: Czech Republic
Ultimate Contributor

mirek wrote on Mon, 31 January 2011 14:13

dolik.rce wrote on Mon, 31 January 2011 08:12

if(activate) wnd->SetWndForeground();
At least that is what I did and it helped.

Honza


Did it? It's a great news then Smile

Mirek

Well, it did fix the annoying behavior of theide stealing the focus to other programs Smile Not sure about OSX...

I still don't understand why is it necessary to SetWndForeground when setting focus. I would expect window manager to take care of that in case of user causes the focus change (e.g. by clicking in the window). In case of setting the focus from code, it should IMHO be up to programmer to decide if the window should get activated. And the programmer should use it very rarely, as it is quite annoying Smile

Honza

PS: And it didn't solve Radeks problems in the other thread...

[Updated on: Mon, 31 January 2011 14:53]

Report message to a moderator

Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30990 is a reply to message #30988] Mon, 31 January 2011 15:01 Go to previous messageGo to next message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
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 Smile

Mirek


Honza's proposed solution was based on a wrong believe Smile. 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
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30991 is a reply to message #30990] Mon, 31 January 2011 15:09 Go to previous messageGo to next message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
This works as well :
	if(activate) _this->SetWndForeground();

Maybe such was the intention?
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 Go to previous messageGo to next message
mirek is currently offline  mirek
Messages: 13975
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 Smile

Mirek


Honza's proposed solution was based on a wrong believe Smile. 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

Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30994 is a reply to message #30992] Mon, 31 January 2011 15:18 Go to previous messageGo to next message
dolik.rce is currently offline  dolik.rce
Messages: 1789
Registered: August 2008
Location: Czech Republic
Ultimate Contributor

Oups, I made a mistake by copy/pasting from some other post Embarassed I actually just added the if(activate) to the already existing line. So to clear it up:
Quote:

if(activate) topwindow->SetWndForeground(); //works for me


Sorry for confusion,
Honza
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30995 is a reply to message #30992] Mon, 31 January 2011 15:25 Go to previous messageGo to next message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
mirek wrote on Mon, 31 January 2011 14:09

[or maybe

if(activate)
    topctrl->SetWndForeground();


If you have time to check in osx11 and/or linux, it would be very helpful.



This works on osx11! I don't have linux. Honza could check, please.
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30998 is a reply to message #30995] Mon, 31 January 2011 16:03 Go to previous messageGo to next message
dolik.rce is currently offline  dolik.rce
Messages: 1789
Registered: August 2008
Location: Czech Republic
Ultimate Contributor

fudadmin wrote on Mon, 31 January 2011 15:25

mirek wrote on Mon, 31 January 2011 14:09

[or maybe

if(activate)
    topctrl->SetWndForeground();


If you have time to check in osx11 and/or linux, it would be very helpful.



This works on osx11! I don't have linux. Honza could check, please.

Appears to work fine on Linux too.
Honza
Re: [BUG?] X11 (at least OSX) Menus displayed under TopWindow, owner=RootWindow [message #30999 is a reply to message #30998] Mon, 31 January 2011 16:15 Go to previous messageGo to previous message
fudadmin is currently offline  fudadmin
Messages: 1321
Registered: November 2005
Location: Kaunas, Lithuania
Ultimate Contributor
Administrator
Sorry, just noticed that this way is better:
	if(activate) {
		if(!this->IsPopUp())
			topwindow->SetWndForeground();
		else
			focusCtrl->SetWndForeground();		
	}

the previous
if(activate)
    topctrl->SetWndForeground();

causes flickering of the window frame, shadows and titlebar.
Previous Topic: Restoring TrayIcon control
Next Topic: TrayIcon test V2
Goto Forum:
  


Current Time: Thu Mar 28 17:23:40 CET 2024

Total time taken to generate the page: 0.01712 seconds