Welcome, Guest. Please login or register. Did you miss your activation email?

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - zwcloud

Pages: [1]
1
Window / Re: How to get clientrect position or the rect size of titlebar?
« 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

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/SFML/blob/2d1fab374f3d7e9765fe1e83b23dfb5b7f80f012/src/SFML/Window/Window.cpp#L374
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

2
https://gist.github.com/zwcloud/0c0e9f52d8010e1d5164

using System;
using SFML.System;
using SFML.Window;

namespace DragableWindow
{
    class DragableWindow : Window
    {
        private Vector2i grabbedOffset;
        private bool grabbedWindow;

        private void WindowOnClosed(object sender, EventArgs eventArgs)
        {
            Window window = (Window)sender;
            window.Close();
        }

        private void OnMouseButtonPressed(object sender, MouseButtonEventArgs e)
        {
            Window window = (Window)sender;
            if (e.Button == Mouse.Button.Left)
            {
                grabbedOffset = window.Position - Mouse.GetPosition();
                grabbedWindow = true;
            }
        }

        private void OnMouseMoved(object sender, MouseMoveEventArgs e)
        {
            Window window = (Window)sender;
            if (grabbedWindow)
            {
                var position = Mouse.GetPosition();
                var newPosition = position + grabbedOffset;
                if (window.Position != newPosition)
                {
                    window.Position = newPosition;
                    System.Diagnostics.Debug.WriteLine("offset: {0}, position: {1}", grabbedOffset, window.Position);
                }
            }
        }

        private void OnMouseButtonReleased(object sender, MouseButtonEventArgs e)
        {
            if (e.Button == Mouse.Button.Left)
            {
                grabbedWindow = false;
            }
        }

        public DragableWindow(VideoMode mode, string title, Styles style) : base(mode, title, style)
        {
            this.Closed += WindowOnClosed;
            this.MouseButtonPressed += OnMouseButtonPressed;
            this.MouseMoved += OnMouseMoved;
            this.MouseButtonReleased += OnMouseButtonReleased;
        }
    }


    static class Program
    {
        [STAThread]
        public static void Main()
        {
            Window window = new DragableWindow(new VideoMode(512, 512), "SFML Dragable Window", Styles.None);

            // Start game loop
            while (window.IsOpen)
            {
                // Process events
                window.DispatchEvents();

                // Display the rendered frame on screen
                window.Display();
            }
        }

    }
}
 

3
Window / Re: How to get clientrect position or the rect size of titlebar?
« 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.

4
Window / How to get clientrect position or the rect size of titlebar?
« 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.

Pages: [1]