X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fblackbox.cc;h=82c8b1d11936b65af68a4a3fd68884981ad432c7;hb=87e63d53af67d5ea98f55a27007663d4c9c8fc6c;hp=04e68bb17155720d3bf56e6dc6c539f35f7838b6;hpb=00391787e32111fa5c9de606b5edf595846e7513;p=chaz%2Fopenbox diff --git a/src/blackbox.cc b/src/blackbox.cc index 04e68bb1..82c8b1d1 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -112,26 +112,6 @@ using std::string; #include "Workspacemenu.hh" #include "XAtom.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; @@ -154,8 +134,17 @@ Blackbox::Blackbox(char **m_argv, char *dpy_name, char *rc, char *menu) if (! rc) rc = "~/.openbox/rc"; rc_file = expandTilde(rc); config.setFile(rc_file); - if (! menu) menu = "~/.openbox/menu"; - menu_file = expandTilde(menu); + + string rcmenu; + if (! menu) { + //have to come up with something better than this + config.load(); + if (! config.getValue("session.menuFile", rcmenu)) + rcmenu = "~/.openbox/menu"; + } else { + rcmenu = menu; + } + menu_file = expandTilde(rcmenu.c_str()); no_focus = False; @@ -474,24 +463,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) && - 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 (! no_focus) + win->enterNotifyEvent(&e->xcrossing); } else if ((menu = searchMenu(e->xcrossing.window))) { menu->enterNotifyEvent(&e->xcrossing); } else if ((tbar = searchToolbar(e->xcrossing.window))) { @@ -513,7 +490,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))) @@ -606,6 +583,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; @@ -714,8 +693,10 @@ void Blackbox::process_event(XEvent *e) { if (win->isIconic()) win->deiconify(False, False); if (! win->isStuck() && - (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())) + (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())) { + no_focus = True; screen->changeWorkspaceID(win->getWorkspaceNumber()); + } if (win->isVisible() && win->setInputFocus()) { win->getScreen()->getWorkspace(win->getWorkspaceNumber())-> raiseWindow(win); @@ -936,6 +917,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); + } } } @@ -953,7 +956,7 @@ void Blackbox::process_event(XEvent *e) { XShapeEvent *shape_event = (XShapeEvent *) e; BlackboxWindow *win = searchWindow(e->xany.window); - if (win) + if (win && shape_event->kind == ShapeBounding) win->shapeEvent(shape_event); } #endif // SHAPE @@ -1201,6 +1204,17 @@ 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); @@ -1268,6 +1282,26 @@ void Blackbox::load_rc(void) { 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; }