X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=407eef36ae840611d9cc8a50950d5e8e8bca037c;hb=32c13697524e01a21e5b667188cad73434693ecb;hp=427cc955d8500695bfcf2c1e652e911869472f7d;hpb=6954842d84539c1b345d575a39c5dbd5ab0a1227;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 427cc955..407eef36 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -273,8 +273,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { } #endif // SHAPE - grabButtons(); - windowmenu = new Windowmenu(this); if (blackbox_attrib.workspace >= screen->getWorkspaceCount()) @@ -338,6 +336,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { positionWindows(); decorate(); + grabButtons(); XMapSubwindows(blackbox->getXDisplay(), frame.window); @@ -818,12 +817,13 @@ void BlackboxWindow::positionButtons(bool redecorate_label) { void BlackboxWindow::reconfigure(void) { upsize(); - positionWindows(); decorate(); - redrawWindowFrame(); + ungrabButtons(); + grabButtons(); + if (windowmenu) { windowmenu->move(windowmenu->getX(), frame.rect.y() + frame.title_h); windowmenu->reconfigure(); @@ -847,6 +847,10 @@ void BlackboxWindow::grabButtons(void) { ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, frame.window, blackbox->getLowerRightAngleCursor()); + // alt+middle lowers the window + blackbox->grabButton(Button2, Mod1Mask, frame.window, True, + ButtonReleaseMask, GrabModeAsync, GrabModeAsync, + frame.window, None); } @@ -855,6 +859,7 @@ void BlackboxWindow::ungrabButtons(void) { blackbox->ungrabButton(Button1, 0, frame.plate); blackbox->ungrabButton(Button1, Mod1Mask, frame.window); + blackbox->ungrabButton(Button2, Mod1Mask, frame.window); blackbox->ungrabButton(Button3, Mod1Mask, frame.window); } @@ -874,10 +879,8 @@ void BlackboxWindow::positionWindows(void) { XMoveResizeWindow(blackbox->getXDisplay(), client.window, 0, 0, client.rect.width(), client.rect.height()); // ensure client.rect contains the real location - client.rect.setCoords(frame.rect.left() + frame.margin.left, - frame.rect.top() + frame.margin.top, - frame.rect.right() - frame.margin.right, - frame.rect.bottom() - frame.margin.bottom); + client.rect.setPos(frame.rect.left() + frame.margin.left, + frame.rect.top() + frame.margin.top); if (decorations & Decor_Titlebar) { if (frame.title == None) createTitlebar(); @@ -920,6 +923,7 @@ void BlackboxWindow::positionWindows(void) { } else if (frame.handle) { destroyHandle(); } + XSync(blackbox->getXDisplay(), False); } @@ -1107,6 +1111,11 @@ void BlackboxWindow::getWMNormalHints(void) { client.min_width = client.min_height = client.width_inc = client.height_inc = 1; client.base_width = client.base_height = 0; + client.win_gravity = NorthWestGravity; +#if 0 + client.min_aspect_x = client.min_aspect_y = + client.max_aspect_x = client.max_aspect_y = 1; +#endif /* use the full screen, not the strut modified size. otherwise when the @@ -1115,11 +1124,7 @@ void BlackboxWindow::getWMNormalHints(void) { */ const Rect& screen_area = screen->getRect(); client.max_width = screen_area.width(); - client.max_height = screen_area.height(); - client.min_aspect_x = client.min_aspect_y = - client.max_aspect_x = client.max_aspect_y = 1; - client.win_gravity = NorthWestGravity; if (! XGetWMNormalHints(blackbox->getXDisplay(), client.window, &sizehint, &icccm_mask)) @@ -1128,13 +1133,22 @@ void BlackboxWindow::getWMNormalHints(void) { client.normal_hint_flags = sizehint.flags; if (sizehint.flags & PMinSize) { - client.min_width = sizehint.min_width; - client.min_height = sizehint.min_height; + if (sizehint.min_width >= 0) + client.min_width = sizehint.min_width; + if (sizehint.min_height >= 0) + client.min_height = sizehint.min_height; } if (sizehint.flags & PMaxSize) { - client.max_width = sizehint.max_width; - client.max_height = sizehint.max_height; + if (sizehint.max_width > static_cast(client.min_width)) + client.max_width = sizehint.max_width; + else + client.max_width = client.min_width; + + if (sizehint.max_height > static_cast(client.min_height)) + client.max_height = sizehint.max_height; + else + client.max_height = client.min_height; } if (sizehint.flags & PResizeInc) { @@ -1142,12 +1156,14 @@ void BlackboxWindow::getWMNormalHints(void) { client.height_inc = sizehint.height_inc; } +#if 0 // we do not support this at the moment if (sizehint.flags & PAspect) { client.min_aspect_x = sizehint.min_aspect.x; client.min_aspect_y = sizehint.min_aspect.y; client.max_aspect_x = sizehint.max_aspect.x; client.max_aspect_y = sizehint.max_aspect.y; } +#endif if (sizehint.flags & PBaseSize) { client.base_width = sizehint.base_width; @@ -1440,7 +1456,8 @@ BlackboxWindow *BlackboxWindow::getTransientFor(void) const { */ void BlackboxWindow::configure(int dx, int dy, unsigned int dw, unsigned int dh) { - bool send_event = (frame.rect.x() != dx || frame.rect.y() != dy); + bool send_event = ((frame.rect.x() != dx || frame.rect.y() != dy) && + ! flags.moving); if (dw != frame.rect.width() || dh != frame.rect.height()) { frame.rect.setRect(dx, dy, dw, dh); @@ -1469,9 +1486,15 @@ void BlackboxWindow::configure(int dx, int dy, XMoveWindow(blackbox->getXDisplay(), frame.window, frame.rect.x(), frame.rect.y()); + /* + we may have been called just after an opaque window move, so even though + the old coords match the new ones no ConfigureNotify has been sent yet. + There are likely other times when this will be relevant as well. + */ + if (! flags.moving) send_event = True; } - if (send_event && ! flags.moving) { + if (send_event) { // if moving, the update and event will occur when the move finishes client.rect.setPos(frame.rect.left() + frame.margin.left, frame.rect.top() + frame.margin.top); @@ -1493,6 +1516,7 @@ void BlackboxWindow::configure(int dx, int dy, XSendEvent(blackbox->getXDisplay(), client.window, False, StructureNotifyMask, &event); screen->updateNetizenConfigNotify(&event); + XFlush(blackbox->getXDisplay()); } } @@ -1588,6 +1612,7 @@ bool BlackboxWindow::setInputFocus(void) { ce.xclient.data.l[4] = 0l; XSendEvent(blackbox->getXDisplay(), client.window, False, NoEventMask, &ce); + XFlush(blackbox->getXDisplay()); } return ret; @@ -1704,6 +1729,7 @@ void BlackboxWindow::close(void) { ce.xclient.data.l[3] = 0l; ce.xclient.data.l[4] = 0l; XSendEvent(blackbox->getXDisplay(), client.window, False, NoEventMask, &ce); + XFlush(blackbox->getXDisplay()); } @@ -2216,7 +2242,7 @@ void BlackboxWindow::applyGravity(Rect &r) { case NorthEastGravity: case SouthEastGravity: case EastGravity: - r.setX(client.rect.x() - frame.margin.left - frame.margin.right); + r.setX(client.rect.x() - frame.margin.left - frame.margin.right + 2); break; case ForgetGravity: @@ -2243,7 +2269,7 @@ void BlackboxWindow::applyGravity(Rect &r) { case SouthWestGravity: case SouthEastGravity: case SouthGravity: - r.setY(client.rect.y() - frame.margin.top - frame.margin.bottom); + r.setY(client.rect.y() - frame.margin.top - frame.margin.bottom + 2); break; case ForgetGravity: @@ -2279,7 +2305,7 @@ void BlackboxWindow::restoreGravity(Rect &r) { case NorthEastGravity: case SouthEastGravity: case EastGravity: - r.setX(frame.rect.x() + frame.margin.left + frame.margin.right); + r.setX(frame.rect.x() + frame.margin.left + frame.margin.right - 2); break; case ForgetGravity: @@ -2306,7 +2332,7 @@ void BlackboxWindow::restoreGravity(Rect &r) { case SouthWestGravity: case SouthEastGravity: case SouthGravity: - r.setY(frame.rect.y() + frame.margin.top + frame.margin.bottom); + r.setY(frame.rect.y() + frame.margin.top + frame.margin.bottom - 2); break; case ForgetGravity: @@ -2596,8 +2622,11 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) { decorations &= ~(Decor_Maximize | Decor_Handle); functions &= ~(Func_Resize | Func_Maximize); } else { - decorations |= Decor_Maximize | Decor_Handle; - functions |= Func_Resize | Func_Maximize; + if (! isTransient()) { + decorations |= Decor_Maximize | Decor_Handle; + functions |= Func_Maximize; + } + functions |= Func_Resize; } grabButtons(); setAllowedActions(); @@ -2821,6 +2850,9 @@ void BlackboxWindow::buttonReleaseEvent(const XButtonEvent *re) { endMove(); } else if (flags.resizing) { endResize(); + } else if (re->window == frame.window) { + if (re->button == 2 && re->state == Mod1Mask) + XUngrabPointer(blackbox->getXDisplay(), CurrentTime); } } @@ -3113,6 +3145,7 @@ void BlackboxWindow::beginResize(int x_root, int y_root, Corner dir) { default: assert(false); // unhandled Corner + return; // unreachable, for the compiler } XGrabServer(blackbox->getXDisplay()); @@ -3151,29 +3184,30 @@ void BlackboxWindow::doResize(int x_root, int y_root) { Corner anchor; switch (resize_dir) { - case BottomLeft: - anchor = TopRight; - frame.changing.setSize(frame.rect.width() - (x_root - frame.grab_x), - frame.rect.height() + (y_root - frame.grab_y)); - break; - case BottomRight: - anchor = TopLeft; - frame.changing.setSize(frame.rect.width() + (x_root - frame.grab_x), - frame.rect.height() + (y_root - frame.grab_y)); - break; - case TopLeft: - anchor = BottomRight; - frame.changing.setSize(frame.rect.width() - (x_root - frame.grab_x), - frame.rect.height() - (y_root - frame.grab_y)); - break; - case TopRight: - anchor = BottomLeft; - frame.changing.setSize(frame.rect.width() + (x_root - frame.grab_x), - frame.rect.height() - (y_root - frame.grab_y)); - break; + case BottomLeft: + anchor = TopRight; + frame.changing.setSize(frame.rect.width() - (x_root - frame.grab_x), + frame.rect.height() + (y_root - frame.grab_y)); + break; + case BottomRight: + anchor = TopLeft; + frame.changing.setSize(frame.rect.width() + (x_root - frame.grab_x), + frame.rect.height() + (y_root - frame.grab_y)); + break; + case TopLeft: + anchor = BottomRight; + frame.changing.setSize(frame.rect.width() - (x_root - frame.grab_x), + frame.rect.height() - (y_root - frame.grab_y)); + break; + case TopRight: + anchor = BottomLeft; + frame.changing.setSize(frame.rect.width() + (x_root - frame.grab_x), + frame.rect.height() - (y_root - frame.grab_y)); + break; - default: - assert(false); // unhandled Corner + default: + assert(false); // unhandled Corner + return; // unreachable, for the compiler } constrain(anchor, &gw, &gh);