X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=f3425ba3a840d386128980e61af597e75bbf5788;hb=9cb80fc994c09ee62f99f46244b840ce25fd40f4;hp=ba452166bc12c67962726a2058202ab687e921d7;hpb=49c7c0305b6662b9d0da51c5eaac4318b8bc987c;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index ba452166..f3425ba3 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -353,6 +353,11 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } else self->width = self->client->area.width + self->cbwidth_x * 2; + /* some elements are sized based of the width, so don't let them have + negative values */ + self->width = MAX(self->width, + (ob_rr_theme->grip_width + self->bwidth) * 2) + 1; + STRUT_SET(self->size, self->cbwidth_x + (!self->max_horz ? self->bwidth : 0), self->cbwidth_y + self->bwidth, @@ -441,19 +446,17 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (self->decorations & OB_FRAME_DECOR_GRIPS) { XMoveResizeWindow(ob_display, self->topresize, - ob_rr_theme->grip_width + self->bwidth, + ob_rr_theme->grip_width, 0, self->width - ob_rr_theme->grip_width *2, ob_rr_theme->paddingy + 1); - XMoveWindow(ob_display, self->tltresize, self->bwidth, 0); - XMoveWindow(ob_display, self->tllresize, self->bwidth, 0); + XMoveWindow(ob_display, self->tltresize, 0, 0); + XMoveWindow(ob_display, self->tllresize, 0, 0); XMoveWindow(ob_display, self->trtresize, - self->bwidth + self->width - - ob_rr_theme->grip_width, 0); + self->width - ob_rr_theme->grip_width, 0); XMoveWindow(ob_display, self->trrresize, - self->bwidth + self->width - - ob_rr_theme->paddingx - 1, 0); + self->width - ob_rr_theme->paddingx - 1, 0); XMapWindow(ob_display, self->topresize); XMapWindow(ob_display, self->tltresize); @@ -696,7 +699,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; @@ -745,22 +748,31 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR)) XResizeWindow(ob_display, self->label, self->label_width, ob_rr_theme->label_height); + } static void frame_adjust_cursors(ObFrame *self) { if ((self->functions & OB_CLIENT_FUNC_RESIZE) != (self->client->functions & OB_CLIENT_FUNC_RESIZE) || - ((self->max_horz && self->max_vert) != - (self->client->max_horz && self->client->max_vert))) + self->max_horz != self->client->max_horz || + self->max_vert != self->client->max_vert) { gboolean r = (self->client->functions & OB_CLIENT_FUNC_RESIZE) && !(self->client->max_horz && self->client->max_vert); + gboolean topbot = !self->client->max_vert; XSetWindowAttributes a; - a.cursor = ob_cursor(r ? OB_CURSOR_NORTH : OB_CURSOR_NONE); + /* these ones turn off when max vert */ + a.cursor = ob_cursor(r && topbot ? OB_CURSOR_NORTH : OB_CURSOR_NONE); XChangeWindowAttributes(ob_display, self->topresize, CWCursor, &a); XChangeWindowAttributes(ob_display, self->titletop, CWCursor, &a); + a.cursor = ob_cursor(r && topbot ? OB_CURSOR_SOUTH : OB_CURSOR_NONE); + XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a); + XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a); + XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a); + + /* these ones don't */ a.cursor = ob_cursor(r ? OB_CURSOR_NORTHWEST : OB_CURSOR_NONE); XChangeWindowAttributes(ob_display, self->tltresize, CWCursor, &a); XChangeWindowAttributes(ob_display, self->tllresize, CWCursor, &a); @@ -775,10 +787,6 @@ static void frame_adjust_cursors(ObFrame *self) XChangeWindowAttributes(ob_display, self->left, CWCursor, &a); a.cursor = ob_cursor(r ? OB_CURSOR_EAST : OB_CURSOR_NONE); XChangeWindowAttributes(ob_display, self->right, CWCursor, &a); - a.cursor = ob_cursor(r ? OB_CURSOR_SOUTH : OB_CURSOR_NONE); - XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a); - XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a); - XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a); a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHWEST : OB_CURSOR_NONE); XChangeWindowAttributes(ob_display, self->lgrip, CWCursor, &a); XChangeWindowAttributes(ob_display, self->handleleft, CWCursor, &a); @@ -1257,6 +1265,10 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) context */ return OB_FRAME_CONTEXT_TITLEBAR; } + else if (self->max_vert && + (win == self->titletop || win == self->topresize)) + /* can't resize vertically when max vert */ + return OB_FRAME_CONTEXT_TITLEBAR; if (win == self->window) return OB_FRAME_CONTEXT_FRAME; if (win == self->label) return OB_FRAME_CONTEXT_TITLEBAR; @@ -1309,17 +1321,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 +1350,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,15 +1381,18 @@ 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: + /* the client's position won't move */ *x += self->size.left; break; } @@ -1386,15 +1407,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; }