From 57ac5e5b5eba515f3d6b8a194b3a389a6d44a186 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 28 May 2002 09:53:11 +0000 Subject: [PATCH] sync with bb-cvs --- src/Screen.cc | 7 +++++++ src/Window.cc | 55 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index e744ab4c..e0ea2137 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1070,6 +1070,13 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) { removeNetizen(w->getClientWindow()); + /* + some managed windows can also be window group controllers. when + unmanaging such windows, we should also delete the window group. + */ + BWindowGroup *group = blackbox->searchGroup(w->getClientWindow()); + delete group; + delete w; } diff --git a/src/Window.cc b/src/Window.cc index a876e110..9da9033d 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -805,9 +805,10 @@ void BlackboxWindow::positionWindows(void) { XSetWindowBorderWidth(blackbox->getXDisplay(), frame.right_grip, frame.border_w); + // use client.rect here so the value is correct even if shaded XMoveResizeWindow(blackbox->getXDisplay(), frame.handle, -frame.border_w, - frame.rect.height() - frame.margin.bottom + + client.rect.height() + frame.margin.top + frame.mwm_border_w - frame.border_w, frame.inside_w, frame.handle_h); XMoveResizeWindow(blackbox->getXDisplay(), frame.left_grip, @@ -816,6 +817,7 @@ void BlackboxWindow::positionWindows(void) { XMoveResizeWindow(blackbox->getXDisplay(), frame.right_grip, frame.inside_w - frame.grip_w - frame.border_w, -frame.border_w, frame.grip_w, frame.handle_h); + XMapSubwindows(blackbox->getXDisplay(), frame.handle); XMapWindow(blackbox->getXDisplay(), frame.handle); } else if (frame.handle) { @@ -1501,7 +1503,9 @@ void BlackboxWindow::maximize(unsigned int button) { blackbox_attrib.premax_x = frame.rect.x(); blackbox_attrib.premax_y = frame.rect.y(); blackbox_attrib.premax_w = frame.rect.width(); - blackbox_attrib.premax_h = frame.rect.height(); + // use client.rect so that clients can be restored even if shaded + blackbox_attrib.premax_h = + client.rect.height() + frame.margin.top + frame.margin.bottom; const Rect &screen_area = screen->availableArea(); frame.changing = screen_area; @@ -2865,13 +2869,23 @@ void BlackboxWindow::upsize(void) { frame.margin.bottom = frame.border_w + frame.mwm_border_w; } - // set the frame rect - frame.rect.setSize(client.rect.width() + frame.margin.left + - frame.margin.right, - client.rect.height() + frame.margin.top + - frame.margin.bottom); - frame.inside_w = frame.rect.width() - (frame.border_w * 2); - frame.inside_h = frame.rect.height() - (frame.border_w * 2); + /* + We first get the normal dimensions and use this to define the inside_w/h + then we modify the height if shading is in effect. + If the shade state is not considered then frame.rect gets reset to the + normal window size on a reconfigure() call resulting in improper + dimensions appearing in move/resize and other events. + */ + unsigned int + height = client.rect.height() + frame.margin.top + frame.margin.bottom, + width = client.rect.width() + frame.margin.left + frame.margin.right; + + frame.inside_w = width - (frame.border_w * 2); + frame.inside_h = height - (frame.border_w * 2); + + if (flags.shaded) + height = frame.title_h + (frame.border_w * 2); + frame.rect.setSize(width, height); } @@ -2881,8 +2895,7 @@ void BlackboxWindow::upsize(void) { * * The logical width and height are placed into pw and ph, if they * are non-zero. Logical size refers to the users perception of - * the window size (for example an xterm has resizes in cells, not in - * pixels). + * the window size (for example an xterm resizes in cells, not in pixels). * * The physical geometry is placed into frame.changing_{x,y,width,height}. * Physical geometry refers to the geometry of the window in pixels. @@ -2978,8 +2991,24 @@ int WindowStyle::doJustify(const char *text, int &start_pos, BWindowGroup::BWindowGroup(Blackbox *b, Window _group) : blackbox(b), group(_group) { - // watch for destroy notify on the group window - XSelectInput(blackbox->getXDisplay(), group, StructureNotifyMask); + XWindowAttributes wattrib; + if (! XGetWindowAttributes(blackbox->getXDisplay(), group, &wattrib)) { + // group window doesn't seem to exist anymore + delete this; + return; + } + + /* + watch for destroy notify on the group window (in addition to + any other events we are looking for) + + since some managed windows can also be window group controllers, + we need to make sure that we don't clobber the event mask for the + managed window + */ + XSelectInput(blackbox->getXDisplay(), group, + wattrib.your_event_mask | StructureNotifyMask); + blackbox->saveGroupSearch(group, this); } -- 2.39.2