diff options
Diffstat (limited to 'src/FbWinFrame.cc')
-rw-r--r-- | src/FbWinFrame.cc | 88 |
1 files changed, 53 insertions, 35 deletions
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index 05c6f00..1444438 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -19,7 +19,7 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | // $Id: FbWinFrame.cc,v 1.12 2003/02/23 00:57:55 fluxgen Exp $ | 22 | // $Id: FbWinFrame.cc,v 1.13 2003/02/23 13:40:22 rathnor Exp $ |
23 | 23 | ||
24 | #include "FbWinFrame.hh" | 24 | #include "FbWinFrame.hh" |
25 | #include "ImageControl.hh" | 25 | #include "ImageControl.hh" |
@@ -170,16 +170,16 @@ void FbWinFrame::resize(unsigned int width, unsigned int height) { | |||
170 | } | 170 | } |
171 | 171 | ||
172 | void FbWinFrame::resizeForClient(unsigned int width, unsigned int height) { | 172 | void FbWinFrame::resizeForClient(unsigned int width, unsigned int height) { |
173 | // total height for frame without client | 173 | // total height for frame |
174 | int handle_height = m_handle.height() + m_handle.borderWidth(); | 174 | unsigned int total_height = height; |
175 | int titlebar_height = m_titlebar.height() + m_titlebar.borderWidth(); | 175 | |
176 | unsigned int total_height = handle_height + titlebar_height; | 176 | // having a titlebar = 1 extra border + titlebar height |
177 | // resize frame height with total height + specified height | 177 | if (m_use_titlebar) |
178 | if (!m_use_titlebar) | 178 | total_height += m_titlebar.height() + m_titlebar.borderWidth(); |
179 | total_height -= titlebar_height; | 179 | // having a handle = 1 extra border + handle height |
180 | if (!m_use_handle) | 180 | if (m_use_handle) |
181 | total_height -= handle_height; | 181 | total_height += m_handle.height() + m_handle.borderWidth(); |
182 | resize(width, total_height + height); | 182 | resize(width, total_height); |
183 | } | 183 | } |
184 | 184 | ||
185 | void FbWinFrame::moveResize(int x, int y, unsigned int width, unsigned int height) { | 185 | void FbWinFrame::moveResize(int x, int y, unsigned int width, unsigned int height) { |
@@ -280,8 +280,10 @@ void FbWinFrame::hideTitlebar() { | |||
280 | m_titlebar.hide(); | 280 | m_titlebar.hide(); |
281 | m_use_titlebar = false; | 281 | m_use_titlebar = false; |
282 | m_clientarea.raise(); | 282 | m_clientarea.raise(); |
283 | |||
284 | // only take away one borderwidth (as the other border is still the "top" border) | ||
283 | m_window.resize(m_window.width(), m_window.height() - m_titlebar.height() - | 285 | m_window.resize(m_window.width(), m_window.height() - m_titlebar.height() - |
284 | m_titlebar.borderWidth()*2); | 286 | m_titlebar.borderWidth()); |
285 | #ifdef DEBUG | 287 | #ifdef DEBUG |
286 | cerr<<__FILE__<<": Hide Titlebar"<<endl; | 288 | cerr<<__FILE__<<": Hide Titlebar"<<endl; |
287 | #endif // DEBUG | 289 | #endif // DEBUG |
@@ -293,30 +295,43 @@ void FbWinFrame::showTitlebar() { | |||
293 | 295 | ||
294 | m_titlebar.show(); | 296 | m_titlebar.show(); |
295 | m_use_titlebar = true; | 297 | m_use_titlebar = true; |
298 | |||
299 | // only add one borderwidth (as the other border is still the "top" border) | ||
300 | m_window.resize(m_window.width(), m_window.height() + m_titlebar.height() + | ||
301 | m_titlebar.borderWidth()); | ||
302 | |||
296 | #ifdef DEBUG | 303 | #ifdef DEBUG |
297 | cerr<<__FILE__<<": Show Titlebar"<<endl; | 304 | cerr<<__FILE__<<": Show Titlebar"<<endl; |
298 | #endif // DEBUG | 305 | #endif // DEBUG |
299 | } | 306 | } |
300 | 307 | ||
301 | void FbWinFrame::hideHandle() { | 308 | void FbWinFrame::hideHandle() { |
309 | if (!m_use_handle) | ||
310 | return; | ||
302 | m_handle.hide(); | 311 | m_handle.hide(); |
303 | m_grip_left.hide(); | 312 | m_grip_left.hide(); |
304 | m_grip_right.hide(); | 313 | m_grip_right.hide(); |
305 | m_use_handle = false; | 314 | m_use_handle = false; |
315 | m_window.resize(m_window.width(), m_window.height() - m_handle.height() - | ||
316 | m_handle.borderWidth()); | ||
317 | |||
306 | } | 318 | } |
307 | 319 | ||
308 | void FbWinFrame::showHandle() { | 320 | void FbWinFrame::showHandle() { |
321 | if (m_use_handle) | ||
322 | return; | ||
309 | m_handle.show(); | 323 | m_handle.show(); |
310 | m_grip_left.show(); | 324 | m_grip_left.show(); |
311 | m_grip_right.show(); | 325 | m_grip_right.show(); |
312 | m_use_handle = true; | 326 | m_use_handle = true; |
327 | m_window.resize(m_window.width(), m_window.height() + m_handle.height() + | ||
328 | m_handle.borderWidth()); | ||
313 | } | 329 | } |
314 | 330 | ||
315 | void FbWinFrame::hideAllDecorations() { | 331 | void FbWinFrame::hideAllDecorations() { |
316 | hideHandle(); | 332 | hideHandle(); |
317 | hideTitlebar(); | 333 | hideTitlebar(); |
318 | m_window.setBorderWidth(0); | 334 | // resize done by hide* |
319 | m_window.resize(m_clientarea.width(), m_clientarea.height()); | ||
320 | reconfigure(); | 335 | reconfigure(); |
321 | } | 336 | } |
322 | 337 | ||
@@ -325,7 +340,7 @@ void FbWinFrame::showAllDecorations() { | |||
325 | showHandle(); | 340 | showHandle(); |
326 | if (!m_use_titlebar) | 341 | if (!m_use_titlebar) |
327 | showTitlebar(); | 342 | showTitlebar(); |
328 | resizeForClient(m_clientarea.width(), m_clientarea.height()); | 343 | // resize shouldn't be necessary |
329 | reconfigure(); | 344 | reconfigure(); |
330 | } | 345 | } |
331 | 346 | ||
@@ -395,6 +410,10 @@ void FbWinFrame::exposeEvent(XExposeEvent &event) { | |||
395 | redrawTitlebar(); | 410 | redrawTitlebar(); |
396 | else if (m_label == event.window) | 411 | else if (m_label == event.window) |
397 | redrawTitle(); | 412 | redrawTitle(); |
413 | else if (m_handle == event.window || | ||
414 | m_grip_left == event.window || | ||
415 | m_grip_right == event.window) | ||
416 | renderHandles(); | ||
398 | } | 417 | } |
399 | 418 | ||
400 | void FbWinFrame::handleEvent(XEvent &event) { | 419 | void FbWinFrame::handleEvent(XEvent &event) { |
@@ -415,28 +434,28 @@ void FbWinFrame::reconfigure() { | |||
415 | if (m_use_titlebar) | 434 | if (m_use_titlebar) |
416 | reconfigureTitlebar(); | 435 | reconfigureTitlebar(); |
417 | 436 | ||
418 | // setup client area size/pos | 437 | int client_top = 0; |
419 | int next_y = m_titlebar.height() + m_titlebar.borderWidth(); | 438 | int client_height = m_window.height(); |
420 | unsigned int client_height = | 439 | if (m_use_titlebar) { |
421 | m_window.height() - next_y; | 440 | // only one borderwidth as titlebar is really at -borderwidth |
422 | /*- m_titlebar.height() - m_titlebar.y() - m_handle.height();*/ | 441 | int titlebar_height = m_titlebar.height() + m_titlebar.borderWidth(); |
442 | client_top += titlebar_height; | ||
443 | client_height -= titlebar_height; | ||
444 | } | ||
423 | 445 | ||
424 | if (!m_use_titlebar) { | 446 | if (m_use_handle) { |
425 | next_y = -m_titlebar.y(); | 447 | client_height -= m_handle.height() + m_handle.borderWidth(); |
426 | if (!m_use_handle) | ||
427 | client_height = m_window.height(); | ||
428 | else | ||
429 | client_height = m_window.height() - m_handle.height(); | ||
430 | } | 448 | } |
431 | 449 | ||
432 | m_clientarea.moveResize(0, m_titlebar.y() + next_y, | 450 | m_clientarea.moveResize(0, client_top, |
433 | m_window.width(), client_height); | 451 | m_window.width(), client_height); |
434 | 452 | ||
435 | if (m_clientwin != 0) { | 453 | if (m_clientwin != 0) { |
436 | XMoveResizeWindow(FbTk::App::instance()->display(), m_clientwin, | 454 | XMoveResizeWindow(FbTk::App::instance()->display(), m_clientwin, |
437 | 0, 0, | 455 | 0, 0, |
438 | m_clientarea.width(), m_clientarea.height()); | 456 | m_clientarea.width(), m_clientarea.height()); |
439 | } | 457 | } |
458 | |||
440 | 459 | ||
441 | if (!m_use_handle) // no need to do anything more | 460 | if (!m_use_handle) // no need to do anything more |
442 | return; | 461 | return; |
@@ -444,19 +463,18 @@ void FbWinFrame::reconfigure() { | |||
444 | // align handle and grips | 463 | // align handle and grips |
445 | const int grip_height = m_handle.height(); | 464 | const int grip_height = m_handle.height(); |
446 | const int grip_width = 20; //TODO | 465 | const int grip_width = 20; //TODO |
447 | |||
448 | const int ypos = m_window.height() - grip_height; | ||
449 | 466 | ||
450 | m_grip_left.moveResize(0, ypos, | 467 | const int ypos = m_window.height() - grip_height - m_handle.borderWidth(); |
468 | |||
469 | m_grip_left.moveResize(-m_handle.borderWidth(), ypos, | ||
451 | grip_width, grip_height); | 470 | grip_width, grip_height); |
452 | 471 | ||
453 | m_handle.moveResize(grip_width, ypos, | 472 | m_handle.moveResize(grip_width, ypos, |
454 | m_window.width() - grip_width*2, grip_height); | 473 | m_window.width() - grip_width*2 - m_handle.borderWidth()*2, grip_height); |
455 | 474 | ||
456 | m_grip_right.moveResize(m_window.width() - grip_width, ypos, | 475 | m_grip_right.moveResize(m_window.width() - grip_width - m_handle.borderWidth(), ypos, |
457 | grip_width, grip_height); | 476 | grip_width, grip_height); |
458 | 477 | ||
459 | |||
460 | // render the theme | 478 | // render the theme |
461 | renderButtons(); | 479 | renderButtons(); |
462 | renderHandles(); | 480 | renderHandles(); |