X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=0a02daa196b162aa77b718d3c318308a8b3e2a30;hb=57fb41c8060eaa2f29b25b08e3813b3dc140f165;hp=cc078fba01b35a408a9d4ad8fa0bc81cc2fc2386;hpb=84f0293a888db6720647289219ec44d2733df91c;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index cc078fba..0a02daa1 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -56,6 +56,9 @@ #endif // SLIT #include "Util.h" +#include +using namespace std; + /* * Initializes the class with default values/the window's set initial values. */ @@ -1385,12 +1388,12 @@ Bool OpenboxWindow::setInputFocus(void) { } else if (! flags.focused) { if (focus_mode == F_LocallyActive || focus_mode == F_Passive) XSetInputFocus(display, client.window, - RevertToPointerRoot, CurrentTime); + RevertToPointerRoot, CurrentTime); else XSetInputFocus(display, screen->getRootWindow(), RevertToNone, CurrentTime); - openbox.setFocusedWindow(this); + openbox.focusWindow(this); if (flags.send_focus_message) { XEvent ce; @@ -1452,7 +1455,7 @@ void OpenboxWindow::iconify(void) { } -void OpenboxWindow::deiconify(Bool reassoc, Bool raise) { +void OpenboxWindow::deiconify(bool reassoc, bool raise, bool initial) { if (flags.iconic || reassoc) screen->reassociateWindow(this, -1, False); else if (workspace_number != screen->getCurrentWorkspace()->getWorkspaceID()) @@ -1470,14 +1473,8 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) { // if we're using the click to place placement type, then immediately // after the window is mapped, we need to start interactively moving it - if (screen->placementPolicy() == BScreen::ClickMousePlacement && - place_window && !(flags.iconic || reassoc)) { - // if the last window wasn't placed yet, or we're just moving a window - // already, finish off that move cleanly - OpenboxWindow *w = openbox.getFocusedWindow(); - if (w != (OpenboxWindow *) 0 && w->flags.moving) - w->endMove(); - + if (initial && place_window && + screen->placementPolicy() == BScreen::ClickMousePlacement) { int x, y, rx, ry; Window c, r; unsigned int m; @@ -1533,6 +1530,9 @@ void OpenboxWindow::withdraw(void) { void OpenboxWindow::maximize(unsigned int button) { + if (flags.moving) + endMove(); + // handle case where menu is open then the max button is used instead if (windowmenu && windowmenu->isVisible()) windowmenu->hide(); @@ -2208,6 +2208,7 @@ void OpenboxWindow::redrawCloseButton(Bool pressed) { void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { + cout << "MAP REQUEST " << client.window << " " << client.title << endl; if (re->window == client.window) { #ifdef DEBUG fprintf(stderr, i18n->getMessage(WindowSet, WindowMapRequest, @@ -2242,7 +2243,8 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { case InactiveState: case ZoomState: default: - deiconify(False); + deiconify(False, True, True); // specify that we're initializing the + // window break; } @@ -2287,6 +2289,9 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { openbox.grab(); if (! validateClient()) return; + if (flags.moving) + endMove(); + XChangeSaveSet(display, client.window, SetModeDelete); XSelectInput(display, client.window, NoEventMask); @@ -2322,6 +2327,8 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { void OpenboxWindow::destroyNotifyEvent(XDestroyWindowEvent *de) { if (de->window == client.window) { + if (flags.moving) + endMove(); XUnmapWindow(display, frame.window); delete this; @@ -2757,6 +2764,11 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { void OpenboxWindow::startMove(int x, int y) { ASSERT(!flags.moving); + // make sure only one window is moving at a time + OpenboxWindow *w = openbox.getMaskedWindow(); + if (w != (OpenboxWindow *) 0 && w->flags.moving) + w->endMove(); + XGrabPointer(display, frame.window, False, PointerMotionMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, openbox.getMoveCursor(), CurrentTime); @@ -2785,6 +2797,7 @@ void OpenboxWindow::startMove(int x, int y) { } frame.grab_x = x - frame.x - frame.border_w; frame.grab_y = y - frame.y - frame.border_w; + cout << "START MOVE " << client.window << " " << client.title << endl; } @@ -2874,6 +2887,11 @@ void OpenboxWindow::endMove() { } screen->hideGeometry(); XUngrabPointer(display, CurrentTime); + // if there are any left over motions from the move, drop them now cuz they + // cause problems + XEvent e; + while (XCheckTypedWindowEvent(display, frame.window, MotionNotify, &e)); + cout << "END MOVE " << client.window << " " << client.title << endl; } @@ -2887,11 +2905,12 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { else if (functions.resize && (((me->state & Button1Mask) && (me->window == frame.right_grip || me->window == frame.left_grip)) || - (me->state & (Mod1Mask | Button3Mask) && + (me->state == (Mod1Mask | Button3Mask) && me->window == frame.window))) { Bool left = resize_zone & ZoneLeft; if (! flags.resizing) { + cout << "START RESIZE " << client.window << " " << client.title << endl; Cursor cursor; if (resize_zone & ZoneTop) cursor = (resize_zone & ZoneLeft) ? @@ -2965,7 +2984,8 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { screen->showGeometry(gx, gy); } - } + } else + cout << "MOTION " << client.window << " " << client.title << endl; } @@ -3034,6 +3054,8 @@ void OpenboxWindow::restore(void) { XMapWindow(display, client.window); XFlush(display); + + delete this; }