sync with bb cvs

This commit is contained in:
Dana Jansens 2002-07-10 22:24:48 +00:00
parent b21cf8b335
commit 9e99a9a1e2
8 changed files with 88 additions and 71 deletions

View file

@ -61,6 +61,11 @@ void Rootmenu::itemSelected(int button, unsigned int index) {
if (! item->function()) if (! item->function())
return; return;
if (! (getScreen()->getRootmenu()->isTorn() || isTorn()) &&
item->function() != BScreen::Reconfigure &&
item->function() != BScreen::SetStyle)
hide();
switch (item->function()) { switch (item->function()) {
case BScreen::Execute: case BScreen::Execute:
if (item->exec()) if (item->exec())
@ -88,9 +93,4 @@ void Rootmenu::itemSelected(int button, unsigned int index) {
getScreen()->getBlackbox()->reconfigure(); getScreen()->getBlackbox()->reconfigure();
return; return;
} }
if (! (getScreen()->getRootmenu()->isTorn() || isTorn()) &&
item->function() != BScreen::Reconfigure &&
item->function() != BScreen::SetStyle)
hide();
} }

View file

@ -1015,41 +1015,38 @@ unsigned int BScreen::removeLastWorkspace(void) {
void BScreen::changeWorkspaceID(unsigned int id) { void BScreen::changeWorkspaceID(unsigned int id) {
if (! current_workspace) return; if (! current_workspace || id == current_workspace->getID()) return;
if (id != current_workspace->getID()) { BlackboxWindow *focused = blackbox->getFocusedWindow();
BlackboxWindow *focused = blackbox->getFocusedWindow(); if (focused && focused->getScreen() == this) {
if (focused && focused->getScreen() == this && ! focused->isStuck()) { assert(focused->isStuck() ||
if (focused->getWorkspaceNumber() != current_workspace->getID()) { focused->getWorkspaceNumber() == current_workspace->getID());
fprintf(stderr, "%s is on the wrong workspace, aborting\n",
focused->getTitle()); current_workspace->setLastFocusedWindow(focused);
abort(); } else {
} // if no window had focus, no need to store a last focus
current_workspace->setLastFocusedWindow(focused); current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
} 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);
// when we switch workspaces, unfocus whatever was focused
blackbox->setFocusedWindow((BlackboxWindow *) 0);
current_workspace->hideAll(); current_workspace->hideAll();
workspacemenu->setItemSelected(current_workspace->getID() + 2, False); workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
current_workspace = getWorkspace(id); current_workspace = getWorkspace(id);
xatom->setValue(getRootWindow(), XAtom::net_current_desktop, xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
XAtom::cardinal, id); XAtom::cardinal, id);
workspacemenu->setItemSelected(current_workspace->getID() + 2, True); workspacemenu->setItemSelected(current_workspace->getID() + 2, True);
toolbar->redrawWorkspaceLabel(True); toolbar->redrawWorkspaceLabel(True);
current_workspace->showAll(); current_workspace->showAll();
if (resource.focus_last && current_workspace->getLastFocusedWindow()) { if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
XSync(blackbox->getXDisplay(), False); XSync(blackbox->getXDisplay(), False);
current_workspace->getLastFocusedWindow()->setInputFocus(); current_workspace->getLastFocusedWindow()->setInputFocus();
}
} }
updateNetizenCurrentWorkspace(); updateNetizenCurrentWorkspace();

View file

@ -96,7 +96,6 @@ Toolbar::Toolbar(BScreen *scrn) {
editing = False; editing = False;
new_name_pos = 0; new_name_pos = 0;
frame.grab_x = frame.grab_y = 0;
toolbarmenu = new Toolbarmenu(this); toolbarmenu = new Toolbarmenu(this);

View file

@ -90,7 +90,7 @@ private:
Window window, workspace_label, window_label, clock, psbutton, nsbutton, Window window, workspace_label, window_label, clock, psbutton, nsbutton,
pwbutton, nwbutton; 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, unsigned int window_label_w, workspace_label_w, clock_w,
button_w, bevel_w, label_h; button_w, bevel_w, label_h;

View file

@ -102,39 +102,19 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
// pass focus to the next appropriate window // pass focus to the next appropriate window
if ((w->isFocused() || w == lastfocus) && if ((w->isFocused() || w == lastfocus) &&
! screen->getBlackbox()->doShutdown()) { ! 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 (id == screen->getCurrentWorkspaceID()) {
/* // The window is on the visible workspace
if the window is on the visible workspace, then try focus it, and fall focusFallback(w);
back to the default focus target if the window won't focus. } else {
*/ // The window is not on the visible workspace.
if (! (newfocus && newfocus->setInputFocus())) if (lastfocus == w) {
screen->getBlackbox()->setFocusedWindow(0); // The window was the last-focus target, so we need to replace it.
} else if (lastfocus == w) { setLastFocusedWindow(stackingList.front());
/* }
If this workspace is not the current one do not assume that // if the window focused on the current workspace, then reapply that
w == lastfocus. If a sticky window is removed on a workspace other // workspace's focus too
than where it originated, it will fire the removeWindow on a if (w->isFocused())
non-visible workspace. screen->getCurrentWorkspace()->focusFallback(w);
*/
/*
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);
} }
} }
@ -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) { void Workspace::showAll(void) {
std::for_each(stackingList.begin(), stackingList.end(), std::for_each(stackingList.begin(), stackingList.end(),
std::mem_fun(&BlackboxWindow::show)); std::mem_fun(&BlackboxWindow::show));

View file

@ -87,6 +87,7 @@ public:
BlackboxWindow* getPrevWindowInList(BlackboxWindow *w); BlackboxWindow* getPrevWindowInList(BlackboxWindow *w);
BlackboxWindow* getTopWindowOnStack(void) const; BlackboxWindow* getTopWindowOnStack(void) const;
void sendWindowList(Netizen &n); void sendWindowList(Netizen &n);
void focusFallback(const BlackboxWindow *old_window);
bool isCurrent(void) const; bool isCurrent(void) const;
bool isLastWindow(const BlackboxWindow* w) const; bool isLastWindow(const BlackboxWindow* w) const;

View file

@ -328,10 +328,18 @@ void Blackbox::process_event(XEvent *e) {
BlackboxWindow *win = searchWindow(e->xmaprequest.window); BlackboxWindow *win = searchWindow(e->xmaprequest.window);
if (win) { if (win) {
bool focus = False;
if (win->isIconic()) { if (win->isIconic()) {
win->deiconify(); win->deiconify();
win->setInputFocus(); focus = True;
} }
if (win->isShaded()) {
win->shade();
focus = True;
}
if (focus && (win->isTransient() || win->getScreen()->doFocusNew()))
win->setInputFocus();
} else { } else {
BScreen *screen = searchScreen(e->xmaprequest.parent); BScreen *screen = searchScreen(e->xmaprequest.parent);

View file

@ -49,8 +49,8 @@ extern "C" {
I18n i18n; I18n i18n;
bsetroot::bsetroot(int argc, char **argv, char *dpy_name) bsetroot::bsetroot(int argc, char **argv, char *dpy_name)
: BaseDisplay(argv[0], dpy_name) : BaseDisplay(argv[0], dpy_name) {
{
grad = fore = back = (char *) 0; grad = fore = back = (char *) 0;
bool mod = False, sol = False, grd = False; bool mod = False, sol = False, grd = False;
@ -97,8 +97,9 @@ bsetroot::bsetroot(int argc, char **argv, char *dpy_name)
} else if (! strcmp("-display", argv[i])) { } else if (! strcmp("-display", argv[i])) {
// -display passed through tests ealier... we just skip it now // -display passed through tests ealier... we just skip it now
i++; i++;
} else } else {
usage(); usage();
}
} }
if ((mod + sol + grd) != True) { if ((mod + sol + grd) != True) {