X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fblackbox.cc;h=e8b8dcaaf5210b4985acda63be926f2d3075a5b9;hb=07e619ebbb7c43b22f3bcb5672413d343cf66d24;hp=36828f7e5e3ce2927e24bebe5521c2a3731a0a49;hpb=351a06655bdd7d440780b5bc5b255081c888044b;p=chaz%2Fopenbox diff --git a/src/blackbox.cc b/src/blackbox.cc index 36828f7e..e8b8dcaa 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -111,27 +111,6 @@ using std::string; #include "Workspace.hh" #include "Workspacemenu.hh" #include "XAtom.hh" -#include "Input.hh" - -// X event scanner for enter/leave notifies - adapted from twm -struct scanargs { - Window w; - bool leave, inferior, enter; -}; - -static Bool queueScanner(Display *, XEvent *e, char *args) { - scanargs *scan = (scanargs *) args; - if ((e->type == LeaveNotify) && - (e->xcrossing.window == scan->w) && - (e->xcrossing.mode == NotifyNormal)) { - scan->leave = True; - scan->inferior = (e->xcrossing.detail == NotifyInferior); - } else if ((e->type == EnterNotify) && (e->xcrossing.mode == NotifyUngrab)) { - scan->enter = True; - } - - return False; -} Blackbox *blackbox; @@ -146,6 +125,12 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) ::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); @@ -159,11 +144,9 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) active_screen = 0; focused_window = changing_window = (BlackboxWindow *) 0; - XrmInitialize(); load_rc(); xatom = new XAtom(getXDisplay()); - input = new BInput(this); cursor.session = XCreateFontCursor(getXDisplay(), XC_left_ptr); cursor.move = XCreateFontCursor(getXDisplay(), XC_fleur); @@ -279,16 +262,6 @@ void Blackbox::process_event(XEvent *e) { } case ConfigureRequest: { - // compress configure requests... - XEvent realevent; - unsigned int i = 0; - while(XCheckTypedWindowEvent(getXDisplay(), e->xconfigurerequest.window, - ConfigureRequest, &realevent)) { - i++; - } - if ( i > 0 ) - e = &realevent; - BlackboxWindow *win = (BlackboxWindow *) 0; Slit *slit = (Slit *) 0; @@ -324,7 +297,21 @@ void Blackbox::process_event(XEvent *e) { BlackboxWindow *win = searchWindow(e->xmaprequest.window); - if (! win) { + if (win) { + bool focus = False; + if (win->isIconic()) { + win->deiconify(); + focus = True; + } + if (win->isShaded()) { + win->shade(); + focus = True; + } + + if (focus && (win->isTransient() || win->getScreen()->doFocusNew()) && + win->isVisible()) + win->setInputFocus(); + } else { BScreen *screen = searchScreen(e->xmaprequest.parent); if (! screen) { @@ -368,8 +355,6 @@ void Blackbox::process_event(XEvent *e) { 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; @@ -389,8 +374,6 @@ void Blackbox::process_event(XEvent *e) { 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; @@ -427,8 +410,12 @@ void Blackbox::process_event(XEvent *e) { if ( i > 0 ) e = &realevent; + // the pointer is on the wrong screen + if (! e->xmotion.same_screen) + break; + // strip the lock key modifiers - e->xbutton.state &= ~(NumLockMask | ScrollLockMask | LockMask); + e->xmotion.state &= ~(NumLockMask | ScrollLockMask | LockMask); last_time = e->xmotion.time; @@ -446,13 +433,13 @@ void Blackbox::process_event(XEvent *e) { case PropertyNotify: { last_time = e->xproperty.time; - if (e->xproperty.state != PropertyDelete) { - BlackboxWindow *win = searchWindow(e->xproperty.window); - - if (win) - win->propertyNotifyEvent(e->xproperty.atom); - } + 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; } @@ -467,23 +454,12 @@ void Blackbox::process_event(XEvent *e) { if (e->xcrossing.mode == NotifyGrab) break; - XEvent dummy; - scanargs sa; - sa.w = e->xcrossing.window; - sa.enter = sa.leave = False; - XCheckIfEvent(getXDisplay(), &dummy, queueScanner, (char *) &sa); - if ((e->xcrossing.window == e->xcrossing.root) && (screen = searchScreen(e->xcrossing.window))) { screen->getImageControl()->installRootColormap(); } else if ((win = searchWindow(e->xcrossing.window))) { - if (win->getScreen()->isSloppyFocus() && - (! win->isFocused()) && (! no_focus)) { - if (((! sa.leave) || sa.inferior) && win->isVisible()) { - if (win->setInputFocus()) - win->installColormap(True); // XXX: shouldnt we honour no install? - } - } + if (! no_focus) + win->enterNotifyEvent(&e->xcrossing); } else if ((menu = searchMenu(e->xcrossing.window))) { menu->enterNotifyEvent(&e->xcrossing); } else if ((tbar = searchToolbar(e->xcrossing.window))) { @@ -505,7 +481,7 @@ void Blackbox::process_event(XEvent *e) { if ((menu = searchMenu(e->xcrossing.window))) menu->leaveNotifyEvent(&e->xcrossing); else if ((win = searchWindow(e->xcrossing.window))) - win->installColormap(False); + win->leaveNotifyEvent(&e->xcrossing); else if ((tbar = searchToolbar(e->xcrossing.window))) tbar->leaveNotifyEvent(&e->xcrossing); else if ((slit = searchSlit(e->xcrossing.window))) @@ -598,6 +574,8 @@ void Blackbox::process_event(XEvent *e) { has moved to a known window. */ e->xfocus.window = None; + + no_focus = False; // focusing is back on } break; @@ -689,18 +667,30 @@ void Blackbox::process_event(XEvent *e) { 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); + win->deiconify(False, False); + if (! win->isStuck() && + (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())) { + no_focus = True; + 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); } } @@ -731,7 +721,8 @@ void Blackbox::process_event(XEvent *e) { 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(); @@ -757,22 +748,8 @@ void Blackbox::process_event(XEvent *e) { // 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 @@ -931,6 +908,28 @@ void Blackbox::process_event(XEvent *e) { } } } + } else if (e->xclient.message_type == + xatom->getAtom(XAtom::openbox_show_root_menu) || + e->xclient.message_type == + xatom->getAtom(XAtom::openbox_show_workspace_menu)) { + // find the screen the mouse is on + int x, y; + ScreenList::iterator it, end = screenList.end(); + for (it = screenList.begin(); it != end; ++it) { + Window w; + int i; + unsigned int m; + if (XQueryPointer(getXDisplay(), (*it)->getRootWindow(), + &w, &w, &x, &y, &i, &i, &m)) + break; + } + if (it != end) { + if (e->xclient.message_type == + xatom->getAtom(XAtom::openbox_show_root_menu)) + (*it)->showRootMenu(x, y); + else + (*it)->showWorkspaceMenu(x, y); + } } } @@ -960,10 +959,13 @@ void Blackbox::process_event(XEvent *e) { bool Blackbox::handleSignal(int sig) { switch (sig) { case SIGHUP: - case SIGUSR1: reconfigure(); break; + case SIGUSR1: + restart(); + break; + case SIGUSR2: rereadMenu(); break; @@ -1008,15 +1010,6 @@ BScreen *Blackbox::searchScreen(Window window) { } -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()) @@ -1071,11 +1064,6 @@ Slit *Blackbox::searchSlit(Window window) { } -void Blackbox::saveDesktopWindowSearch(Window window, BScreen *screen) { - desktopSearchList.insert(WindowScreenLookupPair(window, screen)); -} - - void Blackbox::saveSystrayWindowSearch(Window window, BScreen *screen) { systraySearchList.insert(WindowScreenLookupPair(window, screen)); } @@ -1106,11 +1094,6 @@ void Blackbox::saveSlitSearch(Window window, Slit *data) { } -void Blackbox::removeDesktopWindowSearch(Window window) { - desktopSearchList.erase(window); -} - - void Blackbox::removeSystrayWindowSearch(Window window) { systraySearchList.erase(window); } @@ -1145,6 +1128,7 @@ void Blackbox::restart(const char *prog) { shutdown(); if (prog) { + putenv(const_cast(screenList.front()->displayString().c_str())); execlp(prog, prog, NULL); perror(prog); } @@ -1168,6 +1152,32 @@ void Blackbox::shutdown(void) { } +#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 @@ -1185,7 +1195,24 @@ void Blackbox::save_rc(void) { config.setValue("session.cacheMax", resource.cache_max); config.setValue("session.styleFile", resource.style_file); config.setValue("session.titlebarLayout", resource.titlebar_layout); + + string s; + if (resource.mod_mask & Mod1Mask) s += "Mod1-"; + if (resource.mod_mask & Mod2Mask) s += "Mod2-"; + if (resource.mod_mask & Mod3Mask) s += "Mod3-"; + if (resource.mod_mask & Mod4Mask) s += "Mod4-"; + if (resource.mod_mask & Mod5Mask) s += "Mod5-"; + if (resource.mod_mask & ShiftMask) s += "Shift-"; + if (resource.mod_mask & ControlMask) s += "Control-"; + s.resize(s.size() - 1); // drop the last '-' + config.setValue("session.modifierMask", s); +#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)); @@ -1196,7 +1223,7 @@ void Blackbox::save_rc(void) { void Blackbox::load_rc(void) { if (! config.load()) - config.create(); + config.create(); string s; @@ -1232,10 +1259,48 @@ void Blackbox::load_rc(void) { 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 + + resource.mod_mask = 0; + if (config.getValue("session.modifierMask", s)) { + if (s.find("Mod1") != string::npos) + resource.mod_mask |= Mod1Mask; + if (s.find("Mod2") != string::npos) + resource.mod_mask |= Mod2Mask; + if (s.find("Mod3") != string::npos) + resource.mod_mask |= Mod3Mask; + if (s.find("Mod4") != string::npos) + resource.mod_mask |= Mod4Mask; + if (s.find("Mod5") != string::npos) + resource.mod_mask |= Mod5Mask; + if (s.find("Shift") != string::npos) + resource.mod_mask |= ShiftMask; + if (s.find("Control") != string::npos) + resource.mod_mask |= ControlMask; + } + if (! resource.mod_mask) + resource.mod_mask = Mod1Mask; } 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();