From 206ad12bda6688bdd210f75b53b4989038f4e875 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 22 May 2007 23:21:46 +0000 Subject: [PATCH] fix window gravity.. also less setting the wm_state hint redundantly --- openbox/client.c | 36 +++++++++++++++++------------------- openbox/frame.c | 32 ++++++++++++++++++++++---------- tests/grav.c | 2 +- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 51b26a7..557909a 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -2446,13 +2446,13 @@ gboolean client_show(ObClient *self) if (client_should_show(self)) { frame_show(self->frame); show = TRUE; - } - /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it - needs to be in IconicState. This includes when it is on another - desktop! - */ - client_change_wm_state(self); + /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, + it needs to be in IconicState. This includes when it is on another + desktop! + */ + client_change_wm_state(self); + } return show; } @@ -2475,13 +2475,13 @@ gboolean client_hide(ObClient *self) frame_hide(self->frame); hide = TRUE; - } - /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it - needs to be in IconicState. This includes when it is on another - desktop! - */ - client_change_wm_state(self); + /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, + it needs to be in IconicState. This includes when it is on another + desktop! + */ + client_change_wm_state(self); + } return hide; } @@ -2489,12 +2489,6 @@ void client_showhide(ObClient *self) { if (!client_show(self)) client_hide(self); - - /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it - needs to be in IconicState. This includes when it is on another - desktop! - */ - client_change_wm_state(self); } gboolean client_normal(ObClient *self) { @@ -2597,7 +2591,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h, /* make the frame recalculate its dimentions n shit without changing anything visible for real, this way the constraints below can work with the updated frame dimensions. */ - frame_adjust_area(self->frame, TRUE, TRUE, TRUE); + frame_adjust_area(self->frame, FALSE, TRUE, TRUE); /* work within the prefered sizes given by the window */ if (!(*w == self->area.width && *h == self->area.height)) { @@ -2788,11 +2782,15 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, /* find the frame's dimensions and move/resize it */ fmoved = moved; fresized = resized; + + /* if decorations changed, then readjust everything for the frame */ if (self->decorations != fdecor || self->max_horz != fhorz || self->max_vert != fvert) { fmoved = fresized = TRUE; } + + /* adjust the frame */ if (fmoved || fresized) frame_adjust_area(self->frame, fmoved, fresized, FALSE); diff --git a/openbox/frame.c b/openbox/frame.c index ba45216..60d04eb 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -696,7 +696,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->client->area.height + self->size.top + self->size.bottom)); - if (moved || resized) { + if ((moved || resized) && !fake) { /* find the new coordinates, done after setting the frame.size, for frame_client_gravity. */ self->area.x = self->client->area.x; @@ -1309,17 +1309,20 @@ void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) case NorthGravity: case SouthGravity: case CenterGravity: - *x -= (self->size.left + w) / 2; + /* the middle of the client will be the middle of the frame */ + *x -= (self->size.right - self->size.left) / 2; break; case NorthEastGravity: case SouthEastGravity: case EastGravity: - *x -= (self->size.left + self->size.right + w) - 1; + /* the right side of the client will be the right side of the frame */ + *x -= self->size.right + self->size.left; break; case ForgetGravity: case StaticGravity: + /* the client's position won't move */ *x -= self->size.left; break; } @@ -1335,17 +1338,20 @@ void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) case CenterGravity: case EastGravity: case WestGravity: - *y -= (self->size.top + h) / 2; + /* the middle of the client will be the middle of the frame */ + *y -= (self->size.bottom - self->size.top) / 2; break; case SouthWestGravity: case SouthEastGravity: case SouthGravity: - *y -= (self->size.top + self->size.bottom + h) - 1; + /* the bottom of the client will be the bottom of the frame */ + *y -= self->size.bottom + self->size.top; break; case ForgetGravity: case StaticGravity: + /* the client's position won't move */ *y -= self->size.top; break; } @@ -1363,16 +1369,19 @@ void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) case NorthGravity: case CenterGravity: case SouthGravity: - *x += (self->size.left + w) / 2; + /* the middle of the client will be the middle of the frame */ + *x += (self->size.right - self->size.left) / 2; break; case NorthEastGravity: case EastGravity: case SouthEastGravity: - *x += (self->size.left + self->size.right + w) - 1; + /* the right side of the client will be the right side of the frame */ + *x += self->size.right + self->size.left; break; case StaticGravity: case ForgetGravity: - *x += self->size.left; + /* the client's position won't move */ + *x -= self->size.left; break; } @@ -1386,15 +1395,18 @@ void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) case WestGravity: case CenterGravity: case EastGravity: - *y += (self->size.top + h) / 2; + /* the middle of the client will be the middle of the frame */ + *y += (self->size.bottom - self->size.top) / 2; break; case SouthWestGravity: case SouthGravity: case SouthEastGravity: - *y += (self->size.top + self->size.bottom + h) - 1; + /* the bottom of the client will be the bottom of the frame */ + *y += self->size.bottom + self->size.top; break; case StaticGravity: case ForgetGravity: + /* the client's position won't move */ *y += self->size.top; break; } diff --git a/tests/grav.c b/tests/grav.c index 5aeed8b..2fee306 100644 --- a/tests/grav.c +++ b/tests/grav.c @@ -49,7 +49,7 @@ int main () { XMapWindow(display, win); XFlush(display); - XMoveResizeWindow(display, win, 960-1, 600-1, 600, 150); + XMoveResizeWindow(display, win, 1172-600, 668-150, 600, 150); /*XResizeWindow(display, win, 600, 150);*/ XSelectInput(display, win, ExposureMask | StructureNotifyMask); -- 1.9.1