SFML community forums

Help => Window => Topic started by: zwcloud on November 01, 2015, 02:46:00 pm

Title: How to get clientrect position or the rect size of titlebar?
Post by: zwcloud on November 01, 2015, 02:46:00 pm
I want to show a borderless window located precisely at a certain position of another window which has a titlebar. But without the ClientRect Position or the rect size, I think, there is no way to do that.

By the way, The search system of SFML forum is awful. @Laurent I think you'd better place a google search box instead.

Using SFML.Net 2.2.
Title: Re: How to get clientrect position or the rect size of titlebar?
Post by: Laurent on November 01, 2015, 04:07:59 pm
You can call an OS-specific function on your window with window.getSystemHandle().

Quote
By the way, The search system of SFML forum is awful. @Laurent I think you'd better place a google search box instead.
Why is it awful?
Title: Re: How to get clientrect position or the rect size of titlebar?
Post by: mkalex777 on November 01, 2015, 08:37:14 pm
Quote
By the way, The search system of SFML forum is awful. @Laurent I think you'd better place a google search box instead.
Why is it awful?

Because it shows cut pieces of texts, it looks just like garbage
Title: Re: How to get clientrect position or the rect size of titlebar?
Post by: zwcloud on November 02, 2015, 02:13:01 am
Quote
You can call an OS-specific function on your window with window.getSystemHandle().
OK, I get it.

Quote
Because it shows cut pieces of texts, it looks just like garbage
Yes, exactly.
Title: Re: How to get clientrect position or the rect size of titlebar?
Post by: zwcloud on December 30, 2015, 05:11:19 pm
You can call an OS-specific function on your window with window.getSystemHandle().

Hi Laurent, It works when using Win32 API on Window. But when porting my project to linux, I find it may be impossible to get the client rect of the window under linux/X11.

Because the Window.getSystemHandle() function calls sfWindow_getSystemHandle in CSFML.
public virtual IntPtr SystemHandle
{
    get {return sfWindow_getSystemHandle(CPointer);}
}
 
https://github.com/SFML/SFML.Net/blob/master/src/Window/Window.cs#L325 (https://github.com/SFML/SFML.Net/blob/master/src/Window/Window.cs#L325)

And sfWindow_getSystemHandle returns a sfWindowHandle.
sfWindowHandle sfWindow_getSystemHandle(const sfWindow* window)
{
    CSFML_CHECK_RETURN(window, 0);

    return (sfWindowHandle)window->This.getSystemHandle();
}
 
https://github.com/SFML/CSFML/blob/3e767dec4f812116f29edbbf58803f5e40833a4a/src/SFML/Window/Window.cpp#L326 (https://github.com/SFML/CSFML/blob/3e767dec4f812116f29edbbf58803f5e40833a4a/src/SFML/Window/Window.cpp#L326)
https://github.com/SFML/SFML/blob/2d1fab374f3d7e9765fe1e83b23dfb5b7f80f012/src/SFML/Window/Window.cpp#L374
https://github.com/SFML/CSFML/blob/3e767dec4f812116f29edbbf58803f5e40833a4a/include/SFML/Window/WindowHandle.h#L47 (https://github.com/SFML/CSFML/blob/3e767dec4f812116f29edbbf58803f5e40833a4a/include/SFML/Window/WindowHandle.h#L47)

Which refers to a xcb_window_t.
https://github.com/SFML/SFML/blob/2d1fab374f3d7e9765fe1e83b23dfb5b7f80f012/src/SFML/Window/Unix/WindowImplX11.cpp#L585
https://github.com/SFML/SFML/blob/2d1fab374f3d7e9765fe1e83b23dfb5b7f80f012/src/SFML/Window/Unix/WindowImplX11.cpp#L388


But I can't get the client rect when only a xcb_window_t is provided under linux/X11. The X Display is need to retrive the client rect info.

If the X Display is provided, I can use XGetGeometry to get the client area info.

Anyway, I cannot make it when only xcb_window_t is available. :(

I'm not familiar with linux/X11, Xlib and XCB and was just beginning to dig into these problem. Yet not a native English speaker. Ask me if any can not be understood. :)

PS.
I have looked into the Window.CPointer in SFML.NET, but it is just a opaque struct used internally. Am I right?
https://github.com/SFML/CSFML/blob/3e767dec4f812116f29edbbf58803f5e40833a4a/include/SFML/Window/Types.h#L30
Title: Re: How to get clientrect position or the rect size of titlebar?
Post by: Laurent on December 30, 2015, 06:05:02 pm
You might be able to use your own Display, no need to get the one that SFML has internally.