+var windowGeometryTimeout = null;
+
+function updateBrowserWindowGeometry(win) {
+ if (win.closed)
+ return;
+
+ var surface = win.surface;
+
+ var innerW = win.innerWidth;
+ var innerH = win.innerHeight;
+
+ var x = surface.x;
+ var y = surface.y;
+ if (frameSizeX > 0) {
+ x = win.screenX + frameSizeX;
+ y = win.screenY + frameSizeY;
+ }
+
+ if (x != surface.x || y != surface.y ||
+ innerW != surface.width || innerH != surface.height) {
+ var oldX = surface.x;
+ var oldY = surface.y;
+ surface.x = x;
+ surface.y = y;
+ if (surface.width != innerW || surface.height != innerH)
+ resizeCanvas(surface.canvas, innerW, innerH);
+ surface.width = innerW;
+ surface.height = innerH;
+ sendInput ("w", [surface.id, surface.x, surface.y, surface.width, surface.height]);
+ for (id in surfaces) {
+ if (surfaces[id].transientToplevel != null && surfaces[id].transientToplevel == surface) {
+ var childSurface = surfaces[id];
+ childSurface.x += surface.x - oldX;
+ childSurface.y += surface.y - oldY;
+ sendInput ("w", [childSurface.id, childSurface.x, childSurface.y, childSurface.width, childSurface.height]);
+ }
+ }
+ }
+
+}
+
+function registerWindow(win)
+{
+ toplevelWindows.push(win);
+ win.onresize = function(ev) { updateBrowserWindowGeometry(ev.target); };
+ if (!windowGeometryTimeout)
+ windowGeometryTimeout = setInterval(function () { toplevelWindows.forEach(updateBrowserWindowGeometry); }, 2000);
+}
+
+function unregisterWindow(win)
+{
+ var i = toplevelWindows.indexOf(win);
+ if (i >= 0)
+ toplevelWindows.splice(i, 1);
+
+ if (windowGeometryTimeout && toplevelWindows.length == 0) {
+ clearInterval(windowGeometryTimeout);
+ windowGeometryTimeout = null;
+ }
+}
+