]> git.tdb.fi Git - libs/gui.git/blobdiff - source/window.cpp
Support reconfiguring Windows on the fly
[libs/gui.git] / source / window.cpp
index f867faf6e58e3a775c08248f943eb17c1159b71e..f916d1c9e5312e4290d40224e076b0e9e776b5e1 100644 (file)
@@ -48,6 +48,9 @@ Window::~Window()
                XDestroyWindow(display.get_display(), window);
 
        display.remove_window(this);
+
+       if(options.fullscreen)
+               display.restore_mode();
 }
 
 void Window::set_title(const string &title)
@@ -62,6 +65,31 @@ void Window::set_title(const string &title)
        display.check_error();
 }
 
+void Window::reconfigure(const WindowOptions &opts)
+{
+       bool fullscreen_changed=(opts.fullscreen!=options.fullscreen);
+
+       options=opts;
+
+       ::Display *dpy=display.get_display();
+
+       XMoveResizeWindow(dpy, window, 0, 0, options.width, options.height);
+
+       if(fullscreen_changed)
+       {
+               hide();
+               XSetWindowAttributes attr;
+               attr.override_redirect=options.fullscreen;
+               XChangeWindowAttributes(dpy, window, CWOverrideRedirect, &attr);
+               show();
+       }
+
+       if(options.fullscreen)
+               display.set_mode(VideoMode(options.width, options.height));
+       else if(fullscreen_changed)
+               display.restore_mode();
+}
+
 void Window::show()
 {
        XMapRaised(display.get_display(), window);
@@ -88,6 +116,12 @@ void Window::init()
 
        XSetWMProtocols(dpy, window, &wm_delete_window, 1);
 
+       if(options.fullscreen)
+       {
+               display.set_mode(VideoMode(options.width, options.height));
+               XWarpPointer(dpy, None, window, 0, 0, 0, 0, options.width/2, options.height/2);
+       }
+
        display.add_window(this);
        display.check_error();
 }
@@ -128,6 +162,10 @@ void Window::event(const XEvent &ev)
        case EnterNotify:
                XSetInputFocus(display.get_display(), window, RevertToParent, CurrentTime);
                break;
+       case MapNotify:
+               if(options.fullscreen)
+                       XGrabPointer(display.get_display(), window, true, None, GrabModeAsync, GrabModeAsync, window, None, CurrentTime);
+               break;
        default:;
        }
 }