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 /src/FbTk | |
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)
Diffstat (limited to 'src/FbTk')
-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 | ||