summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-07-10 22:24:48 +0000
committerDana Jansens <danakj@orodu.net>2002-07-10 22:24:48 +0000
commit9e99a9a1e21b7b7214b17a759e58efd00b254551 (patch)
treea5068122443613e868a117fe76cc0fcde07f164e /src
parentb21cf8b33520e44611657e2876131b67dc0472d6 (diff)
sync with bb cvs
Diffstat (limited to 'src')
-rw-r--r--src/Rootmenu.cc10
-rw-r--r--src/Screen.cc55
-rw-r--r--src/Toolbar.cc1
-rw-r--r--src/Toolbar.hh2
-rw-r--r--src/Workspace.cc75
-rw-r--r--src/Workspace.hh1
-rw-r--r--src/blackbox.cc10
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);