diff options
Diffstat (limited to 'src/FbTk/Container.cc')
-rw-r--r-- | src/FbTk/Container.cc | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/FbTk/Container.cc b/src/FbTk/Container.cc index 6a8f2a3..bcb6b01 100644 --- a/src/FbTk/Container.cc +++ b/src/FbTk/Container.cc | |||
@@ -33,13 +33,14 @@ namespace FbTk { | |||
33 | 33 | ||
34 | typedef CompareEqual_base<FbWindow, Window> CompareWindow; | 34 | typedef CompareEqual_base<FbWindow, Window> CompareWindow; |
35 | 35 | ||
36 | Container::Container(const FbWindow &parent): | 36 | Container::Container(const FbWindow &parent, bool auto_resize): |
37 | FbWindow(parent, 0, 0, 1, 1, ExposureMask), | 37 | FbWindow(parent, 0, 0, 1, 1, ExposureMask), |
38 | m_orientation(ROT0), | 38 | m_orientation(ROT0), |
39 | m_align(RELATIVE), | 39 | m_align(RELATIVE), |
40 | m_max_size_per_client(60), | 40 | m_max_size_per_client(60), |
41 | m_max_total_size(0), | 41 | m_max_total_size(0), |
42 | m_update_lock(false) { | 42 | m_update_lock(false), |
43 | m_auto_resize(auto_resize) { | ||
43 | EventManager::instance()->add(*this, *this); | 44 | EventManager::instance()->add(*this, *this); |
44 | } | 45 | } |
45 | 46 | ||
@@ -328,7 +329,7 @@ void Container::repositionItems() { | |||
328 | } else | 329 | } else |
329 | max_width_per_client = 1; | 330 | max_width_per_client = 1; |
330 | } | 331 | } |
331 | if (total_width != cur_width) { | 332 | if (m_auto_resize && total_width != cur_width) { |
332 | // calling Container::resize here risks infinite loops | 333 | // calling Container::resize here risks infinite loops |
333 | unsigned int neww = total_width, newh = height; | 334 | unsigned int neww = total_width, newh = height; |
334 | translateSize(m_orientation, neww, newh); | 335 | translateSize(m_orientation, neww, newh); |
@@ -410,24 +411,31 @@ void Container::repositionItems() { | |||
410 | 411 | ||
411 | 412 | ||
412 | unsigned int Container::maxWidthPerClient() const { | 413 | unsigned int Container::maxWidthPerClient() const { |
413 | unsigned int max_relative_size; | 414 | switch (alignment()) { |
414 | if (size() == 0) | 415 | case RIGHT: |
415 | max_relative_size = width(); | 416 | case CENTER: |
416 | else { | 417 | case LEFT: |
417 | unsigned int borderW = m_item_list.front()->borderWidth(); | 418 | return m_max_size_per_client; |
418 | // there're count-1 borders to fit in with the windows | 419 | break; |
419 | // -> 1 per window plus end | 420 | case RELATIVE: |
420 | unsigned int w = width(), h = height(); | 421 | if (size() == 0) |
421 | translateSize(m_orientation, w, h); | 422 | return width(); |
422 | max_relative_size = w < (size()-1)*borderW ? 1 : | 423 | else { |
423 | (w - (size() - 1) * borderW) / size(); | 424 | unsigned int borderW = m_item_list.front()->borderWidth(); |
425 | // there're count-1 borders to fit in with the windows | ||
426 | // -> 1 per window plus end | ||
427 | unsigned int w = width(), h = height(); | ||
428 | translateSize(m_orientation, w, h); | ||
429 | if (w < (size()-1)*borderW) | ||
430 | return 1; | ||
431 | else | ||
432 | return (w - (size() - 1) * borderW) / size(); | ||
433 | } | ||
434 | break; | ||
424 | } | 435 | } |
425 | 436 | ||
426 | if (alignment() == RELATIVE) | 437 | // this will never happen anyway |
427 | return max_relative_size; | 438 | return 1; |
428 | |||
429 | return (m_max_size_per_client < max_relative_size ? | ||
430 | m_max_size_per_client : max_relative_size); | ||
431 | } | 439 | } |
432 | 440 | ||
433 | void Container::for_each(std::mem_fun_t<void, FbWindow> function) { | 441 | void Container::for_each(std::mem_fun_t<void, FbWindow> function) { |