diff options
author | markt <markt> | 2006-07-20 03:25:28 (GMT) |
---|---|---|
committer | markt <markt> | 2006-07-20 03:25:28 (GMT) |
commit | f4d1af12083863f1aa63c88e3eb55a9317758fc1 (patch) | |
tree | 77bc2a47dd8f7d2df24afeae506452ab535746ae | |
parent | a736f12ac58ec8e60b01ee38dc244b6850d87e21 (diff) | |
download | fluxbox-f4d1af12083863f1aa63c88e3eb55a9317758fc1.zip fluxbox-f4d1af12083863f1aa63c88e3eb55a9317758fc1.tar.bz2 |
keep tabs in same order on restart (except some extremely unlikely cases)
-rw-r--r-- | src/Screen.cc | 26 | ||||
-rw-r--r-- | src/Screen.hh | 4 | ||||
-rw-r--r-- | src/WinClient.cc | 2 | ||||
-rw-r--r-- | src/Window.cc | 4 |
4 files changed, 20 insertions, 16 deletions
diff --git a/src/Screen.cc b/src/Screen.cc index 73af5e9..a8f02c2 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -1343,7 +1343,8 @@ FluxboxWindow *BScreen::createWindow(Window client) { | |||
1343 | 1343 | ||
1344 | // check if it should be grouped with something else | 1344 | // check if it should be grouped with something else |
1345 | FluxboxWindow *win; | 1345 | FluxboxWindow *win; |
1346 | if ((win = findGroupLeft(*winclient)) != 0) { | 1346 | WinClient *other; |
1347 | if ((other = findGroupLeft(*winclient)) && (win = other->fbwindow())) { | ||
1347 | win->attachClient(*winclient); | 1348 | win->attachClient(*winclient); |
1348 | Fluxbox::instance()->attachSignals(*winclient); | 1349 | Fluxbox::instance()->attachSignals(*winclient); |
1349 | } else { | 1350 | } else { |
@@ -1369,11 +1370,10 @@ FluxboxWindow *BScreen::createWindow(Window client) { | |||
1369 | 1370 | ||
1370 | // we also need to check if another window expects this window to the left | 1371 | // we also need to check if another window expects this window to the left |
1371 | // and if so, then join it. | 1372 | // and if so, then join it. |
1372 | FluxboxWindow *otherwin = 0; | 1373 | if ((other = findGroupRight(*winclient)) && other->fbwindow() != win) |
1373 | // TODO: does this do the right stuff focus-wise? | 1374 | win->attachClient(*other); |
1374 | if ((otherwin = findGroupRight(*winclient)) && otherwin != win) { | 1375 | else if (other) |
1375 | win->attachClient(otherwin->winClient()); | 1376 | win->moveClientRightOf(*other, *winclient); |
1376 | } | ||
1377 | 1377 | ||
1378 | m_clientlist_sig.notify(); | 1378 | m_clientlist_sig.notify(); |
1379 | 1379 | ||
@@ -2034,10 +2034,10 @@ void BScreen::updateSize() { | |||
2034 | 2034 | ||
2035 | 2035 | ||
2036 | /** | 2036 | /** |
2037 | * Find the group of windows to this window's left | 2037 | * Find the winclient to this window's left |
2038 | * So, we check the leftgroup hint, and see if we know any windows | 2038 | * So, we check the leftgroup hint, and see if we know any windows |
2039 | */ | 2039 | */ |
2040 | FluxboxWindow *BScreen::findGroupLeft(WinClient &winclient) { | 2040 | WinClient *BScreen::findGroupLeft(WinClient &winclient) { |
2041 | Window w = winclient.getGroupLeftWindow(); | 2041 | Window w = winclient.getGroupLeftWindow(); |
2042 | if (w == None) | 2042 | if (w == None) |
2043 | return 0; | 2043 | return 0; |
@@ -2051,13 +2051,10 @@ FluxboxWindow *BScreen::findGroupLeft(WinClient &winclient) { | |||
2051 | // something is not consistent | 2051 | // something is not consistent |
2052 | return 0; | 2052 | return 0; |
2053 | 2053 | ||
2054 | if (have_client) | 2054 | return have_client; |
2055 | return have_client->fbwindow(); | ||
2056 | else | ||
2057 | return 0; | ||
2058 | } | 2055 | } |
2059 | 2056 | ||
2060 | FluxboxWindow *BScreen::findGroupRight(WinClient &winclient) { | 2057 | WinClient *BScreen::findGroupRight(WinClient &winclient) { |
2061 | Groupables::iterator it = m_expecting_groups.find(winclient.window()); | 2058 | Groupables::iterator it = m_expecting_groups.find(winclient.window()); |
2062 | if (it == m_expecting_groups.end()) | 2059 | if (it == m_expecting_groups.end()) |
2063 | return 0; | 2060 | return 0; |
@@ -2073,8 +2070,9 @@ FluxboxWindow *BScreen::findGroupRight(WinClient &winclient) { | |||
2073 | other->getGroupLeftWindow() != None) | 2070 | other->getGroupLeftWindow() != None) |
2074 | return 0; | 2071 | return 0; |
2075 | 2072 | ||
2076 | return other->fbwindow(); | 2073 | return other; |
2077 | } | 2074 | } |
2075 | |||
2078 | void BScreen::initXinerama() { | 2076 | void BScreen::initXinerama() { |
2079 | #ifdef XINERAMA | 2077 | #ifdef XINERAMA |
2080 | Display *display = FbTk::App::instance()->display(); | 2078 | Display *display = FbTk::App::instance()->display(); |
diff --git a/src/Screen.hh b/src/Screen.hh index 0a96df2..0a1eaf8 100644 --- a/src/Screen.hh +++ b/src/Screen.hh | |||
@@ -327,8 +327,8 @@ public: | |||
327 | // grouping - we want ordering, so we can either search for a | 327 | // grouping - we want ordering, so we can either search for a |
328 | // group to the left, or to the right (they'll be different if | 328 | // group to the left, or to the right (they'll be different if |
329 | // they exist). | 329 | // they exist). |
330 | FluxboxWindow *findGroupLeft(WinClient &winclient); | 330 | WinClient *findGroupLeft(WinClient &winclient); |
331 | FluxboxWindow *findGroupRight(WinClient &winclient); | 331 | WinClient *findGroupRight(WinClient &winclient); |
332 | 332 | ||
333 | // notify netizens | 333 | // notify netizens |
334 | void updateNetizenCurrentWorkspace(); | 334 | void updateNetizenCurrentWorkspace(); |
diff --git a/src/WinClient.cc b/src/WinClient.cc index 1ede4d8..4e508fb 100644 --- a/src/WinClient.cc +++ b/src/WinClient.cc | |||
@@ -623,6 +623,8 @@ Window WinClient::getGroupLeftWindow() const { | |||
623 | 623 | ||
624 | 624 | ||
625 | void WinClient::setGroupLeftWindow(Window win) { | 625 | void WinClient::setGroupLeftWindow(Window win) { |
626 | if (m_screen.isShuttingdown()) | ||
627 | return; | ||
626 | Atom group_left_hint = XInternAtom(display(), "_FLUXBOX_GROUP_LEFT", False); | 628 | Atom group_left_hint = XInternAtom(display(), "_FLUXBOX_GROUP_LEFT", False); |
627 | changeProperty(group_left_hint, XA_WINDOW, 32, | 629 | changeProperty(group_left_hint, XA_WINDOW, 32, |
628 | PropModeReplace, (unsigned char *) &win, 1); | 630 | PropModeReplace, (unsigned char *) &win, 1); |
diff --git a/src/Window.cc b/src/Window.cc index f9581ed..2bb19a2 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -628,6 +628,7 @@ void FluxboxWindow::attachClient(WinClient &client, int x, int y) { | |||
628 | WinClient *was_focused = 0; | 628 | WinClient *was_focused = 0; |
629 | WinClient *focused_win = FocusControl::focusedWindow(); | 629 | WinClient *focused_win = FocusControl::focusedWindow(); |
630 | 630 | ||
631 | WinClient *other = m_screen.findGroupLeft(client); | ||
631 | // get the current window on the end of our client list | 632 | // get the current window on the end of our client list |
632 | Window leftwin = None; | 633 | Window leftwin = None; |
633 | if (!clientList().empty()) | 634 | if (!clientList().empty()) |
@@ -691,6 +692,9 @@ void FluxboxWindow::attachClient(WinClient &client, int x, int y) { | |||
691 | 692 | ||
692 | client.saveBlackboxAttribs(m_blackbox_attrib); | 693 | client.saveBlackboxAttribs(m_blackbox_attrib); |
693 | m_clientlist.push_back(&client); | 694 | m_clientlist.push_back(&client); |
695 | |||
696 | if (other && other->fbwindow() == this) | ||
697 | moveClientRightOf(client, *other); | ||
694 | } | 698 | } |
695 | 699 | ||
696 | // make sure that the state etc etc is updated for the new client | 700 | // make sure that the state etc etc is updated for the new client |