diff options
author | rathnor <rathnor> | 2002-09-12 14:55:11 (GMT) |
---|---|---|
committer | rathnor <rathnor> | 2002-09-12 14:55:11 (GMT) |
commit | e54676573689d353bf53a4d6225ba1206ddf10fa (patch) | |
tree | 1f7dcc90b3613f46f469dcece4acf5ebfbe81221 /src/Tab.cc | |
parent | 8a728b46fd05b872b5daf9632af478f1c098dd4f (diff) | |
download | fluxbox_pavel-e54676573689d353bf53a4d6225ba1206ddf10fa.zip fluxbox_pavel-e54676573689d353bf53a4d6225ba1206ddf10fa.tar.bz2 |
Fixes to sticky window + focus handling. Particularly for
next/prevFocus crashes. Also, sticky windows are now always reassociated
to the active workspace.
Diffstat (limited to 'src/Tab.cc')
-rw-r--r-- | src/Tab.cc | 23 |
1 files changed, 14 insertions, 9 deletions
@@ -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: Tab.cc,v 1.32 2002/09/08 19:41:59 fluxgen Exp $ | 22 | // $Id: Tab.cc,v 1.33 2002/09/12 14:55:11 rathnor Exp $ |
23 | 23 | ||
24 | #include "Tab.hh" | 24 | #include "Tab.hh" |
25 | 25 | ||
@@ -283,20 +283,24 @@ void Tab::withdraw() { | |||
283 | void Tab::stick() { | 283 | void Tab::stick() { |
284 | Tab *tab; | 284 | Tab *tab; |
285 | 285 | ||
286 | bool wasstuck = m_win->isStuck(); | ||
287 | |||
286 | //now do stick for all windows in the list | 288 | //now do stick for all windows in the list |
287 | for (tab = getFirst(this); tab != 0; tab = tab->m_next) { | 289 | for (tab = getFirst(this); tab != 0; tab = tab->m_next) { |
288 | FluxboxWindow *win = tab->m_win; //just for convenience | 290 | FluxboxWindow *win = tab->m_win; //just for convenience |
289 | if (win->isStuck()) { | 291 | if (wasstuck) { |
290 | win->blackbox_attrib.flags ^= BaseDisplay::ATTRIB_OMNIPRESENT; | 292 | win->blackbox_attrib.flags ^= BaseDisplay::ATTRIB_OMNIPRESENT; |
291 | win->blackbox_attrib.attrib ^= BaseDisplay::ATTRIB_OMNIPRESENT; | 293 | win->blackbox_attrib.attrib ^= BaseDisplay::ATTRIB_OMNIPRESENT; |
292 | win->stuck = false; | 294 | win->stuck = false; |
293 | if (!win->isIconic()) { | ||
294 | BScreen *screen = win->getScreen(); | ||
295 | screen->reassociateWindow(win, screen->getCurrentWorkspace()->workspaceID(), true); | ||
296 | } | ||
297 | 295 | ||
298 | } else { | 296 | } else { |
299 | win->stuck = true; | 297 | win->stuck = true; |
298 | BScreen *screen = win->getScreen(); | ||
299 | if (!win->isIconic() && !(win->getWorkspaceNumber() != | ||
300 | screen->getCurrentWorkspaceID())) { | ||
301 | screen->reassociateWindow(win, screen->getCurrentWorkspaceID(), true); | ||
302 | } | ||
303 | |||
300 | win->blackbox_attrib.flags |= BaseDisplay::ATTRIB_OMNIPRESENT; | 304 | win->blackbox_attrib.flags |= BaseDisplay::ATTRIB_OMNIPRESENT; |
301 | win->blackbox_attrib.attrib |= BaseDisplay::ATTRIB_OMNIPRESENT; | 305 | win->blackbox_attrib.attrib |= BaseDisplay::ATTRIB_OMNIPRESENT; |
302 | } | 306 | } |
@@ -936,9 +940,10 @@ void Tab::insert(Tab *tab) { | |||
936 | for (; last->m_next!=0; last=last->m_next); | 940 | for (; last->m_next!=0; last=last->m_next); |
937 | //do sticky before we connect it to the chain | 941 | //do sticky before we connect it to the chain |
938 | //sticky bit on window | 942 | //sticky bit on window |
939 | if (m_win->isStuck() && !tab->m_win->isStuck() || | 943 | if (m_win->isStuck() != tab->m_win->isStuck()) { |
940 | !m_win->isStuck() && tab->m_win->isStuck()) | 944 | tab->m_win->stuck = !m_win->stuck; // it will toggle |
941 | tab->m_win->stick(); //this will set all the m_wins in the list | 945 | tab->stick(); //this will set all the m_wins in the list |
946 | } | ||
942 | 947 | ||
943 | //connect the tab to this chain | 948 | //connect the tab to this chain |
944 | 949 | ||