X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=47809ea900240747bb6411324ab9526f77b08965;hb=c5c5a80c7e9146e0c53f866c1ddbc2c352f4dcea;hp=9da9033d263a40cbefbfe1498286b6d0d970c3a8;hpb=57ac5e5b5eba515f3d6b8a194b3a389a6d44a186;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 9da9033d..47809ea9 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -75,6 +75,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { blackbox = b; client.window = w; screen = s; + xatom = blackbox->getXAtom(); if (! validateClient()) { delete this; @@ -1758,14 +1759,10 @@ void BlackboxWindow::setState(unsigned long new_state) { unsigned long state[2]; state[0] = current_state; state[1] = None; - XChangeProperty(blackbox->getXDisplay(), client.window, - blackbox->getWMStateAtom(), blackbox->getWMStateAtom(), 32, - PropModeReplace, (unsigned char *) state, 2); - - XChangeProperty(blackbox->getXDisplay(), client.window, - blackbox->getBlackboxAttributesAtom(), - blackbox->getBlackboxAttributesAtom(), 32, PropModeReplace, - (unsigned char *) &blackbox_attrib, + xatom->setValue(client.window, XAtom::wm_state, XAtom::wm_state, state, 2); + + xatom->setValue(client.window, XAtom::blackbox_attributes, + XAtom::blackbox_attributes, (unsigned long *)&blackbox_attrib, PropBlackboxAttributesElements); } @@ -1775,27 +1772,16 @@ bool BlackboxWindow::getState(void) { Atom atom_return; bool ret = False; - int foo; - unsigned long *state, ulfoo, nitems; - - if ((XGetWindowProperty(blackbox->getXDisplay(), client.window, - blackbox->getWMStateAtom(), - 0l, 2l, False, blackbox->getWMStateAtom(), - &atom_return, &foo, &nitems, &ulfoo, - (unsigned char **) &state) != Success) || - (! state)) { - return False; - } + unsigned long *state, nitems; - if (nitems >= 1) { - current_state = static_cast(state[0]); - - ret = True; - } + if (! xatom->getValue(client.window, XAtom::wm_state, XAtom::wm_state, nitems, + &state)) + return False; - XFree((void *) state); + current_state = static_cast(state[0]); + delete state; - return ret; + return True; } @@ -1881,11 +1867,13 @@ void BlackboxWindow::setGravityOffsets(void) { // x coordinates for each gravity type const int x_west = client.rect.x(); const int x_east = client.rect.right() - frame.inside_w + 1; - const int x_center = client.rect.right() - (frame.rect.width()/2) + 1; + const int x_center = client.rect.left() + + ((client.rect.width() - frame.rect.width()) / 2); // y coordinates for each gravity type const int y_north = client.rect.y(); const int y_south = client.rect.bottom() - frame.inside_h + 1; - const int y_center = client.rect.bottom() - (frame.rect.height()/2) + 1; + const int y_center = client.rect.top() + + ((client.rect.height() - frame.rect.height()) / 2); switch (client.win_gravity) { default: @@ -1916,13 +1904,13 @@ void BlackboxWindow::restoreGravity(void) { // x coordinates for each gravity type const int x_west = frame.rect.x(); const int x_east = frame.rect.x() + frame.inside_w - client.rect.width(); - const int x_center = frame.rect.x() + (frame.rect.width()/2) - - client.rect.width(); + const int x_center = frame.rect.x() - + ((client.rect.width() - frame.rect.width()) / 2); // y coordinates for each gravity type const int y_north = frame.rect.y(); const int y_south = frame.rect.y() + frame.inside_h - client.rect.height(); - const int y_center = frame.rect.y() + (frame.rect.height()/2) - - client.rect.height(); + const int y_center = frame.rect.y() - + ((client.rect.height() - frame.rect.height()) / 2); switch(client.win_gravity) { default: @@ -2381,7 +2369,7 @@ void BlackboxWindow::buttonPressEvent(XButtonEvent *be) { // snap the window menu into a corner if necessary - we check the // position of the menu with the coordinates of the client to // make the comparisions easier. - // ### this needs some work! + // XXX: this needs some work! if (mx > client.rect.right() - static_cast(windowmenu->getWidth())) mx = frame.rect.right() - windowmenu->getWidth() - frame.border_w + 1; @@ -2526,30 +2514,72 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { const int snap_distance = screen->getEdgeSnapThreshold(); if (snap_distance) { - Rect srect = screen->availableArea(); // window corners const int wleft = dx, wright = dx + frame.rect.width() - 1, wtop = dy, wbottom = dy + frame.rect.height() - 1; + // Maybe this should be saved in the class, and set in the setWorkspace + // function!! + Workspace *w = screen->getWorkspace(getWorkspaceNumber()); + assert(w); + + // try snap to another window + for (unsigned int i = 0, c = w->getCount(); i < c; ++i) { + BlackboxWindow *snapwin = w->getWindow(i); + if (snapwin == this) + continue; // don't snap to self + + const Rect &winrect = snapwin->frameRect(); + int dleft = std::abs(wright - winrect.left()), + dright = std::abs(wleft - winrect.right()), + dtop = std::abs(wbottom - winrect.top()), + dbottom = std::abs(wtop - winrect.bottom()); + + // snap left? + if (dleft < snap_distance && dleft <= dright) { + dx = winrect.left() - frame.rect.width(); + continue; + } + // snap right? + else if (dright < snap_distance) { + dx = winrect.right() + 1; + continue; + } + + // snap top? + if (dtop < snap_distance && dtop <= dbottom) { + dy = winrect.top() - frame.rect.height(); + continue; + } + // snap bottom? + else if (dbottom < snap_distance) { + dy = winrect.bottom() + 1; + continue; + } + } + + // 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) + if (dleft < snap_distance && dleft <= dright) dx = srect.left(); // snap right? - else if (dright < snap_distance && dright < dleft) + else if (dright < snap_distance) dx = srect.right() - frame.rect.width() + 1; // snap top? - if (dtop < snap_distance && dtop < dbottom) + if (dtop < snap_distance && dtop <= dbottom) dy = srect.top(); // snap bottom? - else if (dbottom < snap_distance && dbottom < dtop) + else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; srect = screen->getRect(); // now get the full screen @@ -2560,17 +2590,17 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { dbottom = std::abs(wbottom - srect.bottom()); // snap left? - if (dleft < snap_distance && dleft < dright) + if (dleft < snap_distance && dleft <= dright) dx = srect.left(); // snap right? - else if (dright < snap_distance && dright < dleft) + else if (dright < snap_distance) dx = srect.right() - frame.rect.width() + 1; // snap top? - if (dtop < snap_distance && dtop < dbottom) + if (dtop < snap_distance && dtop <= dbottom) dy = srect.top(); // snap bottom? - else if (dbottom < snap_distance && dbottom < dtop) + else if (dbottom < snap_distance) dy = srect.bottom() - frame.rect.height() + 1; }