When those apps go fullscreen, they turn off some widgets, thus
decreasing minimum window size. And it seems like icewm can't properly
handle this change for fullscreen windows, so after switching back it
uses "bad" hints.

Working patch attached.
It saves size hints before going fullscreen and restores them back after
leaving fullscreen. I don't know if this is a proper way to handle
this (spotted this trick in lwm), but it seems to be working fine for me.

Apply in `src` directory.
Done for icewm 1.2.37-1, applies to icewm_1.2.37+1.3.4pre2-4 cleanly.
diff -r d584d305656c -r a1ad5efdfa3f wmclient.cc
--- a/wmclient.cc	Sun May 03 19:42:28 2009 +0700
+++ b/wmclient.cc	Fri Oct 09 20:17:07 2009 +0700
@@ -863,6 +863,15 @@
     if (fMwmHints)
         *fMwmHints = mwm;
 }
+
+void YFrameClient::saveSizeHints()
+{
+    memcpy(&savedSizeHints, fSizeHints, sizeof(XSizeHints));
+};
+void YFrameClient::restoreSizeHints() {
+    memcpy(fSizeHints, &savedSizeHints, sizeof(XSizeHints));
+};
+
 
 long YFrameClient::mwmFunctions() {
     long functions = ~0U;
diff -r d584d305656c -r a1ad5efdfa3f wmclient.h
--- a/wmclient.h	Sun May 03 19:42:28 2009 +0700
+++ b/wmclient.h	Fri Oct 09 20:17:07 2009 +0700
@@ -94,6 +94,11 @@
 
     void getSizeHints();
     XSizeHints *sizeHints() const { return fSizeHints; }
+    
+    // for going fullscreen and back
+    XSizeHints savedSizeHints;
+    void saveSizeHints();
+    void restoreSizeHints();
 
     unsigned long protocols() const { return fProtocols; }
     void getProtocols(bool force);
diff -r d584d305656c -r a1ad5efdfa3f wmframe.cc
--- a/wmframe.cc	Sun May 03 19:42:28 2009 +0700
+++ b/wmframe.cc	Fri Oct 09 20:17:07 2009 +0700
@@ -3129,6 +3129,17 @@
     //if (fNewState == fOldState)
     //    return ;
 
+    if ((fOldState ^ fNewState) & WinStateFullscreen) {
+        if ((fNewState & WinStateFullscreen)) {
+            // going fullscreen
+            client()->saveSizeHints();
+        }
+        else {
+            // going back
+            client()->restoreSizeHints();
+        }
+    }
+    
     // !!! move here
 
     fWinState = fNewState;

Reply via email to