diff options
| author | Dana Jansens <danakj@orodu.net> | 2002-07-10 22:24:48 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2002-07-10 22:24:48 +0000 |
| commit | 9e99a9a1e21b7b7214b17a759e58efd00b254551 (patch) | |
| tree | a5068122443613e868a117fe76cc0fcde07f164e /src | |
| parent | b21cf8b33520e44611657e2876131b67dc0472d6 (diff) | |
sync with bb cvs
Diffstat (limited to 'src')
| -rw-r--r-- | src/Rootmenu.cc | 10 | ||||
| -rw-r--r-- | src/Screen.cc | 55 | ||||
| -rw-r--r-- | src/Toolbar.cc | 1 | ||||
| -rw-r--r-- | src/Toolbar.hh | 2 | ||||
| -rw-r--r-- | src/Workspace.cc | 75 | ||||
| -rw-r--r-- | src/Workspace.hh | 1 | ||||
| -rw-r--r-- | src/blackbox.cc | 10 |
7 files changed, 85 insertions, 69 deletions
diff --git a/src/Rootmenu.cc b/src/Rootmenu.cc index 148c1fca..3395b4f7 100644 --- a/src/Rootmenu.cc +++ b/src/Rootmenu.cc @@ -61,6 +61,11 @@ void Rootmenu::itemSelected(int button, unsigned int index) { if (! item->function()) return; + if (! (getScreen()->getRootmenu()->isTorn() || isTorn()) && + item->function() != BScreen::Reconfigure && + item->function() != BScreen::SetStyle) + hide(); + switch (item->function()) { case BScreen::Execute: if (item->exec()) @@ -88,9 +93,4 @@ void Rootmenu::itemSelected(int button, unsigned int index) { getScreen()->getBlackbox()->reconfigure(); return; } - - if (! (getScreen()->getRootmenu()->isTorn() || isTorn()) && - item->function() != BScreen::Reconfigure && - item->function() != BScreen::SetStyle) - hide(); } diff --git a/src/Screen.cc b/src/Screen.cc index 1b3860f4..cebd21c0 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1015,41 +1015,38 @@ unsigned int BScreen::removeLastWorkspace(void) { void BScreen::changeWorkspaceID(unsigned int id) { - if (! current_workspace) return; - - if (id != current_workspace->getID()) { - BlackboxWindow *focused = blackbox->getFocusedWindow(); - if (focused && focused->getScreen() == this && ! focused->isStuck()) { - if (focused->getWorkspaceNumber() != current_workspace->getID()) { - fprintf(stderr, "%s is on the wrong workspace, aborting\n", - focused->getTitle()); - abort(); - } - current_workspace->setLastFocusedWindow(focused); - } else { - // if no window had focus, no need to store a last focus - current_workspace->setLastFocusedWindow((BlackboxWindow *) 0); - } - // when we switch workspaces, unfocus whatever was focused - blackbox->setFocusedWindow((BlackboxWindow *) 0); + if (! current_workspace || id == current_workspace->getID()) return; + + BlackboxWindow *focused = blackbox->getFocusedWindow(); + if (focused && focused->getScreen() == this) { + assert(focused->isStuck() || + focused->getWorkspaceNumber() == current_workspace->getID()); + + current_workspace->setLastFocusedWindow(focused); + } else { + // if no window had focus, no need to store a last focus + current_workspace->setLastFocusedWindow((BlackboxWindow *) 0); + } + + // when we switch workspaces, unfocus whatever was focused + blackbox->setFocusedWindow((BlackboxWindow *) 0); - current_workspace->hideAll(); - workspacemenu->setItemSelected(current_workspace->getID() + 2, False); + current_workspace->hideAll(); + workspacemenu->setItemSelected(current_workspace->getID() + 2, False); - current_workspace = getWorkspace(id); + current_workspace = getWorkspace(id); - xatom->setValue(getRootWindow(), XAtom::net_current_desktop, - XAtom::cardinal, id); + xatom->setValue(getRootWindow(), XAtom::net_current_desktop, + XAtom::cardinal, id); - workspacemenu->setItemSelected(current_workspace->getID() + 2, True); - toolbar->redrawWorkspaceLabel(True); + workspacemenu->setItemSelected(current_workspace->getID() + 2, True); + toolbar->redrawWorkspaceLabel(True); - current_workspace->showAll(); + current_workspace->showAll(); - if (resource.focus_last && current_workspace->getLastFocusedWindow()) { - XSync(blackbox->getXDisplay(), False); - current_workspace->getLastFocusedWindow()->setInputFocus(); - } + if (resource.focus_last && current_workspace->getLastFocusedWindow()) { + XSync(blackbox->getXDisplay(), False); + current_workspace->getLastFocusedWindow()->setInputFocus(); } updateNetizenCurrentWorkspace(); diff --git a/src/Toolbar.cc b/src/Toolbar.cc index dac1ad7f..23a45608 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -96,7 +96,6 @@ Toolbar::Toolbar(BScreen *scrn) { editing = False; new_name_pos = 0; - frame.grab_x = frame.grab_y = 0; toolbarmenu = new Toolbarmenu(this); diff --git a/src/Toolbar.hh b/src/Toolbar.hh index ae8353ba..f95d6a55 100644 --- a/src/Toolbar.hh +++ b/src/Toolbar.hh @@ -90,7 +90,7 @@ private: Window window, workspace_label, window_label, clock, psbutton, nsbutton, pwbutton, nwbutton; - int x_hidden, y_hidden, hour, minute, grab_x, grab_y; + int x_hidden, y_hidden, hour, minute; unsigned int window_label_w, workspace_label_w, clock_w, button_w, bevel_w, label_h; diff --git a/src/Workspace.cc b/src/Workspace.cc index 90a83b26..9606140d 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -102,39 +102,19 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) { // pass focus to the next appropriate window if ((w->isFocused() || w == lastfocus) && ! screen->getBlackbox()->doShutdown()) { - BlackboxWindow *newfocus = 0; - if (w->isTransient()) { - newfocus = w->getTransientFor(); - if (newfocus && - (newfocus->isIconic() || // do not focus icons - newfocus->getWorkspaceNumber() != id)) // or other workspaces - newfocus = 0; - } - if (! newfocus && ! stackingList.empty()) - newfocus = stackingList.front(); - - assert(newfocus != w); // this would be very wrong. - if (id == screen->getCurrentWorkspaceID()) { - /* - if the window is on the visible workspace, then try focus it, and fall - back to the default focus target if the window won't focus. - */ - if (! (newfocus && newfocus->setInputFocus())) - screen->getBlackbox()->setFocusedWindow(0); - } else if (lastfocus == w) { - /* - If this workspace is not the current one do not assume that - w == lastfocus. If a sticky window is removed on a workspace other - than where it originated, it will fire the removeWindow on a - non-visible workspace. - */ - - /* - If the window isn't on the visible workspace, don't focus the new one, - just mark it to be focused when the workspace comes into view. - */ - setLastFocusedWindow(newfocus); + // The window is on the visible workspace + focusFallback(w); + } else { + // The window is not on the visible workspace. + if (lastfocus == w) { + // The window was the last-focus target, so we need to replace it. + setLastFocusedWindow(stackingList.front()); + } + // if the window focused on the current workspace, then reapply that + // workspace's focus too + if (w->isFocused()) + screen->getCurrentWorkspace()->focusFallback(w); } } @@ -157,6 +137,37 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) { } +void Workspace::focusFallback(const BlackboxWindow *old_window) { + BlackboxWindow *newfocus = 0; + + // if it's a transient, then try to focus its parent + if (old_window && old_window->isTransient()) { + newfocus = old_window->getTransientFor(); + + if (! newfocus || + newfocus->isIconic() || // do not focus icons + newfocus->getWorkspaceNumber() != id || // or other workspaces + ! newfocus->setInputFocus()) + newfocus = 0; + } + + if (! newfocus) { + BlackboxWindowList::iterator it = stackingList.begin(), + end = stackingList.end(); + for (; it != end; ++it) { + BlackboxWindow *tmp = *it; + if (tmp && tmp->setInputFocus()) { + // we found our new focus target + newfocus = tmp; + break; + } + } + } + + screen->getBlackbox()->setFocusedWindow(newfocus); +} + + void Workspace::showAll(void) { std::for_each(stackingList.begin(), stackingList.end(), std::mem_fun(&BlackboxWindow::show)); diff --git a/src/Workspace.hh b/src/Workspace.hh index 0059e293..0916dce7 100644 --- a/src/Workspace.hh +++ b/src/Workspace.hh @@ -87,6 +87,7 @@ public: BlackboxWindow* getPrevWindowInList(BlackboxWindow *w); BlackboxWindow* getTopWindowOnStack(void) const; void sendWindowList(Netizen &n); + void focusFallback(const BlackboxWindow *old_window); bool isCurrent(void) const; bool isLastWindow(const BlackboxWindow* w) const; diff --git a/src/blackbox.cc b/src/blackbox.cc index dafc6bdf..9eddcfdf 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -328,10 +328,18 @@ void Blackbox::process_event(XEvent *e) { BlackboxWindow *win = searchWindow(e->xmaprequest.window); if (win) { + bool focus = False; if (win->isIconic()) { win->deiconify(); - win->setInputFocus(); + focus = True; + } + if (win->isShaded()) { + win->shade(); + focus = True; } + + if (focus && (win->isTransient() || win->getScreen()->doFocusNew())) + win->setInputFocus(); } else { BScreen *screen = searchScreen(e->xmaprequest.parent); |
