diff options
author | Mark Tiefenbruck <mark@fluxbox.org> | 2021-07-06 22:56:26 (GMT) |
---|---|---|
committer | Mark Tiefenbruck <mark@fluxbox.org> | 2021-07-06 22:56:26 (GMT) |
commit | b0663bc167f34b9796f98406329317f7bee15b00 (patch) | |
tree | 24e59202b08ab96d7539f56d14aeb15617739658 | |
parent | f76720d918d1a2c72811a6ec5b3a1fc4b52f768c (diff) | |
download | fluxbox-b0663bc167f34b9796f98406329317f7bee15b00.zip fluxbox-b0663bc167f34b9796f98406329317f7bee15b00.tar.bz2 |
Patch from Bo Simonsen.
Max size per client (setMaxSizePerClient) was computed for
iconbar.alignment = Relative not taking into account that a fixed size
can be given when iconbar.alignment = Left/Right.
In a "recent" change, relative alignment was changed, to better handle
items with long titles. This is breaking existing behavior, the new
behavior is (with this commit) now denoted RelativeSmart.
-rw-r--r-- | doc/fluxbox.1.in | 5 | ||||
-rw-r--r-- | nls/fluxbox-nls.hh | 1 | ||||
-rw-r--r-- | src/FbTk/Container.cc | 7 | ||||
-rw-r--r-- | src/FbTk/Container.hh | 2 | ||||
-rw-r--r-- | src/IconbarTool.cc | 31 | ||||
-rw-r--r-- | src/IconbarTool.hh | 1 |
6 files changed, 34 insertions, 13 deletions
diff --git a/doc/fluxbox.1.in b/doc/fluxbox.1.in index 90c69fd..8d0c1b8 100644 --- a/doc/fluxbox.1.in +++ b/doc/fluxbox.1.in | |||
@@ -1201,6 +1201,11 @@ All icons will be left\-aligned with the width set in the \(oqinit\(cq file | |||
1201 | All icons will be sized evenly to fill the iconbar completely | 1201 | All icons will be sized evenly to fill the iconbar completely |
1202 | .RE | 1202 | .RE |
1203 | .PP | 1203 | .PP |
1204 | \fBRelativeSmart\fR: | ||
1205 | .RS 4 | ||
1206 | All icons will initially be sized evenly, but icons with long titles will be larger | ||
1207 | .RE | ||
1208 | .PP | ||
1204 | \fBRight\fR: | 1209 | \fBRight\fR: |
1205 | .RS 4 | 1210 | .RS 4 |
1206 | All icons will be right\-aligned with the width set in the \(oqinit\(cq file | 1211 | All icons will be right\-aligned with the width set in the \(oqinit\(cq file |
diff --git a/nls/fluxbox-nls.hh b/nls/fluxbox-nls.hh index 82f10d1..e614525 100644 --- a/nls/fluxbox-nls.hh +++ b/nls/fluxbox-nls.hh | |||
@@ -27,6 +27,7 @@ enum { | |||
27 | AlignCenter = 18, | 27 | AlignCenter = 18, |
28 | AlignTop = 19, | 28 | AlignTop = 19, |
29 | AlignBottom = 20, | 29 | AlignBottom = 20, |
30 | AlignRelativeSmart = 21, | ||
30 | 31 | ||
31 | BaseDisplaySet = 2, | 32 | BaseDisplaySet = 2, |
32 | BaseDisplayAborting = 1, | 33 | BaseDisplayAborting = 1, |
diff --git a/src/FbTk/Container.cc b/src/FbTk/Container.cc index 6270c6a..cea761b 100644 --- a/src/FbTk/Container.cc +++ b/src/FbTk/Container.cc | |||
@@ -324,7 +324,7 @@ void Container::repositionItems() { | |||
324 | // if we have a max total size, then we must also resize ourself | 324 | // if we have a max total size, then we must also resize ourself |
325 | // within that bound | 325 | // within that bound |
326 | Alignment align = alignment(); | 326 | Alignment align = alignment(); |
327 | if (m_max_total_size && align != RELATIVE) { | 327 | if (m_max_total_size && (align != RELATIVE && align != RELATIVE_SMART)) { |
328 | total_width = (max_width_per_client + borderW) * num_items - borderW; | 328 | total_width = (max_width_per_client + borderW) * num_items - borderW; |
329 | if (total_width > m_max_total_size) { | 329 | if (total_width > m_max_total_size) { |
330 | total_width = m_max_total_size; | 330 | total_width = m_max_total_size; |
@@ -379,7 +379,7 @@ void Container::repositionItems() { | |||
379 | unsigned int totalDemands = 0; | 379 | unsigned int totalDemands = 0; |
380 | std::vector<unsigned int> buttonDemands; | 380 | std::vector<unsigned int> buttonDemands; |
381 | 381 | ||
382 | if (align == RELATIVE || total_width == m_max_total_size) { | 382 | if (align == RELATIVE_SMART && total_width == m_max_total_size) { |
383 | buttonDemands.reserve(num_items); | 383 | buttonDemands.reserve(num_items); |
384 | for (it = begin(); it != it_end; ++it) { | 384 | for (it = begin(); it != it_end; ++it) { |
385 | buttonDemands.push_back((*it)->preferredWidth()); | 385 | buttonDemands.push_back((*it)->preferredWidth()); |
@@ -440,7 +440,7 @@ void Container::repositionItems() { | |||
440 | // rotate the x and y coords | 440 | // rotate the x and y coords |
441 | tmpx = next_x; | 441 | tmpx = next_x; |
442 | tmpy = -borderW; | 442 | tmpy = -borderW; |
443 | if (align == RELATIVE && totalDemands) { | 443 | if ((align == RELATIVE || align == RELATIVE_SMART) && totalDemands) { |
444 | tmpw = buttonDemands.at(i)*total_width/totalDemands + extra; | 444 | tmpw = buttonDemands.at(i)*total_width/totalDemands + extra; |
445 | } else { | 445 | } else { |
446 | tmpw = max_width_per_client + extra; | 446 | tmpw = max_width_per_client + extra; |
@@ -469,6 +469,7 @@ unsigned int Container::maxWidthPerClient() const { | |||
469 | case LEFT: | 469 | case LEFT: |
470 | return m_max_size_per_client; | 470 | return m_max_size_per_client; |
471 | break; | 471 | break; |
472 | case RELATIVE_SMART: | ||
472 | case RELATIVE: | 473 | case RELATIVE: |
473 | if (size() == 0) | 474 | if (size() == 0) |
474 | return width(); | 475 | return width(); |
diff --git a/src/FbTk/Container.hh b/src/FbTk/Container.hh index 0f8ac08..2dc6475 100644 --- a/src/FbTk/Container.hh +++ b/src/FbTk/Container.hh | |||
@@ -39,7 +39,7 @@ class Container: public FbWindow, public EventHandler, private NotCopyable { | |||
39 | public: | 39 | public: |
40 | // LEFT, RIGHT => fixed total width, fixed icon size | 40 | // LEFT, RIGHT => fixed total width, fixed icon size |
41 | // RELATIVE => fixed total width, relative/variable icon size | 41 | // RELATIVE => fixed total width, relative/variable icon size |
42 | enum Alignment { LEFT, CENTER, RIGHT, RELATIVE }; | 42 | enum Alignment { LEFT, CENTER, RIGHT, RELATIVE, RELATIVE_SMART }; |
43 | typedef Button * Item; | 43 | typedef Button * Item; |
44 | typedef const Button * ConstItem; | 44 | typedef const Button * ConstItem; |
45 | typedef std::list<Item> ItemList; | 45 | typedef std::list<Item> ItemList; |
diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc index 8f8f128..027ab1c 100644 --- a/src/IconbarTool.cc +++ b/src/IconbarTool.cc | |||
@@ -73,6 +73,8 @@ string FbTk::Resource<FbTk::Container::Alignment>::getString() const { | |||
73 | return string("Left"); | 73 | return string("Left"); |
74 | if (m_value == FbTk::Container::RIGHT) | 74 | if (m_value == FbTk::Container::RIGHT) |
75 | return string("Right"); | 75 | return string("Right"); |
76 | if (m_value == FbTk::Container::RELATIVE_SMART) | ||
77 | return string("RelativeSmart"); | ||
76 | return string("Relative"); | 78 | return string("Relative"); |
77 | } | 79 | } |
78 | 80 | ||
@@ -84,6 +86,8 @@ void FbTk::Resource<FbTk::Container::Alignment>::setFromString(const char *str) | |||
84 | m_value = FbTk::Container::RIGHT; | 86 | m_value = FbTk::Container::RIGHT; |
85 | else if (strcasecmp(str, "Relative") == 0) | 87 | else if (strcasecmp(str, "Relative") == 0) |
86 | m_value = FbTk::Container::RELATIVE; | 88 | m_value = FbTk::Container::RELATIVE; |
89 | else if (strcasecmp(str, "RelativeSmart") == 0) | ||
90 | m_value = FbTk::Container::RELATIVE_SMART; | ||
87 | else | 91 | else |
88 | setDefaultValue(); | 92 | setDefaultValue(); |
89 | } | 93 | } |
@@ -143,6 +147,7 @@ enum { | |||
143 | 147 | ||
144 | L_LEFT, | 148 | L_LEFT, |
145 | L_RELATIVE, | 149 | L_RELATIVE, |
150 | L_RELATIVE_SMART, | ||
146 | L_RIGHT, | 151 | L_RIGHT, |
147 | }; | 152 | }; |
148 | 153 | ||
@@ -163,6 +168,7 @@ void setupModeMenu(FbTk::Menu &menu, IconbarTool &handler) { | |||
163 | 168 | ||
164 | _FB_XTEXT(Align, Left, "Left", "Align to the left"), | 169 | _FB_XTEXT(Align, Left, "Left", "Align to the left"), |
165 | _FB_XTEXT(Align, Relative, "Relative", "Align relative to the width"), | 170 | _FB_XTEXT(Align, Relative, "Relative", "Align relative to the width"), |
171 | _FB_XTEXT(Align, RelativeSmart, "Relative (Smart)", "Align relative to the width, but let elements vary according to size of title"), | ||
166 | _FB_XTEXT(Align, Right, "Right", "Align to the right"), | 172 | _FB_XTEXT(Align, Right, "Right", "Align to the right"), |
167 | }; | 173 | }; |
168 | 174 | ||
@@ -181,6 +187,7 @@ void setupModeMenu(FbTk::Menu &menu, IconbarTool &handler) { | |||
181 | 187 | ||
182 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_LEFT], handler, FbTk::Container::LEFT, saverc_cmd)); | 188 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_LEFT], handler, FbTk::Container::LEFT, saverc_cmd)); |
183 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RELATIVE], handler, FbTk::Container::RELATIVE, saverc_cmd)); | 189 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RELATIVE], handler, FbTk::Container::RELATIVE, saverc_cmd)); |
190 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RELATIVE_SMART], handler, FbTk::Container::RELATIVE_SMART, saverc_cmd)); | ||
184 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RIGHT], handler, FbTk::Container::RIGHT, saverc_cmd)); | 191 | menu.insertItem(new ToolbarAlignMenuItem(_labels[L_RIGHT], handler, FbTk::Container::RIGHT, saverc_cmd)); |
185 | 192 | ||
186 | menu.insertItem(new FbTk::MenuSeparator()); | 193 | menu.insertItem(new FbTk::MenuSeparator()); |
@@ -304,11 +311,21 @@ void IconbarTool::move(int x, int y) { | |||
304 | m_icon_container.move(x, y); | 311 | m_icon_container.move(x, y); |
305 | } | 312 | } |
306 | 313 | ||
307 | void IconbarTool::resize(unsigned int width, unsigned int height) { | 314 | void IconbarTool::updateMaxSizes(unsigned int width, unsigned int height) { |
308 | m_icon_container.resize(width, height); | ||
309 | const unsigned int maxsize = (m_icon_container.orientation() & 1) ? height : width; | 315 | const unsigned int maxsize = (m_icon_container.orientation() & 1) ? height : width; |
310 | m_icon_container.setMaxTotalSize(maxsize); | 316 | m_icon_container.setMaxTotalSize(maxsize); |
311 | m_icon_container.setMaxSizePerClient(maxsize/std::max(1, m_icon_container.size())); | 317 | |
318 | if(*m_rc_alignment == FbTk::Container::LEFT || *m_rc_alignment == FbTk::Container::RIGHT) { | ||
319 | *m_rc_client_width = FbTk::Util::clamp(*m_rc_client_width, 10, 400); | ||
320 | m_icon_container.setMaxSizePerClient(*m_rc_client_width); | ||
321 | } else { | ||
322 | m_icon_container.setMaxSizePerClient(maxsize/std::max(1, m_icon_container.size())); | ||
323 | } | ||
324 | } | ||
325 | |||
326 | void IconbarTool::resize(unsigned int width, unsigned int height) { | ||
327 | m_icon_container.resize(width, height); | ||
328 | updateMaxSizes(width, height); | ||
312 | renderTheme(); | 329 | renderTheme(); |
313 | } | 330 | } |
314 | 331 | ||
@@ -316,9 +333,7 @@ void IconbarTool::moveResize(int x, int y, | |||
316 | unsigned int width, unsigned int height) { | 333 | unsigned int width, unsigned int height) { |
317 | 334 | ||
318 | m_icon_container.moveResize(x, y, width, height); | 335 | m_icon_container.moveResize(x, y, width, height); |
319 | const unsigned int maxsize = (m_icon_container.orientation() & 1) ? height : width; | 336 | updateMaxSizes(width, height); |
320 | m_icon_container.setMaxTotalSize(maxsize); | ||
321 | m_icon_container.setMaxSizePerClient(maxsize/std::max(1, m_icon_container.size())); | ||
322 | renderTheme(); | 337 | renderTheme(); |
323 | } | 338 | } |
324 | 339 | ||
@@ -438,10 +453,8 @@ void IconbarTool::update(UpdateReason reason, Focusable *win) { | |||
438 | } | 453 | } |
439 | 454 | ||
440 | m_resizeSig_timer.start(); | 455 | m_resizeSig_timer.start(); |
441 | const unsigned int maxsize = (m_icon_container.orientation() & 1) ? height() : width(); | ||
442 | m_icon_container.setMaxTotalSize(maxsize); | ||
443 | m_icon_container.setMaxSizePerClient(maxsize/std::max(1, m_icon_container.size())); | ||
444 | 456 | ||
457 | updateMaxSizes(width(), height()); | ||
445 | // unlock container and update graphics | 458 | // unlock container and update graphics |
446 | m_icon_container.setUpdateLock(false); | 459 | m_icon_container.setUpdateLock(false); |
447 | m_icon_container.update(); | 460 | m_icon_container.update(); |
diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh index a461ce5..df6d9a6 100644 --- a/src/IconbarTool.hh +++ b/src/IconbarTool.hh | |||
@@ -98,6 +98,7 @@ private: | |||
98 | /// add icons to the list | 98 | /// add icons to the list |
99 | void updateList(); | 99 | void updateList(); |
100 | 100 | ||
101 | void updateMaxSizes(unsigned int width, unsigned int height); | ||
101 | /// called when the list emits a signal | 102 | /// called when the list emits a signal |
102 | void update(UpdateReason reason, Focusable *win); | 103 | void update(UpdateReason reason, Focusable *win); |
103 | 104 | ||