X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=8df9ddfe733af2da1c99ded8fa80de0da9ef7e1a;hb=4852193a578ea3c33f8685fd87322503c28e5544;hp=0a0339329c70a1e1e74b93881a7e1ce28856655b;hpb=d00ef145828941dc15c31bd7c3fc2f69f29c2955;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 0a033932..8df9ddfe 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -33,9 +33,9 @@ #include #include -#ifdef STDC_HEADERS +#ifdef HAVE_STRING_H # include -#endif // STDC_HEADERS +#endif // HAVE_STRING_H #ifdef DEBUG # ifdef HAVE_STDIO_H @@ -54,11 +54,12 @@ #ifdef SLIT # include "Slit.h" #endif // SLIT +#include "Util.h" /* * Initializes the class with default values/the window's set initial values. */ -OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { +OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { #ifdef DEBUG fprintf(stderr, i18n->getMessage(WindowSet, WindowCreating, "OpenboxWindow::OpenboxWindow(): creating 0x%lx\n"), @@ -66,10 +67,9 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { #endif // DEBUG client.window = w; - openbox = b; - display = openbox->getXDisplay(); + display = openbox.getXDisplay(); - openbox->grab(); + openbox.grab(); if (! validateClient()) return; // fetch client size and placement @@ -83,14 +83,14 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { "failed\n")); #endif // DEBUG - b->ungrab(); + openbox.ungrab(); return; } if (s) { screen = s; } else { - screen = openbox->searchScreen(RootWindowOfScreen(wattrib.screen)); + screen = openbox.searchScreen(RootWindowOfScreen(wattrib.screen)); if (! screen) { #ifdef DEBUG fprintf(stderr, i18n->getMessage(WindowSet, WindowCannotFindScreen, @@ -99,7 +99,7 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { RootWindowOfScreen(wattrib.screen)); #endif // DEBUG - b->ungrab(); + openbox.ungrab(); return; } } @@ -152,8 +152,8 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { lastButtonPressTime = 0; image_ctrl = screen->getImageControl(); - timer = new BTimer(openbox, this); - timer->setTimeout(openbox->getAutoRaiseDelay()); + timer = new BTimer(openbox, *this); + timer->setTimeout(openbox.getAutoRaiseDelay()); timer->fireOnce(True); getOpenboxHints(); @@ -169,29 +169,28 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { #ifdef SLIT if (client.initial_state == WithdrawnState) { screen->getSlit()->addClient(client.window); + openbox.ungrab(); delete this; - - b->ungrab(); return; } #endif // SLIT flags.managed = True; - openbox->saveWindowSearch(client.window, this); + openbox.saveWindowSearch(client.window, this); // determine if this is a transient window Window win; if (XGetTransientForHint(display, client.window, &win)) { if (win && (win != client.window)) { OpenboxWindow *tr; - if ((tr = openbox->searchWindow(win))) { + if ((tr = openbox.searchWindow(win))) { while (tr->client.transient) tr = tr->client.transient; client.transient_for = tr; tr->client.transient = this; flags.stuck = client.transient_for->flags.stuck; flags.transient = True; } else if (win == client.window_group) { - if ((tr = openbox->searchGroup(win, this))) { + if ((tr = openbox.searchGroup(win, this))) { while (tr->client.transient) tr = tr->client.transient; client.transient_for = tr; tr->client.transient = this; @@ -218,58 +217,58 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { upsize(); Bool place_window = True; - if (openbox->isStartup() || flags.transient || + if (openbox.isStartup() || flags.transient || client.normal_hint_flags & (PPosition|USPosition)) { setGravityOffsets(); - if ((openbox->isStartup()) || + if ((openbox.isStartup()) || (frame.x >= 0 && (signed) (frame.y + frame.y_border) >= 0 && - frame.x <= (signed) screen->getWidth() && - frame.y <= (signed) screen->getHeight())) + frame.x <= (signed) screen->size().w() && + frame.y <= (signed) screen->size().h())) place_window = False; } frame.window = createToplevelWindow(frame.x, frame.y, frame.width, frame.height, frame.border_w); - openbox->saveWindowSearch(frame.window, this); + openbox.saveWindowSearch(frame.window, this); frame.plate = createChildWindow(frame.window); - openbox->saveWindowSearch(frame.plate, this); + openbox.saveWindowSearch(frame.plate, this); if (decorations.titlebar) { frame.title = createChildWindow(frame.window); frame.label = createChildWindow(frame.title); - openbox->saveWindowSearch(frame.title, this); - openbox->saveWindowSearch(frame.label, this); + openbox.saveWindowSearch(frame.title, this); + openbox.saveWindowSearch(frame.label, this); } if (decorations.handle) { frame.handle = createChildWindow(frame.window); - openbox->saveWindowSearch(frame.handle, this); + openbox.saveWindowSearch(frame.handle, this); frame.left_grip = - createChildWindow(frame.handle, openbox->getLowerLeftAngleCursor()); - openbox->saveWindowSearch(frame.left_grip, this); + createChildWindow(frame.handle, openbox.getLowerLeftAngleCursor()); + openbox.saveWindowSearch(frame.left_grip, this); frame.right_grip = - createChildWindow(frame.handle, openbox->getLowerRightAngleCursor()); - openbox->saveWindowSearch(frame.right_grip, this); + createChildWindow(frame.handle, openbox.getLowerRightAngleCursor()); + openbox.saveWindowSearch(frame.right_grip, this); } associateClientWindow(); - if (! screen->isSloppyFocus()) - openbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask, + if (! screen->sloppyFocus()) + openbox.grabButton(Button1, 0, frame.plate, True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); - openbox->grabButton(Button1, Mod1Mask, frame.window, True, + openbox.grabButton(Button1, Mod1Mask, frame.window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, - GrabModeAsync, None, openbox->getMoveCursor()); - openbox->grabButton(Button2, Mod1Mask, frame.window, True, + GrabModeAsync, None, openbox.getMoveCursor()); + openbox.grabButton(Button2, Mod1Mask, frame.window, True, ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None); - openbox->grabButton(Button3, Mod1Mask, frame.window, True, + openbox.grabButton(Button3, Mod1Mask, frame.window, True, ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, GrabModeAsync, None, None); @@ -280,7 +279,7 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { XMapSubwindows(display, frame.window); if (decorations.menu) - windowmenu = new Windowmenu(this); + windowmenu = new Windowmenu(*this); decorate(); @@ -304,7 +303,7 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) { setFocusFlag(False); - openbox->ungrab(); + openbox.ungrab(); } @@ -339,7 +338,7 @@ OpenboxWindow::~OpenboxWindow(void) { XFree(client.openbox_hint); if (client.window_group) - openbox->removeGroupSearch(client.window_group); + openbox.removeGroupSearch(client.window_group); if (flags.transient && client.transient_for) client.transient_for->client.transient = client.transient; @@ -347,17 +346,17 @@ OpenboxWindow::~OpenboxWindow(void) { client.transient->client.transient_for = client.transient_for; if (frame.close_button) { - openbox->removeWindowSearch(frame.close_button); + openbox.removeWindowSearch(frame.close_button); XDestroyWindow(display, frame.close_button); } if (frame.iconify_button) { - openbox->removeWindowSearch(frame.iconify_button); + openbox.removeWindowSearch(frame.iconify_button); XDestroyWindow(display, frame.iconify_button); } if (frame.maximize_button) { - openbox->removeWindowSearch(frame.maximize_button); + openbox.removeWindowSearch(frame.maximize_button); XDestroyWindow(display, frame.maximize_button); } @@ -374,8 +373,8 @@ OpenboxWindow::~OpenboxWindow(void) { if( frame.ulabel) image_ctrl->removeImage(frame.ulabel); - openbox->removeWindowSearch(frame.label); - openbox->removeWindowSearch(frame.title); + openbox.removeWindowSearch(frame.label); + openbox.removeWindowSearch(frame.title); XDestroyWindow(display, frame.label); XDestroyWindow(display, frame.title); } @@ -393,9 +392,9 @@ OpenboxWindow::~OpenboxWindow(void) { if (frame.ugrip) image_ctrl->removeImage(frame.ugrip); - openbox->removeWindowSearch(frame.handle); - openbox->removeWindowSearch(frame.right_grip); - openbox->removeWindowSearch(frame.left_grip); + openbox.removeWindowSearch(frame.handle); + openbox.removeWindowSearch(frame.right_grip); + openbox.removeWindowSearch(frame.left_grip); XDestroyWindow(display, frame.right_grip); XDestroyWindow(display, frame.left_grip); XDestroyWindow(display, frame.handle); @@ -411,17 +410,17 @@ OpenboxWindow::~OpenboxWindow(void) { image_ctrl->removeImage(frame.pbutton); if (frame.plate) { - openbox->removeWindowSearch(frame.plate); + openbox.removeWindowSearch(frame.plate); XDestroyWindow(display, frame.plate); } if (frame.window) { - openbox->removeWindowSearch(frame.window); + openbox.removeWindowSearch(frame.window); XDestroyWindow(display, frame.window); } if (flags.managed) { - openbox->removeWindowSearch(client.window); + openbox.removeWindowSearch(client.window); screen->removeNetizen(client.window); } } @@ -501,7 +500,7 @@ void OpenboxWindow::associateClientWindow(void) { &attrib_set); #ifdef SHAPE - if (openbox->hasShapeExtensions()) { + if (openbox.hasShapeExtensions()) { XShapeSelectInput(display, client.window, ShapeNotifyMask); int foo; @@ -719,7 +718,7 @@ void OpenboxWindow::decorateLabel(void) { void OpenboxWindow::createCloseButton(void) { if (decorations.close && frame.title != None) { frame.close_button = createChildWindow(frame.title); - openbox->saveWindowSearch(frame.close_button, this); + openbox.saveWindowSearch(frame.close_button, this); } } @@ -727,7 +726,7 @@ void OpenboxWindow::createCloseButton(void) { void OpenboxWindow::createIconifyButton(void) { if (decorations.iconify && frame.title != None) { frame.iconify_button = createChildWindow(frame.title); - openbox->saveWindowSearch(frame.iconify_button, this); + openbox.saveWindowSearch(frame.iconify_button, this); } } @@ -735,13 +734,13 @@ void OpenboxWindow::createIconifyButton(void) { void OpenboxWindow::createMaximizeButton(void) { if (decorations.maximize && frame.title != None) { frame.maximize_button = createChildWindow(frame.title); - openbox->saveWindowSearch(frame.maximize_button, this); + openbox.saveWindowSearch(frame.maximize_button, this); } } void OpenboxWindow::positionButtons(Bool redecorate_label) { - const char *format = openbox->getTitleBarLayout(); + const char *format = openbox.getTitleBarLayout(); const unsigned int bw = frame.bevel_w + 1; const unsigned int by = frame.bevel_w + 1; unsigned int bx = frame.bevel_w + 1; @@ -802,15 +801,15 @@ void OpenboxWindow::positionButtons(Bool redecorate_label) { } if (!hasclose) { - openbox->removeWindowSearch(frame.close_button); + openbox.removeWindowSearch(frame.close_button); XDestroyWindow(display, frame.close_button); } if (!hasiconify) { - openbox->removeWindowSearch(frame.iconify_button); + openbox.removeWindowSearch(frame.iconify_button); XDestroyWindow(display, frame.iconify_button); } if (!hasmaximize) { - openbox->removeWindowSearch(frame.maximize_button); + openbox.removeWindowSearch(frame.maximize_button); XDestroyWindow(display, frame.maximize_button); } if (redecorate_label) @@ -848,11 +847,11 @@ void OpenboxWindow::reconfigure(void) { configure(frame.x, frame.y, frame.width, frame.height); - if (! screen->isSloppyFocus()) - openbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask, + if (! screen->sloppyFocus()) + openbox.grabButton(Button1, 0, frame.plate, True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); else - openbox->ungrabButton(Button1, 0, frame.plate); + openbox.ungrabButton(Button1, 0, frame.plate); if (windowmenu) { windowmenu->move(windowmenu->getX(), frame.y + frame.title_h); @@ -1000,12 +999,12 @@ void OpenboxWindow::getWMProtocols(void) { if (XGetWMProtocols(display, client.window, &proto, &num_return)) { for (int i = 0; i < num_return; ++i) { - if (proto[i] == openbox->getWMDeleteAtom()) + if (proto[i] == openbox.getWMDeleteAtom()) functions.close = decorations.close = True; - else if (proto[i] == openbox->getWMTakeFocusAtom()) + else if (proto[i] == openbox.getWMTakeFocusAtom()) flags.send_focus_message = True; - else if (proto[i] == openbox->getOpenboxStructureMessagesAtom()) - screen->addNetizen(new Netizen(screen, client.window)); + else if (proto[i] == openbox.getOpenboxStructureMessagesAtom()) + screen->addNetizen(new Netizen(*screen, client.window)); } XFree(proto); @@ -1052,7 +1051,7 @@ void OpenboxWindow::getWMHints(void) { if (wmhint->flags & WindowGroupHint) { if (! client.window_group) { client.window_group = wmhint->window_group; - openbox->saveGroupSearch(client.window_group, this); + openbox.saveGroupSearch(client.window_group, this); } } else { client.window_group = None; @@ -1072,8 +1071,8 @@ void OpenboxWindow::getWMNormalHints(void) { client.min_width = client.min_height = client.base_width = client.base_height = client.width_inc = client.height_inc = 1; - client.max_width = screen->getWidth(); - client.max_height = screen->getHeight(); + client.max_width = screen->size().w(); + client.max_height = screen->size().h(); client.min_aspect_x = client.min_aspect_y = client.max_aspect_x = client.max_aspect_y = 1; client.win_gravity = NorthWestGravity; @@ -1128,9 +1127,9 @@ void OpenboxWindow::getMWMHints(void) { unsigned long num, len; int ret = XGetWindowProperty(display, client.window, - openbox->getMotifWMHintsAtom(), 0, + openbox.getMotifWMHintsAtom(), 0, PropMwmHintsElements, False, - openbox->getMotifWMHintsAtom(), &atom_return, + openbox.getMotifWMHintsAtom(), &atom_return, &format, &num, &len, (unsigned char **) &client.mwm_hint); @@ -1198,9 +1197,9 @@ void OpenboxWindow::getOpenboxHints(void) { unsigned long num, len; int ret = XGetWindowProperty(display, client.window, - openbox->getOpenboxHintsAtom(), 0, + openbox.getOpenboxHintsAtom(), 0, PropOpenboxHintsElements, False, - openbox->getOpenboxHintsAtom(), &atom_return, + openbox.getOpenboxHintsAtom(), &atom_return, &format, &num, &len, (unsigned char **) &client.openbox_hint); if (ret != Success || !client.openbox_hint || @@ -1288,7 +1287,7 @@ void OpenboxWindow::configure(int dx, int dy, downsize(); #ifdef SHAPE - if (openbox->hasShapeExtensions() && flags.shaped) { + if (openbox.hasShapeExtensions() && flags.shaped) { XShapeCombineShape(display, frame.window, ShapeBounding, frame.mwm_border_w, frame.y_border + frame.mwm_border_w, client.window, @@ -1358,25 +1357,25 @@ Bool OpenboxWindow::setInputFocus(void) { if (((signed) (frame.x + frame.width)) < 0) { if (((signed) (frame.y + frame.y_border)) < 0) configure(frame.border_w, frame.border_w, frame.width, frame.height); - else if (frame.y > (signed) screen->getHeight()) - configure(frame.border_w, screen->getHeight() - frame.height, + else if (frame.y > (signed) screen->size().h()) + configure(frame.border_w, screen->size().h() - frame.height, frame.width, frame.height); else configure(frame.border_w, frame.y + frame.border_w, frame.width, frame.height); - } else if (frame.x > (signed) screen->getWidth()) { + } else if (frame.x > (signed) screen->size().w()) { if (((signed) (frame.y + frame.y_border)) < 0) - configure(screen->getWidth() - frame.width, frame.border_w, + configure(screen->size().w() - frame.width, frame.border_w, frame.width, frame.height); - else if (frame.y > (signed) screen->getHeight()) - configure(screen->getWidth() - frame.width, - screen->getHeight() - frame.height, frame.width, frame.height); + else if (frame.y > (signed) screen->size().h()) + configure(screen->size().w() - frame.width, + screen->size().h() - frame.height, frame.width, frame.height); else - configure(screen->getWidth() - frame.width, + configure(screen->size().w() - frame.width, frame.y + frame.border_w, frame.width, frame.height); } - openbox->grab(); + openbox.grab(); if (! validateClient()) return False; Bool ret = False; @@ -1391,30 +1390,30 @@ Bool OpenboxWindow::setInputFocus(void) { XSetInputFocus(display, screen->getRootWindow(), RevertToNone, CurrentTime); - openbox->setFocusedWindow(this); + openbox.setFocusedWindow(this); if (flags.send_focus_message) { XEvent ce; ce.xclient.type = ClientMessage; - ce.xclient.message_type = openbox->getWMProtocolsAtom(); + ce.xclient.message_type = openbox.getWMProtocolsAtom(); ce.xclient.display = display; ce.xclient.window = client.window; ce.xclient.format = 32; - ce.xclient.data.l[0] = openbox->getWMTakeFocusAtom(); - ce.xclient.data.l[1] = openbox->getLastTime(); + ce.xclient.data.l[0] = openbox.getWMTakeFocusAtom(); + ce.xclient.data.l[1] = openbox.getLastTime(); ce.xclient.data.l[2] = 0l; ce.xclient.data.l[3] = 0l; ce.xclient.data.l[4] = 0l; XSendEvent(display, client.window, False, NoEventMask, &ce); } - if (screen->isSloppyFocus() && screen->doAutoRaise()) + if (screen->sloppyFocus() && screen->autoRaise()) timer->start(); ret = True; } - openbox->ungrab(); + openbox.ungrab(); return ret; } @@ -1466,7 +1465,25 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) { XMapSubwindows(display, frame.window); XMapWindow(display, frame.window); - if (flags.iconic && screen->doFocusNew()) setInputFocus(); + // 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 (!(flags.iconic || reassoc) && + screen->placementPolicy() == BScreen::ClickMousePlacement) { + // 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(); + + int x, y, rx, ry; + Window c, r; + unsigned int m; + XQueryPointer(openbox.getXDisplay(), screen->getRootWindow(), + &r, &c, &rx, &ry, &x, &y, &m); + startMove(rx, ry); + } + + if (flags.iconic && screen->focusNew()) setInputFocus(); flags.visible = True; flags.iconic = False; @@ -1481,11 +1498,11 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) { void OpenboxWindow::close(void) { XEvent ce; ce.xclient.type = ClientMessage; - ce.xclient.message_type = openbox->getWMProtocolsAtom(); + ce.xclient.message_type = openbox.getWMProtocolsAtom(); ce.xclient.display = display; ce.xclient.window = client.window; ce.xclient.format = 32; - ce.xclient.data.l[0] = openbox->getWMDeleteAtom(); + ce.xclient.data.l[0] = openbox.getWMDeleteAtom(); ce.xclient.data.l[1] = CurrentTime; ce.xclient.data.l[2] = 0l; ce.xclient.data.l[3] = 0l; @@ -1495,6 +1512,9 @@ void OpenboxWindow::close(void) { void OpenboxWindow::withdraw(void) { + if (flags.moving) + endMove(); + flags.visible = False; flags.iconic = False; @@ -1534,29 +1554,24 @@ void OpenboxWindow::maximize(unsigned int button) { return; } - int dx = 0, dy = 0; - unsigned int dw, dh; - openbox_attrib.premax_x = frame.x; openbox_attrib.premax_y = frame.y; openbox_attrib.premax_w = frame.width; openbox_attrib.premax_h = frame.height; - dw = screen->getWidth(); + Rect space = screen->availableArea(); + unsigned int dw = space.w(), + dh = space.h(); dw -= frame.border_w * 2; dw -= frame.mwm_border_w * 2; dw -= client.base_width; - dh = screen->getHeight(); dh -= frame.border_w * 2; dh -= frame.mwm_border_w * 2; dh -= ((frame.handle_h + frame.border_w) * decorations.handle); dh -= client.base_height; dh -= frame.y_border; - if (! screen->doFullMax()) - dh -= screen->getToolbar()->getExposedHeight() + frame.border_w; - if (dw < client.min_width) dw = client.min_width; if (dh < client.min_height) dh = client.min_height; if (dw > client.max_width) dw = client.max_width; @@ -1572,23 +1587,8 @@ void OpenboxWindow::maximize(unsigned int button) { dh += ((frame.handle_h + frame.border_w) * decorations.handle); dh += frame.mwm_border_w * 2; - dx += ((screen->getWidth() - dw) / 2) - frame.border_w; - - if (screen->doFullMax()) { - dy += ((screen->getHeight() - dh) / 2) - frame.border_w; - } else { - dy += (((screen->getHeight() - screen->getToolbar()->getExposedHeight()) - - dh) / 2) - frame.border_w; - - switch (screen->getToolbarPlacement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - dy += screen->getToolbar()->getExposedHeight() + - frame.border_w; - break; - } - } + int dx = space.x() + ((space.w() - dw) / 2) - frame.border_w, + dy = space.y() + ((space.h() - dh) / 2) - frame.border_w; switch(button) { case 1: @@ -1741,13 +1741,14 @@ void OpenboxWindow::setFocusFlag(Bool focus) { XSetWindowBorder(display, frame.plate, frame.uborder_pixel); } - if (screen->isSloppyFocus() && screen->doAutoRaise() && timer->isTiming()) + if (screen->sloppyFocus() && screen->autoRaise() && timer->isTiming()) timer->stop(); + } void OpenboxWindow::installColormap(Bool install) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; int i = 0, ncmap = 0; @@ -1778,7 +1779,7 @@ void OpenboxWindow::installColormap(Bool install) { XFree(cmaps); } - openbox->ungrab(); + openbox.ungrab(); } @@ -1788,13 +1789,13 @@ void OpenboxWindow::setState(unsigned long new_state) { unsigned long state[2]; state[0] = (unsigned long) current_state; state[1] = (unsigned long) None; - XChangeProperty(display, client.window, openbox->getWMStateAtom(), - openbox->getWMStateAtom(), 32, PropModeReplace, + XChangeProperty(display, client.window, openbox.getWMStateAtom(), + openbox.getWMStateAtom(), 32, PropModeReplace, (unsigned char *) state, 2); XChangeProperty(display, client.window, - openbox->getOpenboxAttributesAtom(), - openbox->getOpenboxAttributesAtom(), 32, PropModeReplace, + openbox.getOpenboxAttributesAtom(), + openbox.getOpenboxAttributesAtom(), 32, PropModeReplace, (unsigned char *) &openbox_attrib, PropOpenboxAttributesElements); } @@ -1808,12 +1809,12 @@ Bool OpenboxWindow::getState(void) { int foo; unsigned long *state, ulfoo, nitems; - if ((XGetWindowProperty(display, client.window, openbox->getWMStateAtom(), - 0l, 2l, False, openbox->getWMStateAtom(), + if ((XGetWindowProperty(display, client.window, openbox.getWMStateAtom(), + 0l, 2l, False, openbox.getWMStateAtom(), &atom_return, &foo, &nitems, &ulfoo, (unsigned char **) &state) != Success) || (! state)) { - openbox->ungrab(); + openbox.ungrab(); return False; } @@ -1895,9 +1896,9 @@ void OpenboxWindow::restoreAttributes(void) { OpenboxAttributes *net; int ret = XGetWindowProperty(display, client.window, - openbox->getOpenboxAttributesAtom(), 0l, + openbox.getOpenboxAttributesAtom(), 0l, PropOpenboxAttributesElements, False, - openbox->getOpenboxAttributesAtom(), + openbox.getOpenboxAttributesAtom(), &atom_return, &foo, &nitems, &ulfoo, (unsigned char **) &net); if (ret != Success || !net || nitems != PropOpenboxAttributesElements) @@ -2211,11 +2212,11 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { client.window); #endif // DEBUG - openbox->grab(); + openbox.grab(); if (! validateClient()) return; Bool get_state_ret = getState(); - if (! (get_state_ret && openbox->isStartup())) { + if (! (get_state_ret && openbox.isStartup())) { if ((client.wm_hint_flags & StateHint) && (! (current_state == NormalState || current_state == IconicState))) current_state = client.initial_state; @@ -2242,7 +2243,7 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { break; } - openbox->ungrab(); + openbox.ungrab(); } } @@ -2250,7 +2251,7 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) { if ((ne->window == client.window) && (! ne->override_redirect) && (flags.visible)) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; if (decorations.titlebar) positionButtons(); @@ -2259,7 +2260,7 @@ void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) { redrawAllButtons(); - if (flags.transient || screen->doFocusNew()) + if (flags.transient || screen->focusNew()) setInputFocus(); else setFocusFlag(False); @@ -2267,7 +2268,7 @@ void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) { flags.visible = True; flags.iconic = False; - openbox->ungrab(); + openbox.ungrab(); } } @@ -2280,15 +2281,15 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { client.window); #endif // DEBUG - openbox->grab(); + openbox.grab(); if (! validateClient()) return; XChangeSaveSet(display, client.window, SetModeDelete); XSelectInput(display, client.window, NoEventMask); - XDeleteProperty(display, client.window, openbox->getWMStateAtom()); + XDeleteProperty(display, client.window, openbox.getWMStateAtom()); XDeleteProperty(display, client.window, - openbox->getOpenboxAttributesAtom()); + openbox.getOpenboxAttributesAtom()); XUnmapWindow(display, frame.window); XUnmapWindow(display, client.window); @@ -2309,7 +2310,7 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { XFlush(display); - openbox->ungrab(); + openbox.ungrab(); delete this; } @@ -2326,7 +2327,7 @@ void OpenboxWindow::destroyNotifyEvent(XDestroyWindowEvent *de) { void OpenboxWindow::propertyNotifyEvent(Atom atom) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; switch(atom) { @@ -2340,13 +2341,13 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) { Window win; if (XGetTransientForHint(display, client.window, &win)) { if (win && (win != client.window)) { - if ((client.transient_for = openbox->searchWindow(win))) { + if ((client.transient_for = openbox.searchWindow(win))) { client.transient_for->client.transient = this; flags.stuck = client.transient_for->flags.stuck; flags.transient = True; } else if (win == client.window_group) { //jr This doesn't look quite right... - if ((client.transient_for = openbox->searchGroup(win, this))) { + if ((client.transient_for = openbox.searchGroup(win, this))) { client.transient_for->client.transient = this; flags.stuck = client.transient_for->flags.stuck; flags.transient = True; @@ -2412,7 +2413,7 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) { } default: - if (atom == openbox->getWMProtocolsAtom()) { + if (atom == openbox.getWMProtocolsAtom()) { getWMProtocols(); if (decorations.close && (! frame.close_button)) { @@ -2425,7 +2426,7 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) { break; } - openbox->ungrab(); + openbox.ungrab(); } @@ -2443,7 +2444,7 @@ void OpenboxWindow::exposeEvent(XExposeEvent *ee) { void OpenboxWindow::configureRequestEvent(XConfigureRequestEvent *cr) { if (cr->window == client.window) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; int cx = frame.x, cy = frame.y; @@ -2487,13 +2488,13 @@ void OpenboxWindow::configureRequestEvent(XConfigureRequestEvent *cr) { } } - openbox->ungrab(); + openbox.ungrab(); } } void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; @@ -2504,8 +2505,6 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { // alt + left/right click begins interactively moving/resizing the window // when the mouse is moved if (be->state == Mod1Mask && (be->button == 1 || be->button == 3)) { - frame.grab_x = be->x_root - frame.x - frame.border_w; - frame.grab_y = be->y_root - frame.y - frame.border_w; if (be->button == 3) { if (screen->getWindowZones() == 4 && be->y < (signed) frame.height / 2) { @@ -2542,7 +2541,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { be->window == frame.label) { // shade the window when the titlebar is double clicked if ( (be->time - lastButtonPressTime) <= - openbox->getDoubleClickInterval()) { + openbox.getDoubleClickInterval()) { lastButtonPressTime = 0; shade(); } else { @@ -2642,7 +2641,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { shade(); } - if (! (flags.focused || screen->isSloppyFocus()) ) { + if (! (flags.focused || screen->sloppyFocus()) ) { setInputFocus(); // any click focus' the window in 'click to focus' } if (stack_change < 0) { @@ -2651,12 +2650,12 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { screen->getWorkspace(workspace_number)->raiseWindow(this); } - openbox->ungrab(); + openbox.ungrab(); } void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; @@ -2720,21 +2719,7 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { // when the window is being interactively moved, a button release stops the // move where it is if (flags.moving) { - flags.moving = False; - - openbox->maskWindowEvents(0, (OpenboxWindow *) 0); - if (!screen->doOpaqueMove()) { - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - - configure(frame.move_x, frame.move_y, frame.width, frame.height); - openbox->ungrab(); - } else { - configure(frame.x, frame.y, frame.width, frame.height); - } - screen->hideGeometry(); - XUngrabPointer(display, CurrentTime); + endMove(); // when the window is being interactively resized, a button release stops the // resizing } else if (flags.resizing) { @@ -2757,111 +2742,146 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { configure(frame.resize_x, frame.resize_y, frame.resize_w - (frame.border_w * 2), frame.resize_h - (frame.border_w * 2)); - openbox->ungrab(); + openbox.ungrab(); XUngrabPointer(display, CurrentTime); resize_zone = 0; } - openbox->ungrab(); + openbox.ungrab(); } -void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { - if (!flags.resizing && (me->state & Button1Mask) && functions.move && - (frame.title == me->window || frame.label == me->window || - frame.handle == me->window || frame.window == me->window)) { - if (! flags.moving) { - XGrabPointer(display, me->window, False, Button1MotionMask | - ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - None, openbox->getMoveCursor(), CurrentTime); +void OpenboxWindow::startMove(int x, int y) { + ASSERT(!flags.moving); - if (windowmenu && windowmenu->isVisible()) - windowmenu->hide(); + XGrabPointer(display, frame.window, False, PointerMotionMask | + ButtonReleaseMask, GrabModeAsync, GrabModeAsync, + None, openbox.getMoveCursor(), CurrentTime); - flags.moving = True; + if (windowmenu && windowmenu->isVisible()) + windowmenu->hide(); - openbox->maskWindowEvents(client.window, this); + flags.moving = True; - if (! screen->doOpaqueMove()) { - openbox->grab(); + openbox.maskWindowEvents(client.window, this); - frame.move_x = frame.x; - frame.move_y = frame.y; - frame.resize_w = frame.width + (frame.border_w * 2); - frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) + - (frame.border_w * 2); + if (! screen->opaqueMove()) { + openbox.grab(); - screen->showPosition(frame.x, frame.y); + frame.move_x = frame.x; + frame.move_y = frame.y; + frame.resize_w = frame.width + (frame.border_w * 2); + frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) + + (frame.border_w * 2); - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, - frame.resize_w - 1, frame.resize_h - 1); - } - } else { - int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y; - - dx -= frame.border_w; - dy -= frame.border_w; - - int snap_distance = screen->getEdgeSnapThreshold(); - // width/height of the snapping window - unsigned int snap_w = frame.width + (frame.border_w * 2); - unsigned int snap_h = getHeight() + (frame.border_w * 2); - if (snap_distance) { - int drx = screen->getWidth() - (dx + snap_w); - - if (dx < drx && (dx > 0 && dx < snap_distance) || - (dx < 0 && dx > -snap_distance) ) - dx = 0; - else if ( (drx > 0 && drx < snap_distance) || - (drx < 0 && drx > -snap_distance) ) - dx = screen->getWidth() - snap_w; - - int dtty, dbby, dty, dby; - switch (screen->getToolbarPlacement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - dtty = screen->getToolbar()->getExposedHeight() + - frame.border_w; - dbby = screen->getHeight(); - break; - - default: - dtty = 0; - dbby = screen->getToolbar()->getY(); - break; - } + screen->showPosition(frame.x, frame.y); - dty = dy - dtty; - dby = dbby - (dy + snap_h); + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, + frame.resize_w - 1, frame.resize_h - 1); + } + frame.grab_x = x - frame.x - frame.border_w; + frame.grab_y = y - frame.y - frame.border_w; +} - if ( (dy > 0 && dty < snap_distance) || - (dy < 0 && dty > -snap_distance) ) - dy = dtty; - else if ( (dby > 0 && dby < snap_distance) || - (dby < 0 && dby > -snap_distance) ) - dy = dbby - snap_h; - } - if (screen->doOpaqueMove()) { - configure(dx, dy, frame.width, frame.height); - } else { - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); +void OpenboxWindow::doMove(int x, int y) { + ASSERT(flags.moving); - frame.move_x = dx; - frame.move_y = dy; + int dx = x - frame.grab_x, dy = y - frame.grab_y; - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - } + dx -= frame.border_w; + dy -= frame.border_w; + + int snap_distance = screen->edgeSnapThreshold(); + // width/height of the snapping window + unsigned int snap_w = frame.width + (frame.border_w * 2); + unsigned int snap_h = area().h() + (frame.border_w * 2); + if (snap_distance) { + int drx = screen->size().w() - (dx + snap_w); + + if (dx < drx && (dx > 0 && dx < snap_distance) || + (dx < 0 && dx > -snap_distance) ) + dx = 0; + else if ( (drx > 0 && drx < snap_distance) || + (drx < 0 && drx > -snap_distance) ) + dx = screen->size().w() - snap_w; + + int dtty, dbby, dty, dby; + switch (screen->getToolbar()->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + dtty = screen->getToolbar()->getExposedHeight() + + frame.border_w; + dbby = screen->size().h(); + break; - screen->showPosition(dx, dy); + default: + dtty = 0; + dbby = screen->getToolbar()->area().y(); + break; } - } else if (functions.resize && + + dty = dy - dtty; + dby = dbby - (dy + snap_h); + + if ( (dy > 0 && dty < snap_distance) || + (dy < 0 && dty > -snap_distance) ) + dy = dtty; + else if ( (dby > 0 && dby < snap_distance) || + (dby < 0 && dby > -snap_distance) ) + dy = dbby - snap_h; + } + + if (screen->opaqueMove()) { + configure(dx, dy, frame.width, frame.height); + } else { + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + + frame.move_x = dx; + frame.move_y = dy; + + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + } + + screen->showPosition(dx, dy); +} + + +void OpenboxWindow::endMove() { + ASSERT(flags.moving); + + flags.moving = False; + + openbox.maskWindowEvents(0, (OpenboxWindow *) 0); + if (!screen->opaqueMove()) { + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + + configure(frame.move_x, frame.move_y, frame.width, frame.height); + openbox.ungrab(); + } else { + configure(frame.x, frame.y, frame.width, frame.height); + } + screen->hideGeometry(); + XUngrabPointer(display, CurrentTime); +} + + +void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { + if (flags.moving) + doMove(me->x_root, me->y_root); + else if (!flags.resizing && (me->state & Button1Mask) && functions.move && + (frame.title == me->window || frame.label == me->window || + frame.handle == me->window || frame.window == me->window)) + startMove(me->x_root, me->y_root); + else if (functions.resize && (((me->state & Button1Mask) && (me->window == frame.right_grip || me->window == frame.left_grip)) || (me->state & (Mod1Mask | Button3Mask) && @@ -2872,19 +2892,19 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { Cursor cursor; if (resize_zone & ZoneTop) cursor = (resize_zone & ZoneLeft) ? - openbox->getUpperLeftAngleCursor() : - openbox->getUpperRightAngleCursor(); + openbox.getUpperLeftAngleCursor() : + openbox.getUpperRightAngleCursor(); else cursor = (resize_zone & ZoneLeft) ? - openbox->getLowerLeftAngleCursor() : - openbox->getLowerRightAngleCursor(); + openbox.getLowerLeftAngleCursor() : + openbox.getLowerRightAngleCursor(); XGrabPointer(display, me->window, False, ButtonMotionMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime); flags.resizing = True; - openbox->grab(); + openbox.grab(); int gx, gy; if (resize_zone & ZoneRight) @@ -2948,9 +2968,9 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { #ifdef SHAPE void OpenboxWindow::shapeEvent(XShapeEvent *) { - if (openbox->hasShapeExtensions()) { + if (openbox.hasShapeExtensions()) { if (flags.shaped) { - openbox->grab(); + openbox.grab(); if (! validateClient()) return; XShapeCombineShape(display, frame.window, ShapeBounding, frame.mwm_border_w, frame.y_border + @@ -2973,7 +2993,7 @@ void OpenboxWindow::shapeEvent(XShapeEvent *) { XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0, xrect, num, ShapeUnion, Unsorted); - openbox->ungrab(); + openbox.ungrab(); } } } @@ -2987,7 +3007,7 @@ Bool OpenboxWindow::validateClient(void) { if (XCheckTypedWindowEvent(display, client.window, DestroyNotify, &e) || XCheckTypedWindowEvent(display, client.window, UnmapNotify, &e)) { XPutBackEvent(display, &e); - openbox->ungrab(); + openbox.ungrab(); return False; }