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)
if (!self->visible) {
self->visible = TRUE;
XMapWindow(ob_display, self->client->window);
+ XMapWindow(ob_display, self->plate);
XMapWindow(ob_display, self->window);
}
}
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);
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;
}
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;
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,
XMoveResizeWindow(ob_display, self->topresize,
ob_rr_theme->grip_width + self->bwidth,
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);
- XMoveWindow(ob_display, self->tllresize, 0, 0);
+ XMoveWindow(ob_display, self->tltresize, self->bwidth, 0);
+ XMoveWindow(ob_display, self->tllresize, self->bwidth, 0);
XMoveWindow(ob_display, self->trtresize,
- self->width - ob_rr_theme->grip_width, 0);
+ self->bwidth + self->width -
+ ob_rr_theme->grip_width, 0);
XMoveWindow(ob_display, self->trrresize,
- self->width - ob_rr_theme->paddingx - 1, 0);
+ self->bwidth + self->width -
+ ob_rr_theme->paddingx - 1, 0);
XMapWindow(ob_display, self->topresize);
XMapWindow(ob_display, self->tltresize);
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;
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);
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);
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;
}
}
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))
{
/* 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);
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;
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;
}
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;
}
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;
}
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;
}