/* 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;
+ (ob_rr_theme->grip_width + self->bwidth) * 2 + 1);
STRUT_SET(self->size,
self->cbwidth_x + (!self->max_horz ? self->bwidth : 0),
if (!fake) {
if (self->bwidth) {
+ gint titlesides;
+
+ /* height of titleleft and titleright */
+ titlesides = (!self->max_horz ?
+ ob_rr_theme->grip_width :
+ self->size.top - self->bwidth);
+
XMoveResizeWindow(ob_display, self->titletop,
ob_rr_theme->grip_width + self->bwidth, 0,
/* width + bwidth*2 - bwidth*2 - grips*2 */
ob_rr_theme->grip_width + self->bwidth,
self->bwidth);
- XMoveResizeWindow(ob_display, self->titleleft,
- 0, self->bwidth,
- self->bwidth,
- (!self->max_horz ?
- ob_rr_theme->grip_width :
- self->size.top - self->bwidth));
- XMoveResizeWindow(ob_display, self->titleright,
- self->client->area.width +
- self->size.left + self->size.right -
- self->bwidth,
- self->bwidth,
- self->bwidth,
- (!self->max_horz ?
- ob_rr_theme->grip_width :
- self->size.top - self->bwidth));
+ if (titlesides > 0) {
+ XMoveResizeWindow(ob_display, self->titleleft,
+ 0, self->bwidth,
+ self->bwidth,
+ titlesides);
+ XMoveResizeWindow(ob_display, self->titleright,
+ self->client->area.width +
+ self->size.left + self->size.right -
+ self->bwidth,
+ self->bwidth,
+ self->bwidth,
+ titlesides);
+
+ XMapWindow(ob_display, self->titleleft);
+ XMapWindow(ob_display, self->titleright);
+ } else {
+ XUnmapWindow(ob_display, self->titleleft);
+ XUnmapWindow(ob_display, self->titleright);
+ }
XMapWindow(ob_display, self->titletop);
XMapWindow(ob_display, self->titletopleft);
XMapWindow(ob_display, self->titletopright);
- XMapWindow(ob_display, self->titleleft);
- XMapWindow(ob_display, self->titleright);
if (self->decorations & OB_FRAME_DECOR_TITLEBAR &&
self->rbwidth)
self->cbwidth_y);
/* when the client has StaticGravity, it likes to move around. */
- XMoveWindow(ob_display, self->client->window, 0, 0);
+ XMoveWindow(ob_display, self->client->window,
+ -self->client->border_width,
+ -self->client->border_width);
}
}
void frame_grab_client(ObFrame *self)
{
+ /* DO NOT map the client window here. we used to do that, but it is bogus.
+ we need to set up the client's dimensions and everything before we
+ send a mapnotify or we create race conditions.
+ */
+
/* reparent the client to the frame */
- XReparentWindow(ob_display, self->client->window, self->plate, 0, 0);
+ XReparentWindow(ob_display, self->client->window, self->plate,
+ -self->client->border_width, -self->client->border_width);
/*
When reparenting the client window, it is usually not mapped yet, since
this occurs from a MapRequest. However, in the case where Openbox is
- starting up, the window is already mapped, so we'll see unmap events for
- it. There are 2 unmap events generated that we see, one with the 'event'
- member set the root window, and one set to the client, but both get
- handled and need to be ignored.
+ starting up, the window is already mapped, so we'll see an unmap event
+ for it.
*/
if (ob_state() == OB_STATE_STARTING)
- self->client->ignore_unmaps += 2;
+ ++self->client->ignore_unmaps;
/* select the event mask on the client's parent (to receive config/map
req's) the ButtonPress is to catch clicks on the client border */
XSelectInput(ob_display, self->plate, PLATE_EVENTMASK);
- /* map the client so it maps when the frame does */
- XMapWindow(ob_display, self->client->window);
-
/* set all the windows for the frame in the window_map */
g_hash_table_insert(window_map, &self->window, self->client);
g_hash_table_insert(window_map, &self->plate, self->client);
case SouthEastGravity:
case EastGravity:
/* the right side of the client will be the right side of the frame */
- *x -= self->size.right + self->size.left;
+ *x -= self->size.right + self->size.left -
+ self->client->border_width * 2;
break;
case ForgetGravity:
case StaticGravity:
/* the client's position won't move */
- *x -= self->size.left;
+ *x -= self->size.left - self->client->border_width;
break;
}
case SouthEastGravity:
case SouthGravity:
/* the bottom of the client will be the bottom of the frame */
- *y -= self->size.bottom + self->size.top;
+ *y -= self->size.bottom + self->size.top -
+ self->client->border_width * 2;
break;
case ForgetGravity:
case StaticGravity:
/* the client's position won't move */
- *y -= self->size.top;
+ *y -= self->size.top - self->client->border_width;
break;
}
}
case EastGravity:
case SouthEastGravity:
/* the right side of the client will be the right side of the frame */
- *x += self->size.right + self->size.left;
+ *x += self->size.right + self->size.left -
+ self->client->border_width * 2;
break;
case StaticGravity:
case ForgetGravity:
/* the client's position won't move */
- *x += self->size.left;
+ *x += self->size.left - self->client->border_width;
break;
}
case SouthGravity:
case SouthEastGravity:
/* the bottom of the client will be the bottom of the frame */
- *y += self->size.bottom + self->size.top;
+ *y += self->size.bottom + self->size.top -
+ self->client->border_width * 2;
break;
case StaticGravity:
case ForgetGravity:
/* the client's position won't move */
- *y += self->size.top;
+ *y += self->size.top - self->client->border_width;
break;
}
}