diff options
author | Mark Tiefenbruck <mark@fluxbox.org> | 2008-08-22 17:16:33 (GMT) |
---|---|---|
committer | Mark Tiefenbruck <mark@fluxbox.org> | 2008-08-22 17:16:33 (GMT) |
commit | c37a91e1504fa73da233cc59fe67ead56dbd3083 (patch) | |
tree | 4e233628bd7f8531aeaaf221be816f310dbd4a95 | |
parent | feac120f4a433d4fee947ff9cc23e170d6af95c0 (diff) | |
download | fluxbox_lack-c37a91e1504fa73da233cc59fe67ead56dbd3083.zip fluxbox_lack-c37a91e1504fa73da233cc59fe67ead56dbd3083.tar.bz2 |
be a little smarter about size hints in tabbed windows
-rw-r--r-- | src/FbWinFrame.cc | 6 | ||||
-rw-r--r-- | src/FbWinFrame.hh | 4 | ||||
-rw-r--r-- | src/Window.cc | 69 | ||||
-rw-r--r-- | src/Window.hh | 2 |
4 files changed, 51 insertions, 30 deletions
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index f6f591e..bac06d2 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -1860,8 +1860,10 @@ void FbWinFrame::SizeHints::reset(const XSizeHints &sizehint) { | |||
1860 | min_aspect_y = sizehint.min_aspect.y; | 1860 | min_aspect_y = sizehint.min_aspect.y; |
1861 | max_aspect_x = sizehint.max_aspect.x; | 1861 | max_aspect_x = sizehint.max_aspect.x; |
1862 | max_aspect_y = sizehint.max_aspect.y; | 1862 | max_aspect_y = sizehint.max_aspect.y; |
1863 | } else | 1863 | } else { |
1864 | min_aspect_x = min_aspect_y = max_aspect_x = max_aspect_y = 0; | 1864 | min_aspect_x = max_aspect_y = 0; |
1865 | min_aspect_y = max_aspect_x = 1; | ||
1866 | } | ||
1865 | 1867 | ||
1866 | if (sizehint.flags & PWinGravity) | 1868 | if (sizehint.flags & PWinGravity) |
1867 | win_gravity = sizehint.win_gravity; | 1869 | win_gravity = sizehint.win_gravity; |
diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh index d2f7a1f..7f08175 100644 --- a/src/FbWinFrame.hh +++ b/src/FbWinFrame.hh | |||
@@ -112,8 +112,8 @@ public: | |||
112 | SizeHints(): | 112 | SizeHints(): |
113 | min_width(1), max_width(0), min_height(1), max_height(0), | 113 | min_width(1), max_width(0), min_height(1), max_height(0), |
114 | width_inc(1), height_inc(1), base_width(0), base_height(0), | 114 | width_inc(1), height_inc(1), base_width(0), base_height(0), |
115 | min_aspect_x(0), max_aspect_x(0), | 115 | min_aspect_x(0), max_aspect_x(1), |
116 | min_aspect_y(0), max_aspect_y(0), | 116 | min_aspect_y(1), max_aspect_y(0), |
117 | win_gravity(0) { } | 117 | win_gravity(0) { } |
118 | 118 | ||
119 | void reset(const XSizeHints &sizehint); | 119 | void reset(const XSizeHints &sizehint); |
diff --git a/src/Window.cc b/src/Window.cc index 7dc268f..52672c0 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -1016,7 +1016,6 @@ bool FluxboxWindow::setCurrentClient(WinClient &client, bool setinput) { | |||
1016 | // frame focused doesn't necessarily mean input focused | 1016 | // frame focused doesn't necessarily mean input focused |
1017 | frame().setLabelButtonFocus(*button); | 1017 | frame().setLabelButtonFocus(*button); |
1018 | frame().setShapingClient(&client, false); | 1018 | frame().setShapingClient(&client, false); |
1019 | frame().setSizeHints(client.sizeHints()); | ||
1020 | return ret; | 1019 | return ret; |
1021 | } | 1020 | } |
1022 | 1021 | ||
@@ -1033,10 +1032,50 @@ void FluxboxWindow::associateClientWindow() { | |||
1033 | m_client->width(), m_client->height(), | 1032 | m_client->width(), m_client->height(), |
1034 | m_client->gravity(), m_client->old_bw); | 1033 | m_client->gravity(), m_client->old_bw); |
1035 | 1034 | ||
1036 | frame().setSizeHints(m_client->sizeHints()); | 1035 | updateSizeHints(); |
1037 | frame().setClientWindow(*m_client); | 1036 | frame().setClientWindow(*m_client); |
1038 | } | 1037 | } |
1039 | 1038 | ||
1039 | void FluxboxWindow::updateSizeHints() { | ||
1040 | m_size_hint = m_client->sizeHints(); | ||
1041 | |||
1042 | ClientList::const_iterator it = clientList().begin(); | ||
1043 | ClientList::const_iterator it_end = clientList().end(); | ||
1044 | for (; it != it_end; ++it) { | ||
1045 | if ((*it) == m_client) | ||
1046 | continue; | ||
1047 | |||
1048 | const FbWinFrame::SizeHints &hint = (*it)->sizeHints(); | ||
1049 | if (m_size_hint.min_width < hint.min_width) | ||
1050 | m_size_hint.min_width = hint.min_width; | ||
1051 | if (m_size_hint.max_width > hint.max_width) | ||
1052 | m_size_hint.max_width = hint.max_width; | ||
1053 | if (m_size_hint.min_height < hint.min_height) | ||
1054 | m_size_hint.min_height = hint.min_height; | ||
1055 | if (m_size_hint.max_height > hint.max_height) | ||
1056 | m_size_hint.max_height = hint.max_height; | ||
1057 | // lcm could end up a bit silly, and the situation is bad no matter what | ||
1058 | if (m_size_hint.width_inc < hint.width_inc) | ||
1059 | m_size_hint.width_inc = hint.width_inc; | ||
1060 | if (m_size_hint.height_inc < hint.height_inc) | ||
1061 | m_size_hint.height_inc = hint.height_inc; | ||
1062 | if (m_size_hint.base_width < hint.base_width) | ||
1063 | m_size_hint.base_width = hint.base_width; | ||
1064 | if (m_size_hint.base_height < hint.base_height) | ||
1065 | m_size_hint.base_height = hint.base_height; | ||
1066 | if (m_size_hint.min_aspect_x * hint.min_aspect_y > | ||
1067 | m_size_hint.min_aspect_y * hint.min_aspect_x) { | ||
1068 | m_size_hint.min_aspect_x = hint.min_aspect_x; | ||
1069 | m_size_hint.min_aspect_y = hint.min_aspect_y; | ||
1070 | } | ||
1071 | if (m_size_hint.max_aspect_x * hint.max_aspect_y > | ||
1072 | m_size_hint.max_aspect_y * hint.max_aspect_x) { | ||
1073 | m_size_hint.max_aspect_x = hint.max_aspect_x; | ||
1074 | m_size_hint.max_aspect_y = hint.max_aspect_y; | ||
1075 | } | ||
1076 | } | ||
1077 | frame().setSizeHints(m_size_hint); | ||
1078 | } | ||
1040 | 1079 | ||
1041 | void FluxboxWindow::grabButtons() { | 1080 | void FluxboxWindow::grabButtons() { |
1042 | 1081 | ||
@@ -1208,32 +1247,10 @@ void FluxboxWindow::moveResizeForClient(int new_x, int new_y, | |||
1208 | } | 1247 | } |
1209 | 1248 | ||
1210 | void FluxboxWindow::getMaxSize(unsigned int* width, unsigned int* height) const { | 1249 | void FluxboxWindow::getMaxSize(unsigned int* width, unsigned int* height) const { |
1211 | |||
1212 | if (!width || !height) | ||
1213 | return; | ||
1214 | |||
1215 | ClientList::const_iterator it = clientList().begin(); | ||
1216 | ClientList::const_iterator it_end = clientList().end(); | ||
1217 | |||
1218 | unsigned int w; | ||
1219 | unsigned int h; | ||
1220 | |||
1221 | w = h = 0; // unlimited | ||
1222 | |||
1223 | for (; it != it_end; ++it) { | ||
1224 | // special case for max height/width == 0 | ||
1225 | // 0 indicates unlimited size, so we skip them | ||
1226 | if (!h || ((*it)->maxHeight() && h > (*it)->maxHeight())) | ||
1227 | h = (*it)->maxHeight(); | ||
1228 | if (!w || ((*it)->maxWidth() && w > (*it)->maxWidth())) | ||
1229 | w = (*it)->maxWidth(); | ||
1230 | } | ||
1231 | |||
1232 | if (width) | 1250 | if (width) |
1233 | *width = w; | 1251 | *width = m_size_hint.max_width; |
1234 | |||
1235 | if (height) | 1252 | if (height) |
1236 | *height = h; | 1253 | *height = m_size_hint.max_height; |
1237 | } | 1254 | } |
1238 | 1255 | ||
1239 | // returns whether the focus was "set" to this window | 1256 | // returns whether the focus was "set" to this window |
diff --git a/src/Window.hh b/src/Window.hh index 16d5bc9..89cbc69 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -491,6 +491,7 @@ private: | |||
491 | 491 | ||
492 | bool getState(); | 492 | bool getState(); |
493 | void updateMWMHintsFromClient(WinClient &client); | 493 | void updateMWMHintsFromClient(WinClient &client); |
494 | void updateSizeHints(); | ||
494 | void associateClientWindow(); | 495 | void associateClientWindow(); |
495 | 496 | ||
496 | void setState(unsigned long stateval, bool setting_up); | 497 | void setState(unsigned long stateval, bool setting_up); |
@@ -552,6 +553,7 @@ private: | |||
552 | typedef std::map<WinClient *, IconButton *> Client2ButtonMap; | 553 | typedef std::map<WinClient *, IconButton *> Client2ButtonMap; |
553 | Client2ButtonMap m_labelbuttons; | 554 | Client2ButtonMap m_labelbuttons; |
554 | 555 | ||
556 | FbWinFrame::SizeHints m_size_hint; | ||
555 | struct _decorations { | 557 | struct _decorations { |
556 | bool titlebar, handle, border, iconify, | 558 | bool titlebar, handle, border, iconify, |
557 | maximize, close, menu, sticky, shade, tab, enabled; | 559 | maximize, close, menu, sticky, shade, tab, enabled; |