diff options
author | Thomas Lübking <thomas.luebking@gmail.com> | 2016-08-02 22:24:39 (GMT) |
---|---|---|
committer | Thomas Lübking <thomas.luebking@gmail.com> | 2016-08-06 15:09:30 (GMT) |
commit | 10e3f10b55fbd8f3ff6793a3993b8ee55f3192a2 (patch) | |
tree | 622c00cadc2736610dab7e71cdc59e15d9cb31fb | |
parent | cc80230bd85dbaf1036b4cf37259d3146229fb00 (diff) | |
download | fluxbox-10e3f10b55fbd8f3ff6793a3993b8ee55f3192a2.zip fluxbox-10e3f10b55fbd8f3ff6793a3993b8ee55f3192a2.tar.bz2 |
Adjust RELATIVE ::repositionItems (more relative)
The evenly distributed space causes a lot of whitespace and otoh. cut
items, so we use the items internal size as indicator IF the item is a
textbutton (the regular usecase in fluxbox)
Also publish the function to be triggered from outside (because the
caller can, in theory, much better compress several text changes)
-rw-r--r-- | src/FbTk/Container.cc | 35 | ||||
-rw-r--r-- | src/FbTk/Container.hh | 2 |
2 files changed, 29 insertions, 8 deletions
diff --git a/src/FbTk/Container.cc b/src/FbTk/Container.cc index d8a230e..f7d5c35 100644 --- a/src/FbTk/Container.cc +++ b/src/FbTk/Container.cc | |||
@@ -23,12 +23,14 @@ | |||
23 | #include "Container.hh" | 23 | #include "Container.hh" |
24 | 24 | ||
25 | #include "Button.hh" | 25 | #include "Button.hh" |
26 | #include "TextButton.hh" | ||
26 | #include "TextUtils.hh" | 27 | #include "TextUtils.hh" |
27 | #include "EventManager.hh" | 28 | #include "EventManager.hh" |
28 | #include "CompareEqual.hh" | 29 | #include "CompareEqual.hh" |
29 | #include "STLUtil.hh" | 30 | #include "STLUtil.hh" |
30 | 31 | ||
31 | #include <algorithm> | 32 | #include <algorithm> |
33 | #include <vector> | ||
32 | 34 | ||
33 | namespace FbTk { | 35 | namespace FbTk { |
34 | 36 | ||
@@ -304,7 +306,7 @@ void Container::repositionItems() { | |||
304 | 306 | ||
305 | unsigned int max_width_per_client = maxWidthPerClient(); | 307 | unsigned int max_width_per_client = maxWidthPerClient(); |
306 | unsigned int borderW = m_item_list.front()->borderWidth(); | 308 | unsigned int borderW = m_item_list.front()->borderWidth(); |
307 | size_t num_items = m_item_list.size(); | 309 | const size_t num_items = m_item_list.size(); |
308 | 310 | ||
309 | unsigned int total_width; | 311 | unsigned int total_width; |
310 | unsigned int cur_width; | 312 | unsigned int cur_width; |
@@ -364,10 +366,6 @@ void Container::repositionItems() { | |||
364 | 366 | ||
365 | int rounding_error = 0; | 367 | int rounding_error = 0; |
366 | 368 | ||
367 | if (align == RELATIVE || total_width == m_max_total_size) { | ||
368 | rounding_error = total_width - ((max_width_per_client + borderW)* num_items - borderW); | ||
369 | } | ||
370 | |||
371 | int next_x = -borderW; // zero so the border of the first shows | 369 | int next_x = -borderW; // zero so the border of the first shows |
372 | int extra = 0; | 370 | int extra = 0; |
373 | int direction = 1; | 371 | int direction = 1; |
@@ -378,7 +376,25 @@ void Container::repositionItems() { | |||
378 | 376 | ||
379 | int tmpx, tmpy; | 377 | int tmpx, tmpy; |
380 | unsigned int tmpw, tmph; | 378 | unsigned int tmpw, tmph; |
381 | for (; it != it_end; ++it, next_x += direction*(max_width_per_client + borderW + extra)) { | 379 | unsigned int totalDemands = 0; |
380 | std::vector<unsigned int> buttonDemands; | ||
381 | |||
382 | if (align == RELATIVE || total_width == m_max_total_size) { | ||
383 | buttonDemands.reserve(num_items); | ||
384 | for (it = begin(); it != it_end; ++it) { | ||
385 | buttonDemands.push_back((*it)->preferredWidth()); | ||
386 | totalDemands += buttonDemands.back(); | ||
387 | } | ||
388 | if (totalDemands) { | ||
389 | rounding_error = total_width; | ||
390 | for (int i = 0; i < buttonDemands.size(); ++i) { | ||
391 | rounding_error -= buttonDemands.at(i)*total_width/totalDemands; | ||
392 | } | ||
393 | } | ||
394 | } | ||
395 | |||
396 | it = begin(); | ||
397 | for (int i = 0; it != it_end; ++it, ++i) { | ||
382 | // we only need to do error stuff with alignment RELATIVE | 398 | // we only need to do error stuff with alignment RELATIVE |
383 | // OR with max_total_size triggered | 399 | // OR with max_total_size triggered |
384 | if (rounding_error) { | 400 | if (rounding_error) { |
@@ -395,8 +411,13 @@ void Container::repositionItems() { | |||
395 | // rotate the x and y coords | 411 | // rotate the x and y coords |
396 | tmpx = next_x; | 412 | tmpx = next_x; |
397 | tmpy = -borderW; | 413 | tmpy = -borderW; |
398 | tmpw = max_width_per_client + extra; | 414 | if (align == RELATIVE && totalDemands) { |
415 | tmpw = buttonDemands.at(i)*total_width/totalDemands + extra; | ||
416 | } else { | ||
417 | tmpw = max_width_per_client + extra; | ||
418 | } | ||
399 | tmph = height; | 419 | tmph = height; |
420 | next_x += direction*(tmpw + borderW); | ||
400 | 421 | ||
401 | translateCoords(m_orientation, tmpx, tmpy, total_width, height); | 422 | translateCoords(m_orientation, tmpx, tmpy, total_width, height); |
402 | translatePosition(m_orientation, tmpx, tmpy, tmpw, tmph, borderW); | 423 | translatePosition(m_orientation, tmpx, tmpy, tmpw, tmph, borderW); |
diff --git a/src/FbTk/Container.hh b/src/FbTk/Container.hh index f3d9bac..0f8ac08 100644 --- a/src/FbTk/Container.hh +++ b/src/FbTk/Container.hh | |||
@@ -98,8 +98,8 @@ public: | |||
98 | 98 | ||
99 | void clear(); // clear all windows | 99 | void clear(); // clear all windows |
100 | 100 | ||
101 | private: | ||
102 | void repositionItems(); | 101 | void repositionItems(); |
102 | private: | ||
103 | 103 | ||
104 | Orientation m_orientation; | 104 | Orientation m_orientation; |
105 | 105 | ||