X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=f788255cd4665694cc54375ee9a076ddb11261d3;hb=a76ac8205cbfe484a5fee7749daa20ed2b7e8a2b;hp=16910265c93881797bd862f873360332f0fe6a1e;hpb=b52671486187871068457d28caf21ce6bea96ccc;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 16910265..f788255c 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -251,7 +251,6 @@ 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); } } @@ -262,10 +261,6 @@ 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); @@ -358,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, @@ -376,6 +376,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, 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 */ @@ -393,27 +400,29 @@ void frame_adjust_area(ObFrame *self, gboolean moved, 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) @@ -446,19 +455,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); @@ -750,6 +757,7 @@ 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) @@ -834,6 +842,11 @@ void frame_adjust_icon(ObFrame *self) 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); @@ -852,9 +865,6 @@ void frame_grab_client(ObFrame *self) 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);