+ case PropertyNotify:
+ {
+ XPropertyEvent * event = (XPropertyEvent *) thisEvent;
+ if(event->atom == atoms[_net_frame_extents] &&
+ event->state == PropertyNewValue && window.windowData)
+ {
+ int format, len, fill;
+ Atom type;
+ char * data = null;
+
+ if(XGetWindowProperty(xGlobalDisplay, (uint)window.windowHandle,
+ atoms[_net_frame_extents], 0, 4,
+ False, XA_CARDINAL, &type, &format, &len,
+ &fill, &data) == Success && data)
+ {
+ int *extents = (int *)data;
+ XWindowData windowData = window.windowData;
+ bool hadFrameExtents = windowData.gotFrameExtents;
+ windowData.decor =
+ {
+ left = extents[0], right = extents[1],
+ top = extents[2], bottom = extents[3]
+ };
+ windowData.gotFrameExtents = true;
+ {
+ int x, y, w, h;
+ window.ComputeAnchors(
+ window.normalAnchor,
+ window.normalSizeAnchor,
+ &x, &y, &w, &h);
+ if(!hadFrameExtents) // || window.state == normal)
+ {
+ bool isMaximized = window.state == maximized;
+ window.Position(x, y, w, h, true, true, true, true, false, true);
+ UpdateRootWindow(window);
+ }
+ }
+
+ XFree(data);
+ }
+ }
+ break;
+ }