X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=6ca718c8e3f5a297d2f0d1ffe3aa153ba2108214;hb=25f215444b3c8e7b186b9c3892a9a4f659e79998;hp=687ecbbe78ba8672d26c64b09403b35ca5338e97;hpb=2aa0a6b01ba718217e2b10107abbcd4236ba5a8f;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 687ecbbe..6ca718c8 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -41,7 +41,7 @@ #define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */ #define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 60) /* 60 Hz */ -#define FRAME_HANDLE_Y(f) (f->size.top + f->client->area.height + f->cbwidth_y) +#define FRAME_HANDLE_Y(f) (f->size.top + f->client->area.height + f->cbwidth_b) static void flash_done(gpointer data); static gboolean flash_timeout(gpointer data); @@ -112,12 +112,17 @@ ObFrame *frame_new(ObClient *client) /* create the visible decor windows */ - mask = CWEventMask; + mask = 0; if (visual) { /* client has a 32-bit visual */ mask |= CWColormap | CWBackPixel | CWBorderPixel; attrib.colormap = RrColormap(ob_rr_inst); } + + self->backback = createWindow(self->window, NULL, mask, &attrib); + self->backfront = createWindow(self->backback, NULL, mask, &attrib); + + mask |= CWEventMask; attrib.event_mask = ELEMENT_EVENTMASK; self->title = createWindow(self->window, NULL, mask, &attrib); self->titleleft = createWindow(self->window, NULL, mask, &attrib); @@ -169,6 +174,8 @@ ObFrame *frame_new(ObClient *client) /* the other stuff is shown based on decor settings */ XMapWindow(ob_display, self->label); + XMapWindow(ob_display, self->backback); + XMapWindow(ob_display, self->backfront); self->max_press = self->close_press = self->desk_press = self->iconify_press = self->shade_press = FALSE; @@ -290,8 +297,7 @@ void frame_adjust_shape(ObFrame *self) xrect[0].x = 0; xrect[0].y = 0; xrect[0].width = self->area.width; - xrect[0].height = ob_rr_theme->title_height + - self->bwidth + self->rbwidth; + xrect[0].height = self->size.top; ++num; } @@ -331,18 +337,21 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (self->decorations & OB_FRAME_DECOR_BORDER) { self->bwidth = ob_rr_theme->fbwidth; - self->cbwidth_x = ob_rr_theme->cbwidthx; - self->cbwidth_y = ob_rr_theme->cbwidthy; + self->cbwidth_l = self->cbwidth_r = ob_rr_theme->cbwidthx; + self->cbwidth_t = self->cbwidth_b = ob_rr_theme->cbwidthy; } else { - self->bwidth = self->cbwidth_x = self->cbwidth_y = 0; + self->bwidth = self->cbwidth_l = self->cbwidth_t = + self->cbwidth_r = self->cbwidth_b = 0; } - self->rbwidth = self->bwidth; if (self->max_horz) { - self->cbwidth_x = 0; + self->cbwidth_l = self->cbwidth_r = 0; self->width = self->client->area.width - self->bwidth * 2; + if (self->max_vert) + self->cbwidth_b = 0; } else - self->width = self->client->area.width + self->cbwidth_x * 2; + self->width = self->client->area.width + + self->cbwidth_l + self->cbwidth_r; /* some elements are sized based of the width, so don't let them have negative values */ @@ -350,13 +359,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, (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, - self->cbwidth_x + (!self->max_horz ? self->bwidth : 0), - self->cbwidth_y + self->bwidth); + self->cbwidth_l + (!self->max_horz ? self->bwidth : 0), + self->cbwidth_t + self->bwidth, + self->cbwidth_r + (!self->max_horz ? self->bwidth : 0), + self->cbwidth_b + (!self->max_horz || !self->max_vert ? self->bwidth : 0)); if (self->decorations & OB_FRAME_DECOR_TITLEBAR) - self->size.top += ob_rr_theme->title_height + self->rbwidth; + self->size.top += ob_rr_theme->title_height + ob_rr_theme->tswidth; if (self->decorations & OB_FRAME_DECOR_HANDLE && ob_rr_theme->handle_height > 0) { @@ -366,41 +375,49 @@ void frame_adjust_area(ObFrame *self, gboolean moved, /* position/size and map/unmap all the windows */ if (!fake) { - if (self->cbwidth_x) { + if (self->cbwidth_l) { XMoveResizeWindow(ob_display, self->innerleft, - self->size.left - self->cbwidth_x, + self->size.left - self->cbwidth_l, self->size.top, - self->cbwidth_x, self->client->area.height); + self->cbwidth_l, self->client->area.height); + + XMapWindow(ob_display, self->innerleft); + } else + XUnmapWindow(ob_display, self->innerleft); + + if (self->cbwidth_r) { XMoveResizeWindow(ob_display, self->innerright, self->size.left + self->client->area.width, self->size.top, - self->cbwidth_x, self->client->area.height); + self->cbwidth_r, self->client->area.height); - XMapWindow(ob_display, self->innerleft); XMapWindow(ob_display, self->innerright); - } else { - XUnmapWindow(ob_display, self->innerleft); + } else XUnmapWindow(ob_display, self->innerright); - } - if (self->cbwidth_y) { + if (self->cbwidth_t) { XMoveResizeWindow(ob_display, self->innertop, - self->size.left - self->cbwidth_x, - self->size.top - self->cbwidth_y, + self->size.left - self->cbwidth_l, + self->size.top - self->cbwidth_t, self->client->area.width + - self->cbwidth_x * 2, self->cbwidth_y); + self->cbwidth_l + self->cbwidth_r, + self->cbwidth_t); + + XMapWindow(ob_display, self->innertop); + } else + XUnmapWindow(ob_display, self->innertop); + + if (self->cbwidth_b) { XMoveResizeWindow(ob_display, self->innerbottom, - self->size.left - self->cbwidth_x, + self->size.left - self->cbwidth_l, self->size.top + self->client->area.height, self->client->area.width + - self->cbwidth_x * 2, self->cbwidth_y); + self->cbwidth_l + self->cbwidth_r, + self->cbwidth_b); - XMapWindow(ob_display, self->innertop); XMapWindow(ob_display, self->innerbottom); - } else { - XUnmapWindow(ob_display, self->innertop); + } else XUnmapWindow(ob_display, self->innerbottom); - } if (self->bwidth) { gint titlesides; @@ -452,13 +469,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XMapWindow(ob_display, self->titletopright); if (self->decorations & OB_FRAME_DECOR_TITLEBAR && - self->rbwidth) + ob_rr_theme->tswidth) { XMoveResizeWindow(ob_display, self->titlebottom, self->bwidth, ob_rr_theme->title_height + self->bwidth, self->width, - self->rbwidth); + ob_rr_theme->tswidth); XMapWindow(ob_display, self->titlebottom); } else @@ -515,7 +532,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, layout_title(self); if (!fake) { - if (self->bwidth) { + if (self->bwidth && self->size.bottom) { XMoveResizeWindow(ob_display, self->handlebottom, ob_rr_theme->grip_width + self->bwidth * 2, @@ -531,11 +548,11 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->size.bottom - (!self->max_horz ? ob_rr_theme->grip_width : - self->size.bottom), + self->size.bottom - self->cbwidth_b), self->bwidth, (!self->max_horz ? ob_rr_theme->grip_width : - self->size.bottom)); + self->size.bottom - self->cbwidth_b)); XMoveResizeWindow(ob_display, self->rgripright, self->size.left + self->client->area.width + self->size.right - self->bwidth, @@ -543,11 +560,11 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->size.bottom - (!self->max_horz ? ob_rr_theme->grip_width : - self->size.bottom), + self->size.bottom - self->cbwidth_b), self->bwidth, (!self->max_horz ? ob_rr_theme->grip_width : - self->size.bottom)); + self->size.bottom - self->cbwidth_b)); XMoveResizeWindow(ob_display, self->lgripbottom, self->bwidth, @@ -694,7 +711,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (self->bwidth && !self->max_horz) { XMoveResizeWindow(ob_display, self->right, self->client->area.width + - self->cbwidth_x * 2 + self->bwidth, + self->cbwidth_l + self->cbwidth_r + self->bwidth, self->bwidth + ob_rr_theme->grip_width, self->bwidth, self->client->area.height + @@ -705,10 +722,10 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } else XUnmapWindow(ob_display, self->right); - /* when the client has StaticGravity, it likes to move around. */ - XMoveWindow(ob_display, self->client->window, - self->size.left - self->client->border_width, - self->size.top - self->client->border_width); + XMoveResizeWindow(ob_display, self->backback, + self->size.left, self->size.top, + self->client->area.width, + self->client->area.height); } } @@ -745,6 +762,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->area.width, self->area.height); + /* when the client has StaticGravity, it likes to move around. + also this correctly positions the client when it maps. + this also needs to be run when the frame's decorations sizes change! + */ + XMoveWindow(ob_display, self->client->window, + self->size.left, self->size.top); + if (resized) { framerender_frame(self); frame_adjust_shape(self); @@ -827,6 +851,14 @@ static void frame_adjust_cursors(ObFrame *self) } } +void frame_adjust_client_area(ObFrame *self) +{ + /* adjust the window which is there to prevent flashing on unmap */ + XMoveResizeWindow(ob_display, self->backfront, 0, 0, + self->client->area.width, + self->client->area.height); +} + void frame_adjust_state(ObFrame *self) { framerender_frame(self); @@ -874,6 +906,8 @@ void frame_grab_client(ObFrame *self) /* 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->backback, self->client); + g_hash_table_insert(window_map, &self->backfront, self->client); g_hash_table_insert(window_map, &self->innerleft, self->client); g_hash_table_insert(window_map, &self->innertop, self->client); g_hash_table_insert(window_map, &self->innerright, self->client); @@ -952,6 +986,8 @@ void frame_release_client(ObFrame *self) /* remove all the windows for the frame from the window_map */ g_hash_table_remove(window_map, &self->window); + g_hash_table_remove(window_map, &self->backback); + g_hash_table_remove(window_map, &self->backfront); g_hash_table_remove(window_map, &self->innerleft); g_hash_table_remove(window_map, &self->innertop); g_hash_table_remove(window_map, &self->innerright);