::blackbox = this;
argv = m_argv;
+
+ // try to make sure the ~/.openbox directory exists
+ mkdir(expandTilde("~/.openbox").c_str(), S_IREAD | S_IWRITE | S_IEXEC |
+ S_IRGRP | S_IWGRP | S_IXGRP |
+ S_IROTH | S_IWOTH | S_IXOTH);
+
if (! rc) rc = "~/.openbox/rc";
rc_file = expandTilde(rc);
config.setFile(rc_file);
active_screen = 0;
focused_window = changing_window = (BlackboxWindow *) 0;
- XrmInitialize();
load_rc();
xatom = new XAtom(getXDisplay());
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);
slit->unmapNotifyEvent(&e->xunmap);
} else if ((screen = searchSystrayWindow(e->xunmap.window))) {
screen->removeSystrayWindow(e->xunmap.window);
- } else if ((screen = searchDesktopWindow(e->xunmap.window))) {
- screen->removeDesktopWindow(e->xunmap.window);
}
break;
delete group;
} else if ((screen = searchSystrayWindow(e->xunmap.window))) {
screen->removeSystrayWindow(e->xunmap.window);
- } else if ((screen = searchDesktopWindow(e->xunmap.window))) {
- screen->removeDesktopWindow(e->xunmap.window);
}
break;
case PropertyNotify: {
last_time = e->xproperty.time;
- BlackboxWindow *win = searchWindow(e->xproperty.window);
- if (win)
+ BlackboxWindow *win = (BlackboxWindow *) 0;
+ BScreen *screen = (BScreen *) 0;
+
+ if ((win = searchWindow(e->xproperty.window)))
win->propertyNotifyEvent(&e->xproperty);
+ else if ((screen = searchScreen(e->xproperty.window)))
+ screen->propertyNotifyEvent(&e->xproperty);
break;
}
screen->getImageControl()->installRootColormap();
} else if ((win = searchWindow(e->xcrossing.window))) {
if (win->getScreen()->isSloppyFocus() &&
- (! win->isFocused()) && (! no_focus)) {
+ (! win->isFocused()) && (! no_focus) &&
+ win->isNormal()) { // don't focus non-normal windows with mouseover
if (((! sa.leave) || sa.inferior) && win->isVisible()) {
if (win->setInputFocus())
win->installColormap(True); // XXX: shouldnt we honour no install?
if (screen && workspace < screen->getWorkspaceCount())
screen->changeWorkspaceID(workspace);
} else if (e->xclient.message_type ==
- xatom->getAtom(XAtom::blackbox_change_window_focus) ||
- e->xclient.message_type ==
+ xatom->getAtom(XAtom::blackbox_change_window_focus)) {
+ // TEMP HACK TO KEEP BBKEYS WORKING
+ BlackboxWindow *win = searchWindow(e->xclient.window);
+
+ if (win && win->isVisible() && win->setInputFocus())
+ win->installColormap(True);
+ } else if (e->xclient.message_type ==
xatom->getAtom(XAtom::net_active_window)) {
// NET_ACTIVE_WINDOW
BlackboxWindow *win = searchWindow(e->xclient.window);
if (win) {
+ BScreen *screen = win->getScreen();
+
if (win->isIconic())
win->deiconify(False, True);
+ if (win->isShaded())
+ win->shade();
+ if (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())
+ screen->changeWorkspaceID(win->getWorkspaceNumber());
if (win->isVisible() && win->setInputFocus()) {
- //win->getScreen()->getWorkspace(win->getWorkspaceNumber())->
- // raiseWindow(win);
+ win->getScreen()->getWorkspace(win->getWorkspaceNumber())->
+ raiseWindow(win);
win->installColormap(True);
}
}
else
win->show();
screen->reassociateWindow(win, wksp, True);
- } else if (wksp == 0xfffffffe) { // XXX: BUG, BUT DOING THIS SO KDE WORKS FOR NOW!!
+ } else if (wksp == 0xfffffffe || // XXX: BUG, BUT DOING THIS SO KDE WORKS FOR NOW!!
+ wksp == 0xffffffff) {
if (win->isIconic()) win->deiconify(False, True);
if (! win->isStuck()) win->stick();
if (! win->isVisible()) win->show();
// NET_NUMBER_OF_DESKTOPS
BScreen *screen = searchScreen(e->xclient.window);
- if (e->xclient.data.l[0] > 0) {
- if ((unsigned) e->xclient.data.l[0] < screen->getWorkspaceCount()) {
- // shrink
- for (int i = screen->getWorkspaceCount();
- i > e->xclient.data.l[0]; --i)
- screen->removeLastWorkspace();
- // removeLast already sets the current workspace to the
- // last available one.
- } else if ((unsigned) e->xclient.data.l[0] >
- screen->getWorkspaceCount()) {
- // grow
- for(int i = screen->getWorkspaceCount();
- i < e->xclient.data.l[0]; ++i)
- screen->addWorkspace();
- }
- }
+ if (e->xclient.data.l[0] > 0)
+ screen->changeWorkspaceCount((unsigned) e->xclient.data.l[0]);
} else if (e->xclient.message_type ==
xatom->getAtom(XAtom::net_close_window)) {
// NET_CLOSE_WINDOW
bool Blackbox::handleSignal(int sig) {
switch (sig) {
case SIGHUP:
- case SIGUSR1:
reconfigure();
break;
+ case SIGUSR1:
+ restart();
+ break;
+
case SIGUSR2:
rereadMenu();
break;
}
-BScreen *Blackbox::searchDesktopWindow(Window window) {
- WindowScreenLookup::iterator it = desktopSearchList.find(window);
- if (it != desktopSearchList.end())
- return it->second;
-
- return (BScreen*) 0;
-}
-
-
BScreen *Blackbox::searchSystrayWindow(Window window) {
WindowScreenLookup::iterator it = systraySearchList.find(window);
if (it != systraySearchList.end())
}
-void Blackbox::saveDesktopWindowSearch(Window window, BScreen *screen) {
- desktopSearchList.insert(WindowScreenLookupPair(window, screen));
-}
-
-
void Blackbox::saveSystrayWindowSearch(Window window, BScreen *screen) {
systraySearchList.insert(WindowScreenLookupPair(window, screen));
}
}
-void Blackbox::removeDesktopWindowSearch(Window window) {
- desktopSearchList.erase(window);
-}
-
-
void Blackbox::removeSystrayWindowSearch(Window window) {
systraySearchList.erase(window);
}
}
+#ifdef XINERAMA
+void Blackbox::saveXineramaPlacement(bool x) {
+ resource.xinerama_placement = x;
+ config.setValue("session.xineramaSupport.windowPlacement",
+ resource.xinerama_placement);
+ reconfigure(); // make sure all screens get this change
+}
+
+
+void Blackbox::saveXineramaMaximizing(bool x) {
+ resource.xinerama_maximize = x;
+ config.setValue("session.xineramaSupport.windowMaximizing",
+ resource.xinerama_maximize);
+ reconfigure(); // make sure all screens get this change
+}
+
+
+void Blackbox::saveXineramaSnapping(bool x) {
+ resource.xinerama_snap = x;
+ config.setValue("session.xineramaSupport.windowSnapping",
+ resource.xinerama_snap);
+ reconfigure(); // make sure all screens get this change
+}
+#endif // XINERAMA
+
+
/*
* Save all values as they are so that the defaults will be written to the rc
* file
config.setValue("session.styleFile", resource.style_file);
config.setValue("session.titlebarLayout", resource.titlebar_layout);
+#ifdef XINERAMA
+ saveXineramaPlacement(resource.xinerama_placement);
+ saveXineramaMaximizing(resource.xinerama_maximize);
+ saveXineramaSnapping(resource.xinerama_snap);
+#endif // XINERAMA
+
std::for_each(screenList.begin(), screenList.end(),
std::mem_fun(&BScreen::save_rc));
void Blackbox::load_rc(void) {
if (! config.load())
- config.create();
+ config.create();
string s;
if (! config.getValue("session.titlebarLayout", resource.titlebar_layout))
resource.titlebar_layout = "ILMC";
+
+#ifdef XINERAMA
+ if (! config.getValue("session.xineramaSupport.windowPlacement",
+ resource.xinerama_placement))
+ resource.xinerama_placement = false;
+
+ if (! config.getValue("session.xineramaSupport.windowMaximizing",
+ resource.xinerama_maximize))
+ resource.xinerama_maximize = false;
+
+ if (! config.getValue("session.xineramaSupport.windowSnapping",
+ resource.xinerama_snap))
+ resource.xinerama_snap = false;
+#endif // XINERAMA
}
void Blackbox::reconfigure(void) {
+ // don't reconfigure while saving the initial rc file, it's a waste and it
+ // breaks somethings (workspace names)
+ if (isStartup()) return;
+
reconfigure_wait = True;
if (! timer->isTiming()) timer->start();