]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/x11/window.cpp
Track the currently focused window in Display
[libs/gui.git] / source / graphics / x11 / window.cpp
index 9b46e4e16593cfe4abe1e760d2cdf832a4593d26..7513d3ffb14ebb958efe5e7d9b33a9f65e0482e4 100644 (file)
@@ -32,11 +32,11 @@ void Window::platform_init()
 
        XSetWindowAttributes attr;
        attr.override_redirect = options.fullscreen;
-       attr.event_mask = ButtonPressMask|ButtonReleaseMask|PointerMotionMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask|EnterWindowMask|ExposureMask;
+       attr.event_mask = ButtonPressMask|ButtonReleaseMask|PointerMotionMask|KeyPressMask|KeyReleaseMask|StructureNotifyMask|EnterWindowMask|ExposureMask|FocusChangeMask;
 
        priv->window = XCreateWindow(dpy,
                display.get_private().root_window,
-               0, 0,
+               0, 0,    // User position is set when the window is mapped
                options.width, options.height,
                0,
                CopyFromParent,
@@ -112,6 +112,8 @@ void Window::platform_reconfigure(bool fullscreen_changed)
 
        if(options.fullscreen)
                XMoveResizeWindow(dpy, priv->window, 0, 0, options.width, options.height);
+       else if(options.user_position)
+               XMoveResizeWindow(dpy, priv->window, options.x, options.y, options.width, options.height);
        else
                XResizeWindow(dpy, priv->window, options.width, options.height);
 
@@ -160,7 +162,10 @@ void Window::platform_set_touch_input()
 
 void Window::platform_show()
 {
-       XMapRaised(display.get_private().display, priv->window);
+       DisplayHandle dpy = display.get_private().display;
+       XMapRaised(dpy, priv->window);
+       if(options.user_position)
+               XMoveWindow(dpy, priv->window, options.x, options.y);
 }
 
 void Window::platform_hide()
@@ -212,10 +217,11 @@ bool Window::event(const Event &evnt)
                                y -= priv->rel_y;
                        }
 
-                       if(x!=options.x || y!=options.y)
+                       if((x==options.x && y==options.y) == moving)
                        {
                                options.x = x;
                                options.y = y;
+                               moving = false;
                                signal_move.emit(options.x, options.y);
                        }
                }
@@ -244,6 +250,12 @@ bool Window::event(const Event &evnt)
        case Expose:
                signal_expose.emit(ev.xexpose.x, ev.xexpose.y, ev.xexpose.width, ev.xexpose.height, evnt);
                break;
+       case FocusIn:
+               signal_got_focus.emit();
+               break;
+       case FocusOut:
+               signal_lost_focus.emit();
+               break;
        default:
                return false;
        }