summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-05-28 09:53:11 +0000
committerDana Jansens <danakj@orodu.net>2002-05-28 09:53:11 +0000
commit57ac5e5b5eba515f3d6b8a194b3a389a6d44a186 (patch)
tree0aecfaff8cc6e1391515696c4e1db1fb1048e521 /src
parent6284d4ef9036764d4e6f708ca5f38aa7c1749865 (diff)
sync with bb-cvs
Diffstat (limited to 'src')
-rw-r--r--src/Screen.cc7
-rw-r--r--src/Window.cc55
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);
}