diff options
-rw-r--r-- | src/Remember.cc | 12 | ||||
-rw-r--r-- | src/Window.cc | 53 | ||||
-rw-r--r-- | src/Window.hh | 2 |
3 files changed, 48 insertions, 19 deletions
diff --git a/src/Remember.cc b/src/Remember.cc index c490e51..cfd0d61 100644 --- a/src/Remember.cc +++ b/src/Remember.cc | |||
@@ -319,15 +319,15 @@ Application * Remember::add(WinClient &winclient) { | |||
319 | Application *app = new Application(false); | 319 | Application *app = new Application(false); |
320 | 320 | ||
321 | // by default, we match against the WMClass of a window. | 321 | // by default, we match against the WMClass of a window. |
322 | string win_name = p->getProperty(ClientPattern::NAME, winclient); | 322 | string win_class = p->getProperty(ClientPattern::CLASS, winclient); |
323 | 323 | ||
324 | // replace special chars like ( ) and [ ] with \( \) and \[ \] | 324 | // replace special chars like ( ) and [ ] with \( \) and \[ \] |
325 | win_name = FbTk::StringUtil::replaceString(win_name, "(", "\\("); | 325 | win_class = FbTk::StringUtil::replaceString(win_class, "(", "\\("); |
326 | win_name = FbTk::StringUtil::replaceString(win_name, ")", "\\)"); | 326 | win_class = FbTk::StringUtil::replaceString(win_class, ")", "\\)"); |
327 | win_name = FbTk::StringUtil::replaceString(win_name, "[", "\\["); | 327 | win_class = FbTk::StringUtil::replaceString(win_class, "[", "\\["); |
328 | win_name = FbTk::StringUtil::replaceString(win_name, "]", "\\]"); | 328 | win_class = FbTk::StringUtil::replaceString(win_class, "]", "\\]"); |
329 | 329 | ||
330 | p->addTerm(win_name, ClientPattern::NAME); | 330 | p->addTerm(win_class, ClientPattern::CLASS); |
331 | m_clients[&winclient] = app; | 331 | m_clients[&winclient] = app; |
332 | p->addMatch(); | 332 | p->addMatch(); |
333 | m_pats->push_back(make_pair(p, app)); | 333 | m_pats->push_back(make_pair(p, app)); |
diff --git a/src/Window.cc b/src/Window.cc index eb2f398..74deb9b 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -246,6 +246,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm, | |||
246 | m_layersig(*this), | 246 | m_layersig(*this), |
247 | m_workspacesig(*this), | 247 | m_workspacesig(*this), |
248 | m_themelistener(*this), | 248 | m_themelistener(*this), |
249 | m_creation_time(0), | ||
249 | moving(false), resizing(false), shaded(false), iconic(false), | 250 | moving(false), resizing(false), shaded(false), iconic(false), |
250 | stuck(false), m_initialized(false), fullscreen(false), | 251 | stuck(false), m_initialized(false), fullscreen(false), |
251 | maximized(MAX_NONE), | 252 | maximized(MAX_NONE), |
@@ -551,6 +552,10 @@ void FluxboxWindow::init() { | |||
551 | m_focused = false; | 552 | m_focused = false; |
552 | } | 553 | } |
553 | 554 | ||
555 | struct timeval now; | ||
556 | gettimeofday(&now, NULL); | ||
557 | m_creation_time = now.tv_sec; | ||
558 | |||
554 | sendConfigureNotify(); | 559 | sendConfigureNotify(); |
555 | 560 | ||
556 | if (m_shaped) | 561 | if (m_shaped) |
@@ -2567,23 +2572,49 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) { | |||
2567 | if (client == 0 || isIconic()) | 2572 | if (client == 0 || isIconic()) |
2568 | return; | 2573 | return; |
2569 | 2574 | ||
2570 | int cx = frame().x(), cy = frame().y(), ignore = 0; | 2575 | int old_x = frame().x(), old_y = frame().y(); |
2571 | unsigned int cw = frame().width(), ch = frame().height(); | 2576 | unsigned int old_w = frame().width(); |
2577 | unsigned int old_h = frame().height() - frame().titlebarHeight() | ||
2578 | + frame().handleHeight(); | ||
2579 | int cx = old_x, cy = old_y, ignore = 0; | ||
2580 | unsigned int cw = old_w, ch = old_h; | ||
2572 | 2581 | ||
2573 | // make sure the new width/height would be ok with all clients, or else they | 2582 | // make sure the new width/height would be ok with all clients, or else they |
2574 | // could try to resize the window back and forth | 2583 | // could try to resize the window back and forth |
2575 | if (client != m_client && | 2584 | if (cr.value_mask & CWWidth || cr.value_mask & CWHeight) { |
2576 | cr.value_mask & CWWidth && cr.value_mask & CWHeight) { | 2585 | int new_w = (cr.value_mask & CWWidth) ? cr.width : cw; |
2586 | int new_h = (cr.value_mask & CWHeight) ? cr.height : ch; | ||
2577 | ClientList::iterator it = clientList().begin(); | 2587 | ClientList::iterator it = clientList().begin(); |
2578 | ClientList::iterator it_end = clientList().end(); | 2588 | ClientList::iterator it_end = clientList().end(); |
2579 | for (; it != it_end; ++it) { | 2589 | for (; it != it_end; ++it) { |
2580 | if (!m_client->checkSizeHints(cr.width, cr.height)) { | 2590 | if (*it != client && !(*it)->checkSizeHints(new_w, new_h)) { |
2581 | sendConfigureNotify(); | 2591 | sendConfigureNotify(); |
2582 | return; | 2592 | return; |
2583 | } | 2593 | } |
2584 | } | 2594 | } |
2585 | } | 2595 | } |
2586 | 2596 | ||
2597 | #ifdef REMEMBER | ||
2598 | // don't let misbehaving clients (e.g. MPlayer) move/resize their windows | ||
2599 | // just after creation if the user has a saved position/size | ||
2600 | if (m_creation_time) { | ||
2601 | struct timeval now; | ||
2602 | gettimeofday(&now, NULL); | ||
2603 | |||
2604 | if (now.tv_sec > m_creation_time + 1) | ||
2605 | m_creation_time = 0; | ||
2606 | else { | ||
2607 | if (Remember::instance().isRemembered(*client, | ||
2608 | Remember::REM_DIMENSIONS)) | ||
2609 | cr.value_mask = cr.value_mask & ~(CWWidth | CWHeight); | ||
2610 | |||
2611 | if (Remember::instance().isRemembered(*client, | ||
2612 | Remember::REM_POSITION)) | ||
2613 | cr.value_mask = cr.value_mask & ~(CWX | CWY); | ||
2614 | } | ||
2615 | } | ||
2616 | #endif // REMEMBER | ||
2617 | |||
2587 | if (cr.value_mask & CWBorderWidth) | 2618 | if (cr.value_mask & CWBorderWidth) |
2588 | client->old_bw = cr.border_width; | 2619 | client->old_bw = cr.border_width; |
2589 | 2620 | ||
@@ -2603,24 +2634,20 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) { | |||
2603 | frame().setActiveGravity(client->gravity(), client->old_bw); | 2634 | frame().setActiveGravity(client->gravity(), client->old_bw); |
2604 | } | 2635 | } |
2605 | 2636 | ||
2606 | if (cr.value_mask & CWWidth) { | 2637 | if (cr.value_mask & CWWidth) |
2607 | cw = cr.width; | 2638 | cw = cr.width; |
2608 | // we must set this now, or else window grows when height not specified | ||
2609 | ch -= (frame().titlebarHeight() + frame().handleHeight()); | ||
2610 | } | ||
2611 | 2639 | ||
2612 | if (cr.value_mask & CWHeight) | 2640 | if (cr.value_mask & CWHeight) |
2613 | ch = cr.height; | 2641 | ch = cr.height; |
2614 | 2642 | ||
2615 | // whether we should send ConfigureNotify to netizens | 2643 | // whether we should send ConfigureNotify to netizens |
2616 | // the request is for client window so we resize the frame to it first | 2644 | // the request is for client window so we resize the frame to it first |
2617 | // NOTE: this might not work correctly if client actually requests that size | 2645 | if (old_w != cw || old_h != ch) { |
2618 | if (frame().width() != cw || frame().height() != ch) { | 2646 | if (old_x != cx || old_y != cy) |
2619 | if (frame().x() != cx || frame().y() != cy) | ||
2620 | frame().moveResizeForClient(cx, cy, cw, ch); | 2647 | frame().moveResizeForClient(cx, cy, cw, ch); |
2621 | else | 2648 | else |
2622 | frame().resizeForClient(cw, ch); | 2649 | frame().resizeForClient(cw, ch); |
2623 | } else if (frame().x() != cx || frame().y() != cy) { | 2650 | } else if (old_x != cx || old_y != cy) { |
2624 | frame().move(cx, cy); | 2651 | frame().move(cx, cy); |
2625 | } | 2652 | } |
2626 | 2653 | ||
diff --git a/src/Window.hh b/src/Window.hh index fa5b305..cb32768 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -566,6 +566,8 @@ private: | |||
566 | }; | 566 | }; |
567 | ThemeListener m_themelistener; | 567 | ThemeListener m_themelistener; |
568 | 568 | ||
569 | time_t m_creation_time; | ||
570 | |||
569 | // Window states | 571 | // Window states |
570 | bool moving, resizing, shaded, iconic, | 572 | bool moving, resizing, shaded, iconic, |
571 | stuck, m_initialized, fullscreen; | 573 | stuck, m_initialized, fullscreen; |