From 8f6434efa67b2f11548c9862aaa0d29488645500 Mon Sep 17 00:00:00 2001
From: markt <markt>
Date: Tue, 3 Jul 2007 21:09:05 +0000
Subject: stop gvim from repeatedly resizing tabbed windows

---
 src/FbTk/FbPixmap.cc   | 15 ++++++++-------
 src/FbTk/FbWindow.cc   |  8 ++++----
 src/WinClient.cc       | 25 +++++++++++++++++++++++++
 src/WinClient.hh       |  2 +-
 src/Window.cc          |  9 +++++++++
 util/fluxbox-remote.cc | 20 ++++++++++++++------
 6 files changed, 61 insertions(+), 18 deletions(-)

diff --git a/src/FbTk/FbPixmap.cc b/src/FbTk/FbPixmap.cc
index 9143232..0289ddd 100644
--- a/src/FbTk/FbPixmap.cc
+++ b/src/FbTk/FbPixmap.cc
@@ -114,13 +114,14 @@ FbPixmap &FbPixmap::operator = (Pixmap pm) {
     Window root;
     int x, y;
     unsigned int border_width, bpp;
-    XGetGeometry(display(),
-                 pm,
-                 &root,
-                 &x, &y,
-                 &m_width, &m_height,
-                 &border_width,
-                 &bpp);
+    if (!XGetGeometry(display(),
+                      pm,
+                      &root,
+                      &x, &y,
+                      &m_width, &m_height,
+                      &border_width,
+                      &bpp))
+        return *this;
 
     m_depth = bpp;
 
diff --git a/src/FbTk/FbWindow.cc b/src/FbTk/FbWindow.cc
index 3dce5b8..2c2bb24 100644
--- a/src/FbTk/FbWindow.cc
+++ b/src/FbTk/FbWindow.cc
@@ -582,10 +582,10 @@ void FbWindow::updateGeometry() {
 
     Window root;
     unsigned int border_width, depth;
-    XGetGeometry(display(), m_window, &root, &m_x, &m_y,
-                 (unsigned int *)&m_width, (unsigned int *)&m_height,
-                 &border_width, &depth);
-    m_depth = depth;
+    if (XGetGeometry(display(), m_window, &root, &m_x, &m_y,
+                     (unsigned int *)&m_width, (unsigned int *)&m_height,
+                     &border_width, &depth))
+        m_depth = depth;
 }
 
 void FbWindow::create(Window parent, int x, int y,
diff --git a/src/WinClient.cc b/src/WinClient.cc
index ddf0599..a9d5865 100644
--- a/src/WinClient.cc
+++ b/src/WinClient.cc
@@ -905,6 +905,31 @@ void WinClient::applySizeHints(int &width, int &height,
         *display_height = j;
 }
 
+// check if the given width and height satisfy the size hints
+bool WinClient::checkSizeHints(unsigned int width, unsigned int height) {
+    if (width < min_width || height < min_height)
+        return false;
+
+    if (width > max_width || height > max_height)
+        return false;
+
+    if ((width - base_width) % width_inc != 0)
+        return false;
+
+    if ((height - base_height) % height_inc != 0)
+        return false;
+
+    double ratio = (double)width / (double)height;
+
+    if (min_aspect_y > 0 && (double)min_aspect_x / (double)min_aspect_y > ratio)
+        return false;
+
+    if (max_aspect_y > 0 && (double)max_aspect_x / (double)max_aspect_y < ratio)
+        return false;
+
+    return true;
+}
+
 void WinClient::removeTransientFromWaitingList() {
 
     // holds the windows that dont have empty
diff --git a/src/WinClient.hh b/src/WinClient.hh
index d3555d1..9c29e78 100644
--- a/src/WinClient.hh
+++ b/src/WinClient.hh
@@ -93,7 +93,7 @@ public:
      */
     void applySizeHints(int &width, int &height, int *display_width = 0,
             int *display_height = 0, bool maximizing = false);
-
+    bool checkSizeHints(unsigned int width, unsigned int height);
 
     void setGroupLeftWindow(Window win);
 
diff --git a/src/Window.cc b/src/Window.cc
index e9d57c2..632c1e7 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -2570,6 +2570,15 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) {
     int cx = frame().x(), cy = frame().y(), ignore = 0;
     unsigned int cw = frame().width(), ch = frame().height();
 
+    // if this is not m_client and m_client has resize_inc, make sure the new
+    // size would be ok with m_client
+    if (client != m_client && cr.value_mask & CWWidth &&
+        cr.value_mask & CWHeight &&
+        !m_client->checkSizeHints(cr.width, cr.height)) {
+        sendConfigureNotify();
+        return;
+    }
+
     if (cr.value_mask & CWBorderWidth)
         client->old_bw = cr.border_width;
 
diff --git a/util/fluxbox-remote.cc b/util/fluxbox-remote.cc
index eb7a413..67c2193 100644
--- a/util/fluxbox-remote.cc
+++ b/util/fluxbox-remote.cc
@@ -24,15 +24,21 @@
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
 
 int main(int argc, char **argv) {
 
-    if (argc <= 1)
-        return 1;
+    if (argc <= 1) {
+        printf("fluxbox-remote <fluxbox-command>\n");
+        return EXIT_SUCCESS;
+    }
 
     Display *disp = XOpenDisplay(NULL);
-    if (!disp)
-        return 1;
+    if (!disp) {
+        perror("error, can't open display.");
+        return EXIT_FAILURE;
+    }
 
     Atom fbcmd_atom = XInternAtom(disp, "_FLUXBOX_COMMAND", False);
     Window root = DefaultRootWindow(disp);
@@ -44,6 +50,8 @@ int main(int argc, char **argv) {
     XCloseDisplay(disp);
 
     if (ret == Success)
-        return 0;
-    return 1;
+        return EXIT_SUCCESS;
+
+    return EXIT_FAILURE;
 }
+
-- 
cgit v0.11.2