From a9bd5b50e9b77b8b360dd3620013a320733139aa Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Fri, 17 Nov 2023 18:56:13 +0900 Subject: Fix unwanted window resizing. This resolves issue TDE/tde#57. Some applications (like xfce4-terminal) try to manage their sizes by requesting the window manager a different size. The WM responds by resizing the window and the application tries once again to adjust its own size. This can lead to a repeated loop of request-resize which results in the application window to either shrink to the minimum allowed size or expand to the display size. Signed-off-by: Michele Calgaro --- twin/client.cpp | 9 +++++++++ twin/client.h | 2 ++ twin/events.cpp | 2 +- twin/geometry.cpp | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/twin/client.cpp b/twin/client.cpp index 74bee8535..d76dda619 100644 --- a/twin/client.cpp +++ b/twin/client.cpp @@ -128,6 +128,9 @@ Client::Client( Workspace *ws ) autoRaiseTimer = 0; shadeHoverTimer = 0; + configureRequestTimer = new TQTimer(this); + connect(configureRequestTimer, TQT_SIGNAL(timeout()), TQT_SLOT(configureRequestTimeout())); + shadowDelayTimer = new TQTimer(this); opacityCache = &activeOpacityCache; shadowAfterClient = NULL; @@ -969,6 +972,12 @@ void Client::setShade( ShadeMode mode ) updateWindowRules(); } +void Client::configureRequestTimeout() + { + moveResizeMode = false; + sendSyntheticConfigureNotify(); + } + void Client::shadeHover() { setShade( ShadeHover ); diff --git a/twin/client.h b/twin/client.h index 98ff68c1a..00703608d 100644 --- a/twin/client.h +++ b/twin/client.h @@ -339,6 +339,7 @@ class Client : public TQObject, public KDecorationDefines private slots: void autoRaise(); void shadeHover(); + void configureRequestTimeout(); void shortcutActivated(); void updateOpacityCache(); @@ -558,6 +559,7 @@ class Client : public TQObject, public KDecorationDefines WinInfo* info; TQTimer* autoRaiseTimer; TQTimer* shadeHoverTimer; + TQTimer* configureRequestTimer; Colormap cmap; TQCString resource_name; TQCString resource_class; diff --git a/twin/events.cpp b/twin/events.cpp index 8660f8776..ff0cc8e7c 100644 --- a/twin/events.cpp +++ b/twin/events.cpp @@ -818,7 +818,7 @@ void Client::configureRequestEvent( XConfigureRequestEvent* e ) restackWindow( e->above, e->detail, NET::FromApplication, userTime(), false ); // TODO sending a synthetic configure notify always is fine, even in cases where - // the ICCCM doesn't require this - it can be though of as 'the WM decided to move + // the ICCCM doesn't require this - it can be thought of as 'the WM decided to move // the window later'. The client should not cause that many configure request, // so this should not have any significant impact. With user moving/resizing // the it should be optimized though (see also Client::setGeometry()/plainResize()/move()). diff --git a/twin/geometry.cpp b/twin/geometry.cpp index 8d08a502c..65285cab6 100644 --- a/twin/geometry.cpp +++ b/twin/geometry.cpp @@ -1451,6 +1451,8 @@ const TQPoint Client::calculateGravitation( bool invert, int gravity ) const void Client::configureRequest( int value_mask, int rx, int ry, int rw, int rh, int gravity, bool from_tool ) { + moveResizeMode = true; + configureRequestTimer->start(100, true); if( gravity == 0 ) // default (nonsense) value for the argument gravity = xSizeHint.win_gravity; if( value_mask & ( CWX | CWY )) -- cgit v1.2.1