all repos — fluxbox @ 81378f9494db4ab1d033947532d7fac968095ecd

custom fork of the fluxbox windowmanager

fix handling of base_Width/height hints in wm_normal_hints
- fixes abiword resize issues
rathnor rathnor
commit

81378f9494db4ab1d033947532d7fac968095ecd

parent

15dfe811124e3f1be7d9a802290372427dae5afb

5 files changed, 94 insertions(+), 55 deletions(-)

jump to
M ChangeLogChangeLog

@@ -1,6 +1,9 @@

(Format: Year/Month/Day) Changes for 0.9.6: *03/09/29: + * Fix resize calculations, particularly wrt base_width/height (Simon) + - fixes abiword resize issues + Window.hh/cc WinClient.hh/cc * Nearest-quadrant resizing (Thanks Mathias Gumz) Window.hh/cc Screen.hh/cc FbWinFrameTheme.hh/cc * Update from Han
M src/WinClient.ccsrc/WinClient.cc

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: WinClient.cc,v 1.27 2003/09/24 14:02:25 rathnor Exp $ +// $Id: WinClient.cc,v 1.28 2003/09/29 14:58:15 rathnor Exp $ #include "WinClient.hh"

@@ -43,7 +43,7 @@ transient_for(0),

window_group(0), x(0), y(0), old_bw(0), min_width(1), min_height(1), - max_width(1), max_height(1), + max_width(0), max_height(0), width_inc(1), height_inc(1), min_aspect_x(1), min_aspect_y(1), max_aspect_x(1), max_aspect_y(1),

@@ -434,8 +434,23 @@

if (sizehint.flags & PMinSize) { min_width = sizehint.min_width; min_height = sizehint.min_height; - } else + if (!(sizehint.flags & PBaseSize)) { + base_width = min_width; + base_height = min_height; + } + } else { min_width = min_height = 1; + base_width = base_height = 0; + } + + if (sizehint.flags & PBaseSize) { + base_width = sizehint.base_width; + base_height = sizehint.base_height; + if (!(sizehint.flags & PMinSize)) { + min_width = base_width; + min_height = base_height; + } + } // default set in PMinSize if (sizehint.flags & PMaxSize) { max_width = sizehint.max_width;

@@ -459,12 +474,6 @@ max_aspect_y = sizehint.max_aspect.y;

} else min_aspect_x = min_aspect_y = max_aspect_x = max_aspect_y = 1; - - if (sizehint.flags & PBaseSize) { - base_width = sizehint.base_width; - base_height = sizehint.base_height; - } else - base_width = base_height = 0; if (sizehint.flags & PWinGravity) m_win_gravity = sizehint.win_gravity;

@@ -605,3 +614,48 @@ cerr<<"Warning: Failed to read WM Protocols. "<<endl;

} } + + +/** + * Changes width and height to the nearest (lower) value + * that conforms to it's size hints. + * + * display_* give the values that would be displayed + * to the user when resizing. + * We use pointers for display_* since they are optional. + * + * See ICCCM section 4.1.2.3 + */ +void WinClient::applySizeHints(int &width, int &height, + int *display_width, int *display_height) { + + int i = width, j = height; + + // Check minimum size + if (width < 0 || width < min_width) + width = min_width; + + if (height < 0 || height < min_height) + height = min_height; + + // Check maximum size + if (max_width > 0 && width > max_width) + width = max_width; + + if (max_height > 0 && height > max_height) + height = max_height; + + // enforce incremental size limits, wrt base size + // only calculate this if we really need to + i = (width - base_width) / width_inc; + width = i*width_inc + base_width; + + j = (height - base_height) / height_inc; + height = j*height_inc + base_height; + + if (display_width) + *display_width = i; + + if (display_height) + *display_height = j; +}
M src/WinClient.hhsrc/WinClient.hh

@@ -19,7 +19,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: WinClient.hh,v 1.14 2003/09/21 12:49:48 rathnor Exp $ +// $Id: WinClient.hh,v 1.15 2003/09/29 14:58:15 rathnor Exp $ #ifndef WINCLIENT_HH #define WINCLIENT_HH

@@ -101,6 +101,16 @@ void updateBlackboxHints();

void updateMWMHints(); void updateWMHints(); void updateWMNormalHints(); + + /** + * Changes width and height to the nearest (lower) value + * that conforms to it's size hints. + * + * display_* give the values that would be displayed + * to the user when resizing. + * We use pointers for display_* since they are optional. + */ + void applySizeHints(int &width, int &height, int *display_width = 0, int *display_height = 0); // grouping is tracked by remembering the window to the left in the group Window getGroupLeftWindow() const;
M src/Window.ccsrc/Window.cc

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Window.cc,v 1.235 2003/09/29 12:53:58 rathnor Exp $ +// $Id: Window.cc,v 1.236 2003/09/29 14:58:15 rathnor Exp $ #include "Window.hh"

@@ -2437,11 +2437,11 @@ }

fixsize(&gx, &gy); - // draw resize rectangle - parent().drawRectangle(screen().rootTheme().opGC(), - m_last_resize_x, m_last_resize_y, - m_last_resize_w - 1 + 2 * frame().window().borderWidth(), - m_last_resize_h - 1 + 2 * frame().window().borderWidth()); + // draw resize rectangle + parent().drawRectangle(screen().rootTheme().opGC(), + m_last_resize_x, m_last_resize_y, + m_last_resize_w - 1 + 2 * frame().window().borderWidth(), + m_last_resize_h - 1 + 2 * frame().window().borderWidth()); if (screen().doShowWindowPos()) screen().showGeometry(gx, gy);

@@ -3166,7 +3166,7 @@

} -void FluxboxWindow::fixsize(int *gx, int *gy) { +void FluxboxWindow::fixsize(int *user_w, int *user_h) { int titlebar_height = (decorations.titlebar ? frame().titlebar().height() + frame().titlebar().borderWidth() : 0);

@@ -3177,49 +3177,20 @@ int decoration_height = titlebar_height + handle_height;

// dx is new width = current width + difference between new and old x values //int dx = frame().width() + frame().x() - m_last_resize_x; - int dx = m_last_resize_w - m_client->base_width; + int dw = m_last_resize_w; // dy = new height (w/o decorations), similarly - int dy = m_last_resize_h - m_client->base_height - decoration_height; + int dh = m_last_resize_h - decoration_height; - // check minimum size - if (dx < static_cast<signed int>(m_client->min_width)) - dx = m_client->min_width; - if (dy < static_cast<signed int>(m_client->min_height)) - dy = m_client->min_height; - - // check maximum size - if (m_client->max_width > 0 && dx > static_cast<signed int>(m_client->max_width)) - dx = m_client->max_width; - if (m_client->max_height > 0 && dy > static_cast<signed int>(m_client->max_height)) - dy = m_client->max_height; - - // make sure we have valid increment - if (m_client->width_inc == 0) - m_client->width_inc = 1; - if (m_client->height_inc == 0) - m_client->height_inc = 1; - - // set snapping - dx /= m_client->width_inc; - dy /= m_client->height_inc; - - // set return values - if (gx != 0) - *gx = dx; - if (gy != 0) - *gy = dy; - - // snapping - dx = dx * m_client->width_inc + m_client->base_width; - dy = dy * m_client->height_inc + m_client->base_height + decoration_height; + m_client->applySizeHints(dw, dh, user_w, user_h); // update last resize - m_last_resize_w = dx; - m_last_resize_h = dy; + m_last_resize_w = dw; + m_last_resize_h = dh + decoration_height; + // move X if necessary if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM) { - m_last_resize_x = frame().x() + frame().width() - m_last_resize_w; + m_last_resize_x = frame().x() + frame().width() - m_last_resize_w; } if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP) {
M src/Window.hhsrc/Window.hh

@@ -22,7 +22,7 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Window.hh,v 1.96 2003/09/29 12:53:58 rathnor Exp $ +// $Id: Window.hh,v 1.97 2003/09/29 14:58:15 rathnor Exp $ #ifndef WINDOW_HH #define WINDOW_HH

@@ -398,7 +398,8 @@ void downsize();

// modifies left and top if snap is necessary void doSnapping(int &left, int &top); - void fixsize(int *x = 0, int *y = 0); + // user_w/h return the values that should be shown to the user + void fixsize(int *user_w = 0, int *user_h = 0); void resizeClient(WinClient &client, unsigned int width, unsigned int height); /// sends configurenotify to all clients void sendConfigureNotify(bool send_to_netizens = true);