summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Remember.cc12
-rw-r--r--src/Window.cc53
-rw-r--r--src/Window.hh2
3 files changed, 48 insertions, 19 deletions
diff --git a/src/Remember.cc b/src/Remember.cc
index 30a3e14..aec9921 100644
--- a/src/Remember.cc
+++ b/src/Remember.cc
@@ -319,15 +319,15 @@ Application * Remember::add(WinClient &winclient) {
319 Application *app = new Application(0); 319 Application *app = new Application(0);
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 1bfab7f..3a2801b 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -249,6 +249,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, FbWinFrameTheme &tm,
249 m_titlesig(*this), 249 m_titlesig(*this),
250 m_attentionsig(*this), 250 m_attentionsig(*this),
251 m_themelistener(*this), 251 m_themelistener(*this),
252 m_creation_time(0),
252 moving(false), resizing(false), shaded(false), 253 moving(false), resizing(false), shaded(false),
253 iconic(false), focused(false), 254 iconic(false), focused(false),
254 stuck(false), m_initialized(false), fullscreen(false), 255 stuck(false), m_initialized(false), fullscreen(false),
@@ -537,6 +538,10 @@ void FluxboxWindow::init() {
537 } else 538 } else
538 deiconify(false); 539 deiconify(false);
539 540
541 struct timeval now;
542 gettimeofday(&now, NULL);
543 m_creation_time = now.tv_sec;
544
540 sendConfigureNotify(); 545 sendConfigureNotify();
541 // no focus default 546 // no focus default
542 setFocusFlag(false); 547 setFocusFlag(false);
@@ -2561,23 +2566,49 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) {
2561 if (client == 0 || isIconic()) 2566 if (client == 0 || isIconic())
2562 return; 2567 return;
2563 2568
2564 int cx = frame().x(), cy = frame().y(), ignore = 0; 2569 int old_x = frame().x(), old_y = frame().y();
2565 unsigned int cw = frame().width(), ch = frame().height(); 2570 unsigned int old_w = frame().width();
2571 unsigned int old_h = frame().height() - frame().titlebarHeight()
2572 + frame().handleHeight();
2573 int cx = old_x, cy = old_y, ignore = 0;
2574 unsigned int cw = old_w, ch = old_h;
2566 2575
2567 // make sure the new width/height would be ok with all clients, or else they 2576 // make sure the new width/height would be ok with all clients, or else they
2568 // could try to resize the window back and forth 2577 // could try to resize the window back and forth
2569 if (client != m_client && 2578 if (cr.value_mask & CWWidth || cr.value_mask & CWHeight) {
2570 cr.value_mask & CWWidth && cr.value_mask & CWHeight) { 2579 int new_w = (cr.value_mask & CWWidth) ? cr.width : cw;
2580 int new_h = (cr.value_mask & CWHeight) ? cr.height : ch;
2571 ClientList::iterator it = clientList().begin(); 2581 ClientList::iterator it = clientList().begin();
2572 ClientList::iterator it_end = clientList().end(); 2582 ClientList::iterator it_end = clientList().end();
2573 for (; it != it_end; ++it) { 2583 for (; it != it_end; ++it) {
2574 if (!m_client->checkSizeHints(cr.width, cr.height)) { 2584 if (*it != client && !(*it)->checkSizeHints(new_w, new_h)) {
2575 sendConfigureNotify(); 2585 sendConfigureNotify();
2576 return; 2586 return;
2577 } 2587 }
2578 } 2588 }
2579 } 2589 }
2580 2590
2591#ifdef REMEMBER
2592 // don't let misbehaving clients (e.g. MPlayer) move/resize their windows
2593 // just after creation if the user has a saved position/size
2594 if (m_creation_time) {
2595 struct timeval now;
2596 gettimeofday(&now, NULL);
2597
2598 if (now.tv_sec > m_creation_time + 1)
2599 m_creation_time = 0;
2600 else {
2601 if (Remember::instance().isRemembered(*client,
2602 Remember::REM_DIMENSIONS))
2603 cr.value_mask = cr.value_mask & ~(CWWidth | CWHeight);
2604
2605 if (Remember::instance().isRemembered(*client,
2606 Remember::REM_POSITION))
2607 cr.value_mask = cr.value_mask & ~(CWX | CWY);
2608 }
2609 }
2610#endif // REMEMBER
2611
2581 if (cr.value_mask & CWBorderWidth) 2612 if (cr.value_mask & CWBorderWidth)
2582 client->old_bw = cr.border_width; 2613 client->old_bw = cr.border_width;
2583 2614
@@ -2597,24 +2628,20 @@ void FluxboxWindow::configureRequestEvent(XConfigureRequestEvent &cr) {
2597 frame().setActiveGravity(client->gravity(), client->old_bw); 2628 frame().setActiveGravity(client->gravity(), client->old_bw);
2598 } 2629 }
2599 2630
2600 if (cr.value_mask & CWWidth) { 2631 if (cr.value_mask & CWWidth)
2601 cw = cr.width; 2632 cw = cr.width;
2602 // we must set this now, or else window grows when height not specified
2603 ch -= (frame().titlebarHeight() + frame().handleHeight());
2604 }
2605 2633
2606 if (cr.value_mask & CWHeight) 2634 if (cr.value_mask & CWHeight)
2607 ch = cr.height; 2635 ch = cr.height;
2608 2636
2609 // whether we should send ConfigureNotify to netizens 2637 // whether we should send ConfigureNotify to netizens
2610 // the request is for client window so we resize the frame to it first 2638 // the request is for client window so we resize the frame to it first
2611 // NOTE: this might not work correctly if client actually requests that size 2639 if (old_w != cw || old_h != ch) {
2612 if (frame().width() != cw || frame().height() != ch) { 2640 if (old_x != cx || old_y != cy)
2613 if (frame().x() != cx || frame().y() != cy)
2614 frame().moveResizeForClient(cx, cy, cw, ch); 2641 frame().moveResizeForClient(cx, cy, cw, ch);
2615 else 2642 else
2616 frame().resizeForClient(cw, ch); 2643 frame().resizeForClient(cw, ch);
2617 } else if (frame().x() != cx || frame().y() != cy) { 2644 } else if (old_x != cx || old_y != cy) {
2618 frame().move(cx, cy); 2645 frame().move(cx, cy);
2619 } 2646 }
2620 2647
diff --git a/src/Window.hh b/src/Window.hh
index d9e4a7c..340df7b 100644
--- a/src/Window.hh
+++ b/src/Window.hh
@@ -514,6 +514,8 @@ private:
514 }; 514 };
515 ThemeListener m_themelistener; 515 ThemeListener m_themelistener;
516 516
517 time_t m_creation_time;
518
517 // Window states 519 // Window states
518 bool moving, resizing, shaded, iconic, 520 bool moving, resizing, shaded, iconic,
519 focused, stuck, m_initialized, fullscreen; 521 focused, stuck, m_initialized, fullscreen;