X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=6131ec4917b21524ac73a5c1635aa40ed70a5e3e;hb=28594da6de001f1d8b6b975286032302db3a6491;hp=2eaa6a67a56aa7650b50a66b9c06fe40ff5349f8;hpb=23da937e01a72cbb7af5108b9620d58cc216d731;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 2eaa6a67..6131ec49 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -59,6 +59,11 @@ extern "C" { using std::string; +// change this to change what modifier keys openbox uses for mouse bindings +// for example: Mod1Mask | ControlMask +// or: ControlMask| ShiftMask +const unsigned int ModMask = Mod1Mask; + /* * Initializes the class with default values/the window's set initial values. */ @@ -153,10 +158,17 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { client.rect.setRect(wattrib.x, wattrib.y, wattrib.width, wattrib.height); client.old_bw = wattrib.border_width; - timer = 0; windowmenu = 0; lastButtonPressTime = 0; + timer = new BTimer(blackbox, this); + timer->setTimeout(blackbox->getAutoRaiseDelay()); + + if (! getBlackboxHints()) { + getMWMHints(); + getNetWMHints(); + } + // get size, aspect, minimum/maximum size and other hints set by the // client getWMProtocols(); @@ -169,14 +181,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { return; } - timer = new BTimer(blackbox, this); - timer->setTimeout(blackbox->getAutoRaiseDelay()); - - if (! getBlackboxHints()) { - getMWMHints(); - getNetWMHints(); - } - frame.window = createToplevelWindow(); frame.plate = createChildWindow(frame.window); associateClientWindow(); @@ -820,24 +824,27 @@ void BlackboxWindow::reconfigure(void) { void BlackboxWindow::grabButtons(void) { - if ((! screen->isSloppyFocus()) || screen->doClickRaise()) + if (! screen->isSloppyFocus() || screen->doClickRaise()) // grab button 1 for changing focus/raising blackbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask, - GrabModeSync, GrabModeSync, frame.plate, None); - + GrabModeSync, GrabModeSync, frame.plate, None, + screen->allowScrollLock()); + if (functions & Func_Move) - blackbox->grabButton(Button1, Mod1Mask, frame.window, True, + blackbox->grabButton(Button1, ModMask, frame.window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, - GrabModeAsync, frame.window, - blackbox->getMoveCursor()); + GrabModeAsync, frame.window, None, + screen->allowScrollLock()); if (functions & Func_Resize) - blackbox->grabButton(Button3, Mod1Mask, frame.window, True, + blackbox->grabButton(Button3, ModMask, frame.window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, - GrabModeAsync, frame.window, None); + GrabModeAsync, frame.window, None, + screen->allowScrollLock()); // alt+middle lowers the window - blackbox->grabButton(Button2, Mod1Mask, frame.window, True, + blackbox->grabButton(Button2, ModMask, frame.window, True, ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - frame.window, None); + frame.window, None, + screen->allowScrollLock()); } @@ -845,9 +852,9 @@ void BlackboxWindow::ungrabButtons(void) { if ((! screen->isSloppyFocus()) || screen->doClickRaise()) blackbox->ungrabButton(Button1, 0, frame.plate); - blackbox->ungrabButton(Button1, Mod1Mask, frame.window); - blackbox->ungrabButton(Button2, Mod1Mask, frame.window); - blackbox->ungrabButton(Button3, Mod1Mask, frame.window); + blackbox->ungrabButton(Button1, ModMask, frame.window); + blackbox->ungrabButton(Button2, ModMask, frame.window); + blackbox->ungrabButton(Button3, ModMask, frame.window); } @@ -1790,8 +1797,21 @@ void BlackboxWindow::maximize(unsigned int button) { blackbox_attrib.premax_h = client.rect.height() + frame.margin.top + frame.margin.bottom; - const Rect &screen_area = screen->availableArea(); - frame.changing = screen_area; +#ifdef XINERAMA + if (screen->isXineramaActive() && blackbox->doXineramaMaximizing()) { + // find the area to use + RectList availableAreas = screen->allAvailableAreas(); + RectList::iterator it, end = availableAreas.end(); + + for (it = availableAreas.begin(); it != end; ++it) + if (it->intersects(frame.rect)) break; + if (it == end) // the window isn't inside an area + it = availableAreas.begin(); // so just default to the first one + + frame.changing = *it; + } else +#endif // XINERAMA + frame.changing = screen->availableArea(); switch(button) { case 1: @@ -2747,7 +2767,7 @@ void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) { if (frame.maximize_button == be->window && be->button <= 3) { redrawMaximizeButton(True); - } else if (be->button == 1 || (be->button == 3 && be->state == Mod1Mask)) { + } else if (be->button == 1 || (be->button == 3 && be->state == ModMask)) { if (! flags.focused) setInputFocus(); @@ -2873,7 +2893,7 @@ void BlackboxWindow::buttonReleaseEvent(const XButtonEvent *re) { } else if (flags.resizing) { endResize(); } else if (re->window == frame.window) { - if (re->button == 2 && re->state == Mod1Mask) + if (re->button == 2 && re->state == ModMask) XUngrabPointer(blackbox->getXDisplay(), CurrentTime); } } @@ -2933,6 +2953,59 @@ void BlackboxWindow::doMove(int x_root, int y_root) { dx -= frame.border_w; dy -= frame.border_w; + if (screen->doWorkspaceWarping()) { + // workspace warping + bool warp = False; + unsigned int dest = screen->getCurrentWorkspaceID(); + if (x_root <= 0) { + warp = True; + + if (dest > 0) dest--; + else dest = screen->getNumberOfWorkspaces() - 1; + + } else if (x_root >= screen->getRect().right()) { + warp = True; + + if (dest < screen->getNumberOfWorkspaces() - 1) dest++; + else dest = 0; + } + if (warp) { + endMove(); + bool focus = flags.focused; // had focus while moving? + if (! flags.stuck) + screen->reassociateWindow(this, dest, False); + screen->changeWorkspaceID(dest); + if (focus) + setInputFocus(); + + /* + If the XWarpPointer is done after the configure, we can end up + grabbing another window, so made sure you do it first. + */ + int dest_x; + if (x_root <= 0) { + dest_x = screen->getRect().right() - 1; + XWarpPointer(blackbox->getXDisplay(), None, + screen->getRootWindow(), 0, 0, 0, 0, + dest_x, y_root); + + configure(dx + (screen->getRect().width() - 1), dy, + frame.rect.width(), frame.rect.height()); + } else { + dest_x = 0; + XWarpPointer(blackbox->getXDisplay(), None, + screen->getRootWindow(), 0, 0, 0, 0, + dest_x, y_root); + + configure(dx - (screen->getRect().width() - 1), dy, + frame.rect.width(), frame.rect.height()); + } + + beginMove(dest_x, y_root); + return; + } + } + const int snap_distance = screen->getEdgeSnapThreshold(); if (snap_distance) { @@ -3020,48 +3093,58 @@ void BlackboxWindow::doMove(int x_root, int y_root) { } } - // try snap to the screen's available area - Rect srect = screen->availableArea(); - - int dleft = std::abs(wleft - srect.left()), - dright = std::abs(wright - srect.right()), - dtop = std::abs(wtop - srect.top()), - dbottom = std::abs(wbottom - srect.bottom()); - - // snap left? - if (dleft < snap_distance && dleft <= dright) - dx = srect.left(); - // snap right? - else if (dright < snap_distance) - dx = srect.right() - frame.rect.width() + 1; - - // snap top? - if (dtop < snap_distance && dtop <= dbottom) - dy = srect.top(); - // snap bottom? - else if (dbottom < snap_distance) - dy = srect.bottom() - frame.rect.height() + 1; - - srect = screen->getRect(); // now get the full screen - - dleft = std::abs(wleft - srect.left()), - dright = std::abs(wright - srect.right()), - dtop = std::abs(wtop - srect.top()), - dbottom = std::abs(wbottom - srect.bottom()); - - // snap left? - if (dleft < snap_distance && dleft <= dright) - dx = srect.left(); - // snap right? - else if (dright < snap_distance) - dx = srect.right() - frame.rect.width() + 1; - - // snap top? - if (dtop < snap_distance && dtop <= dbottom) - dy = srect.top(); - // snap bottom? - else if (dbottom < snap_distance) - dy = srect.bottom() - frame.rect.height() + 1; + RectList snaplist; // the list of rects we will try to snap to + + // snap to the strut (and screen boundaries for xinerama) +#ifdef XINERAMA + if (screen->isXineramaActive() && blackbox->doXineramaSnapping()) { + if (! screen->doFullMax()) + snaplist.insert(snaplist.begin(), + screen->allAvailableAreas().begin(), + screen->allAvailableAreas().end()); + + // always snap to the screen edges + snaplist.insert(snaplist.begin(), + screen->getXineramaAreas().begin(), + screen->getXineramaAreas().end()); + } else +#endif // XINERAMA + { + if (! screen->doFullMax()) + snaplist.push_back(screen->availableArea()); + + // always snap to the screen edges + snaplist.push_back(screen->getRect()); + } + + RectList::const_iterator it, end = snaplist.end(); + for (it = snaplist.begin(); it != end; ++it) { + const Rect &srect = *it; + + // if we're not in the rectangle then don't snap to it. + if (! srect.intersects(Rect(wleft, wtop, frame.rect.width(), + frame.rect.height()))) + continue; + + int dleft = std::abs(wleft - srect.left()), + dright = std::abs(wright - srect.right()), + dtop = std::abs(wtop - srect.top()), + dbottom = std::abs(wbottom - srect.bottom()); + + // snap left? + if (dleft < snap_distance && dleft <= dright) + dx = srect.left(); + // snap right? + else if (dright < snap_distance) + dx = srect.right() - frame.rect.width() + 1; + + // snap top? + if (dtop < snap_distance && dtop <= dbottom) + dy = srect.top(); + // snap bottom? + else if (dbottom < snap_distance) + dy = srect.bottom() - frame.rect.height() + 1; + } } if (screen->doOpaqueMove()) { @@ -3290,7 +3373,7 @@ void BlackboxWindow::motionNotifyEvent(const XMotionEvent *me) { } else if ((functions & Func_Resize) && (me->state & Button1Mask && (me->window == frame.right_grip || me->window == frame.left_grip)) || - (me->state & Button3Mask && me->state & Mod1Mask && + (me->state & Button3Mask && me->state & ModMask && me->window == frame.window)) { unsigned int zones = screen->getResizeZones(); Corner corner;