all repos — openbox @ 3f784100ab51dce9e33652a9dd867140dd04a4aa

openbox fork - make it a bit more like ryudo

support the aspect ratio hints in the WMNormalHints
Dana Jansens danakj@orodu.net
commit

3f784100ab51dce9e33652a9dd867140dd04a4aa

parent

25b85266038c2e9d240a19a0b17c00c77fbf7fcb

2 files changed, 46 insertions(+), 10 deletions(-)

jump to
M src/client.ccsrc/client.cc

@@ -23,6 +23,8 @@ #include "gettext.h"

#define _(str) gettext(str) } +#include <algorithm> + namespace ob { Client::Client(int screen, Window window)

@@ -197,6 +199,11 @@ Func_Shade;

if (_delete_window) { _decorations |= Decor_Close; _functions |= Func_Close; + } + + if (_min_size.x() > _max_size.x() || _min_size.y() > _max_size.y()) { + _decorations &= ~Decor_Maximize; + _functions &= ~(Func_Resize | Func_Maximize); } switch (_type) {

@@ -418,6 +425,8 @@ long ret;

int oldgravity = _gravity; // defaults + _min_ratio = 0.0; + _max_ratio = 0.0; _size_inc.setPoint(1, 1); _base_size.setPoint(0, 0); _min_size.setPoint(0, 0);

@@ -443,6 +452,11 @@ _area.setPos(x, y);

} } + if (size.flags & PAspect) { + if (size.min_aspect.y) _min_ratio = size.min_aspect.x/size.min_aspect.y; + if (size.max_aspect.y) _max_ratio = size.max_aspect.x/size.max_aspect.y; + } + if (size.flags & PMinSize) _min_size.setPoint(size.min_width, size.min_height);

@@ -497,7 +511,7 @@ (long)_window, _urgent ? "ON" : "OFF");

#endif // fire the urgent callback if we're mapped, otherwise, wait until after // we're mapped - if (_urgent && frame) + if (frame) fireUrgent(); } }

@@ -634,9 +648,10 @@ break;

} } - if (e.atom == XA_WM_NORMAL_HINTS) + if (e.atom == XA_WM_NORMAL_HINTS) { updateNormalHints(); - else if (e.atom == XA_WM_HINTS) + setupDecorAndFunctions(); // normal hints can make a window non-resizable + } else if (e.atom == XA_WM_HINTS) updateWMHints(); else if (e.atom == XA_WM_TRANSIENT_FOR) { updateTransientFor();

@@ -980,7 +995,8 @@ internal_resize(anchor, w, h);

} -void Client::internal_resize(Corner anchor, int w, int h, int x, int y) +void Client::internal_resize(Corner anchor, int w, int h, bool user, + int x, int y) { w -= _base_size.x(); h -= _base_size.y();

@@ -990,14 +1006,21 @@ // direction.

w += _size_inc.x() / 2; h += _size_inc.y() / 2; - // is the window resizable? if it is not, then don't check its sizes, the - // client can do what it wants and the user can't change it anyhow - if (_min_size.x() <= _max_size.x() && _min_size.y() <= _max_size.y()) { + if (user) { + // if this is a user-requested resize, then check against min/max sizes + // and aspect ratios + // smaller than min size or bigger than max size? if (w < _min_size.x()) w = _min_size.x(); else if (w > _max_size.x()) w = _max_size.x(); if (h < _min_size.y()) h = _min_size.y(); else if (h > _max_size.y()) h = _max_size.y(); + + // adjust the height ot match the width for the aspect ratios + if (_min_ratio) + if (h * _min_ratio > w) h = static_cast<int>(w / _min_ratio); + if (_max_ratio) + if (h * _max_ratio < w) h = static_cast<int>(w / _max_ratio); } // keep to the increments

@@ -1404,9 +1427,9 @@ // if moving AND resizing ...

if (e.value_mask & (CWX | CWY)) { int x = (e.value_mask & CWX) ? e.x : _area.x(); int y = (e.value_mask & CWY) ? e.y : _area.y(); - internal_resize(corner, w, h, x, y); + internal_resize(corner, w, h, false, x, y); } else // if JUST resizing... - internal_resize(corner, w, h); + internal_resize(corner, w, h, false); } else if (e.value_mask & (CWX | CWY)) { // if JUST moving... int x = (e.value_mask & CWX) ? e.x : _area.x(); int y = (e.value_mask & CWY) ? e.y : _area.y();
M src/client.hhsrc/client.hh

@@ -236,6 +236,17 @@ but needs to restore it afterwards, so it is saved here.

*/ int _border_width; + //! The minimum aspect ratio the client window can be sized to. + /*! + A value of 0 means this is ignored. + */ + float _min_ratio; + //! The maximum aspect ratio the client window can be sized to. + /*! + A value of 0 means this is ignored. + */ + float _max_ratio; + //! The minimum size of the client window /*! If the min is > the max, then the window is not resizable

@@ -429,6 +440,8 @@ This also maintains things like the client's minsize, and size increments.

@param anchor The corner to keep in the same position when resizing. @param w The width component of the new size for the client. @param h The height component of the new size for the client. + @param user Specifies whether this is a user-requested change or a + program requested change. @param x An optional X coordinate to which the window will be moved after resizing. @param y An optional Y coordinate to which the window will be moved

@@ -436,7 +449,7 @@ after resizing.

The x and y coordinates must both be sepcified together, or they will have no effect. When they are specified, the anchor is ignored. */ - void internal_resize(Corner anchor, int w, int h, + void internal_resize(Corner anchor, int w, int h, bool user = true, int x = INT_MIN, int y = INT_MIN); public: