X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=37e39e2eebd0bd5925472e56d23da6c4f47e6f52;hb=37aaf4c1e44c205ccbe9ddb7f7633afdcf57fa0f;hp=43b50722e5f4866a77bbed8e36fd8415d7e63a17;hpb=b8f207892a11b53365c47b4828254269fca5c8e9;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 43b50722..37e39e2e 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -55,6 +55,7 @@ static void layout_title(ObFrame *self); static void set_theme_statics(ObFrame *self); static void free_theme_statics(ObFrame *self); static gboolean frame_animate_iconify(gpointer self); +static void frame_adjust_cursors(ObFrame *self); static Window createWindow(Window parent, Visual *visual, gulong mask, XSetWindowAttributes *attrib) @@ -250,6 +251,7 @@ void frame_show(ObFrame *self) if (!self->visible) { self->visible = TRUE; XMapWindow(ob_display, self->client->window); + XMapWindow(ob_display, self->plate); XMapWindow(ob_display, self->window); } } @@ -260,6 +262,10 @@ void frame_hide(ObFrame *self) self->visible = FALSE; if (!frame_iconify_animating(self)) XUnmapWindow(ob_display, self->window); + /* unmap the plate along with the client. some people (libwnck) look + to see if it is unmapped when the client is iconified, for whatever + reason. so let's play along... */ + XUnmapWindow(ob_display, self->plate); /* we unmap the client itself so that we can get MapRequest events, and because the ICCCM tells us to! */ XUnmapWindow(ob_display, self->client->window); @@ -329,7 +335,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, oldsize = self->size; if (resized) { + /* do this before changing the frame's status like max_horz max_vert */ + frame_adjust_cursors(self); + + self->functions = self->client->functions; self->decorations = self->client->decorations; + self->max_horz = self->client->max_horz; + self->max_vert = self->client->max_vert; if (self->decorations & OB_FRAME_DECOR_BORDER) { self->bwidth = ob_rr_theme->fbwidth; @@ -340,9 +352,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } self->rbwidth = self->bwidth; - self->max_horz = self->client->max_horz; - self->max_vert = self->client->max_vert; - if (self->max_horz) { self->cbwidth_x = 0; self->width = self->client->area.width - self->bwidth * 2; @@ -370,7 +379,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XMoveResizeWindow(ob_display, self->titletop, ob_rr_theme->grip_width + self->bwidth, 0, /* width + bwidth*2 - bwidth*2 - grips*2 */ - self->width + ob_rr_theme->grip_width * 2, + self->width - ob_rr_theme->grip_width * 2, self->bwidth); XMoveResizeWindow(ob_display, self->titletopleft, 0, 0, @@ -437,10 +446,9 @@ 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 + - self->bwidth) * 2, + self->width - ob_rr_theme->grip_width *2, ob_rr_theme->paddingy + 1); XMoveWindow(ob_display, self->tltresize, 0, 0); @@ -691,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; @@ -740,19 +748,30 @@ 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); +} - /* set up cursors */ - if (!fake && - (self->functions & OB_CLIENT_FUNC_RESIZE) != - (self->client->functions & OB_CLIENT_FUNC_RESIZE)) +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->client->max_horz || + self->max_vert != self->client->max_vert) { - gboolean r = self->client->functions & OB_CLIENT_FUNC_RESIZE && - !(self->max_horz && self->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); @@ -767,10 +786,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, 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); @@ -783,8 +798,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XChangeWindowAttributes(ob_display, self->rgripright, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgriptop, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a); - - self->functions = self->client->functions; } } @@ -1201,7 +1214,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) is fully maximized, then treat it like they clicked in the button that is there */ if (self->max_horz && self->max_vert && - (win == self->title || + (win == self->title || win == self->titletop || win == self->titleleft || win == self->titletopleft || win == self->titleright || win == self->titletopright)) { @@ -1217,6 +1230,9 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) /* title is a border width in from the edge */ if (win == self->title) fx += self->bwidth; + /* titletop is a bit to the right */ + else if (win == self->titletop) + fx += ob_rr_theme->grip_width + self->bwidth; /* titletopright is way to the right edge */ else if (win == self->titletopright) fx += self->area.width - (ob_rr_theme->grip_width + self->bwidth); @@ -1243,7 +1259,15 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) return self->rightmost; } } + + /* there is no resizing maximized windows so make them the titlebar + 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; @@ -1296,17 +1320,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; } @@ -1322,17 +1349,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; } @@ -1350,15 +1380,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; } @@ -1373,15 +1406,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; }