summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Container.cc40
-rw-r--r--src/FbWinFrame.cc12
2 files changed, 23 insertions, 29 deletions
diff --git a/src/Container.cc b/src/Container.cc
index 4cd0fa8..5e7cb7d 100644
--- a/src/Container.cc
+++ b/src/Container.cc
@@ -272,35 +272,10 @@ void Container::setMaxTotalSize(unsigned int size) {
272 if (m_max_total_size == size) 272 if (m_max_total_size == size)
273 return; 273 return;
274 274
275 unsigned int old = m_max_total_size;
276 m_max_total_size = size; 275 m_max_total_size = size;
277 276
278 repositionItems(); 277 repositionItems();
279 return; 278 return;
280
281 if (m_max_total_size && width() > m_max_total_size) {
282 resize(m_max_total_size, height());
283 } else if (!m_max_total_size && old) { // going from restricted to unrestricted
284 repositionItems();
285 } else {
286 // this is a bit of duplication from repositionItems
287 // for when we are allowed to grow ourself
288 Alignment align = alignment();
289 size_t num_items = m_item_list.size();
290 if (m_max_total_size && (align == RIGHT || align == LEFT) &&
291 num_items) {
292 unsigned int max_width_per_client = maxWidthPerClient();
293 unsigned int borderW = m_item_list.front()->borderWidth();
294
295 unsigned int preferred_width = (max_width_per_client + borderW) * num_items - borderW;
296
297 if (preferred_width > m_max_total_size)
298 preferred_width = m_max_total_size;
299
300 if (preferred_width != width())
301 repositionItems();
302 }
303 }
304} 279}
305 280
306void Container::setAlignment(Container::Alignment a) { 281void Container::setAlignment(Container::Alignment a) {
@@ -401,7 +376,6 @@ void Container::repositionItems() {
401 total_width = m_max_total_size; 376 total_width = m_max_total_size;
402 if (m_max_total_size > ((num_items - 1)*borderW)) { // don't go negative with unsigned nums 377 if (m_max_total_size > ((num_items - 1)*borderW)) { // don't go negative with unsigned nums
403 max_width_per_client = ( m_max_total_size - (num_items - 1)*borderW ) / num_items; 378 max_width_per_client = ( m_max_total_size - (num_items - 1)*borderW ) / num_items;
404 total_width = (max_width_per_client + borderW) * num_items - borderW;
405 } else 379 } else
406 max_width_per_client = 1; 380 max_width_per_client = 1;
407 } 381 }
@@ -429,7 +403,11 @@ void Container::repositionItems() {
429 ItemList::iterator it = m_item_list.begin(); 403 ItemList::iterator it = m_item_list.begin();
430 const ItemList::iterator it_end = m_item_list.end(); 404 const ItemList::iterator it_end = m_item_list.end();
431 405
432 int rounding_error = total_width - ((max_width_per_client + borderW)* num_items - borderW); 406 int rounding_error = 0;
407
408 if (align == RELATIVE || total_width == m_max_total_size) {
409 rounding_error = total_width - ((max_width_per_client + borderW)* num_items - borderW);
410 }
433 411
434 int next_x = -borderW; // zero so the border of the first shows 412 int next_x = -borderW; // zero so the border of the first shows
435 int extra = 0; 413 int extra = 0;
@@ -443,10 +421,16 @@ void Container::repositionItems() {
443 unsigned int tmpw, tmph; 421 unsigned int tmpw, tmph;
444 for (; it != it_end; ++it, next_x += direction*(max_width_per_client + borderW + extra)) { 422 for (; it != it_end; ++it, next_x += direction*(max_width_per_client + borderW + extra)) {
445 // we only need to do error stuff with alignment RELATIVE 423 // we only need to do error stuff with alignment RELATIVE
446 if (rounding_error != 0 && align == RELATIVE) { 424 // OR with max_total_size triggered
425 if (rounding_error) {
447 --rounding_error; 426 --rounding_error;
448 extra = 1; 427 extra = 1;
428 //counter for different direction
429 if (align == RIGHT && !extra)
430 --next_x;
449 } else { 431 } else {
432 if (extra && align == RIGHT) // last extra
433 ++next_x;
450 extra = 0; 434 extra = 0;
451 } 435 }
452 // rotate the x and y coords 436 // rotate the x and y coords
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc
index d3dd682..00583d7 100644
--- a/src/FbWinFrame.cc
+++ b/src/FbWinFrame.cc
@@ -348,6 +348,7 @@ void FbWinFrame::alignTabs() {
348 if (orig_orient != FbTk::ROT0) m_tab_container.hide(); 348 if (orig_orient != FbTk::ROT0) m_tab_container.hide();
349 m_tab_container.setOrientation(FbTk::ROT0); 349 m_tab_container.setOrientation(FbTk::ROT0);
350 m_tab_container.setAlignment(Container::LEFT); 350 m_tab_container.setAlignment(Container::LEFT);
351 m_tab_container.setMaxTotalSize(m_window.width());
351 tabx = x(); 352 tabx = x();
352 taby = y() - yOffset(); 353 taby = y() - yOffset();
353 break; 354 break;
@@ -355,6 +356,7 @@ void FbWinFrame::alignTabs() {
355 if (orig_orient != FbTk::ROT0) m_tab_container.hide(); 356 if (orig_orient != FbTk::ROT0) m_tab_container.hide();
356 m_tab_container.setOrientation(FbTk::ROT0); 357 m_tab_container.setOrientation(FbTk::ROT0);
357 m_tab_container.setAlignment(Container::RIGHT); 358 m_tab_container.setAlignment(Container::RIGHT);
359 m_tab_container.setMaxTotalSize(m_window.width());
358 tabx = x() + width() - m_tab_container.width(); 360 tabx = x() + width() - m_tab_container.width();
359 taby = y() - yOffset(); 361 taby = y() - yOffset();
360 break; 362 break;
@@ -362,6 +364,7 @@ void FbWinFrame::alignTabs() {
362 if (orig_orient != FbTk::ROT270) m_tab_container.hide(); 364 if (orig_orient != FbTk::ROT270) m_tab_container.hide();
363 m_tab_container.setOrientation(FbTk::ROT270); 365 m_tab_container.setOrientation(FbTk::ROT270);
364 m_tab_container.setAlignment(Container::RIGHT); 366 m_tab_container.setAlignment(Container::RIGHT);
367 m_tab_container.setMaxTotalSize(m_window.height());
365 tabx = x() - xOffset(); 368 tabx = x() - xOffset();
366 taby = y(); 369 taby = y();
367 break; 370 break;
@@ -369,6 +372,7 @@ void FbWinFrame::alignTabs() {
369 if (orig_orient != FbTk::ROT270) m_tab_container.hide(); 372 if (orig_orient != FbTk::ROT270) m_tab_container.hide();
370 m_tab_container.setOrientation(FbTk::ROT270); 373 m_tab_container.setOrientation(FbTk::ROT270);
371 m_tab_container.setAlignment(Container::LEFT); 374 m_tab_container.setAlignment(Container::LEFT);
375 m_tab_container.setMaxTotalSize(m_window.height());
372 tabx = x() - xOffset(); 376 tabx = x() - xOffset();
373 taby = y() + height() - m_tab_container.height(); 377 taby = y() + height() - m_tab_container.height();
374 break; 378 break;
@@ -376,6 +380,7 @@ void FbWinFrame::alignTabs() {
376 if (orig_orient != FbTk::ROT90) m_tab_container.hide(); 380 if (orig_orient != FbTk::ROT90) m_tab_container.hide();
377 m_tab_container.setOrientation(FbTk::ROT90); 381 m_tab_container.setOrientation(FbTk::ROT90);
378 m_tab_container.setAlignment(Container::LEFT); 382 m_tab_container.setAlignment(Container::LEFT);
383 m_tab_container.setMaxTotalSize(m_window.height());
379 tabx = x() + width() + m_window.borderWidth(); 384 tabx = x() + width() + m_window.borderWidth();
380 taby = y(); 385 taby = y();
381 break; 386 break;
@@ -383,6 +388,7 @@ void FbWinFrame::alignTabs() {
383 if (orig_orient != FbTk::ROT90) m_tab_container.hide(); 388 if (orig_orient != FbTk::ROT90) m_tab_container.hide();
384 m_tab_container.setOrientation(FbTk::ROT90); 389 m_tab_container.setOrientation(FbTk::ROT90);
385 m_tab_container.setAlignment(Container::RIGHT); 390 m_tab_container.setAlignment(Container::RIGHT);
391 m_tab_container.setMaxTotalSize(m_window.height());
386 tabx = x() + width() + m_window.borderWidth(); 392 tabx = x() + width() + m_window.borderWidth();
387 taby = y() + height() - m_tab_container.height(); 393 taby = y() + height() - m_tab_container.height();
388 break; 394 break;
@@ -390,6 +396,7 @@ void FbWinFrame::alignTabs() {
390 if (orig_orient != FbTk::ROT0) m_tab_container.hide(); 396 if (orig_orient != FbTk::ROT0) m_tab_container.hide();
391 m_tab_container.setOrientation(FbTk::ROT0); 397 m_tab_container.setOrientation(FbTk::ROT0);
392 m_tab_container.setAlignment(Container::LEFT); 398 m_tab_container.setAlignment(Container::LEFT);
399 m_tab_container.setMaxTotalSize(m_window.width());
393 tabx = x(); 400 tabx = x();
394 taby = y() + height() + m_window.borderWidth(); 401 taby = y() + height() + m_window.borderWidth();
395 break; 402 break;
@@ -397,6 +404,7 @@ void FbWinFrame::alignTabs() {
397 if (orig_orient != FbTk::ROT0) m_tab_container.hide(); 404 if (orig_orient != FbTk::ROT0) m_tab_container.hide();
398 m_tab_container.setOrientation(FbTk::ROT0); 405 m_tab_container.setOrientation(FbTk::ROT0);
399 m_tab_container.setAlignment(Container::RIGHT); 406 m_tab_container.setAlignment(Container::RIGHT);
407 m_tab_container.setMaxTotalSize(m_window.width());
400 tabx = x() + width() - m_tab_container.width(); 408 tabx = x() + width() - m_tab_container.width();
401 taby = y() + height() + m_window.borderWidth(); 409 taby = y() + height() + m_window.borderWidth();
402 break; 410 break;
@@ -404,7 +412,6 @@ void FbWinFrame::alignTabs() {
404 412
405 unsigned int w = m_window.width(), h = m_window.height(); 413 unsigned int w = m_window.width(), h = m_window.height();
406 translateSize(m_tab_container.orientation(), w, h); 414 translateSize(m_tab_container.orientation(), w, h);
407 m_tab_container.setMaxTotalSize(w);
408 415
409 if (m_tab_container.orientation() != orig_orient || 416 if (m_tab_container.orientation() != orig_orient ||
410 m_tab_container.maxWidthPerClient() != orig_tabwidth) { 417 m_tab_container.maxWidthPerClient() != orig_tabwidth) {
@@ -417,6 +424,9 @@ void FbWinFrame::alignTabs() {
417 } 424 }
418 425
419 if (m_tab_container.parent()->window() != m_screen.rootWindow().window()) { 426 if (m_tab_container.parent()->window() != m_screen.rootWindow().window()) {
427 // because the label might be using the same cached pixmap as tab container!
428 renderTitlebar();
429 applyTitlebar();
420 m_tab_container.reparent(m_screen.rootWindow(), tabx, taby); 430 m_tab_container.reparent(m_screen.rootWindow(), tabx, taby);
421 m_layeritem.addWindow(m_tab_container); 431 m_layeritem.addWindow(m_tab_container);
422 } else { 432 } else {