#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;
}
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;
focus = True;
}
- if (focus && (win->isTransient() || win->getScreen()->doFocusNew()))
+ if (focus && (win->isTransient() || win->getScreen()->doFocusNew()) &&
+ win->isVisible())
win->setInputFocus();
} else {
BScreen *screen = searchScreen(e->xmaprequest.parent);
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))) {
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)))
has moved to a known window.
*/
e->xfocus.window = None;
+
+ no_focus = False; // focusing is back on
}
break;
BScreen *screen = win->getScreen();
if (win->isIconic())
- win->deiconify(False, True);
- if (win->isShaded())
- win->shade();
- if (win->getWorkspaceNumber() != screen->getCurrentWorkspaceID())
+ 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);
}
}
}
+ } 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);
+ }
}
}
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
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);
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;
}