X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=7d7ac901680de3e6d61d42655ee209ee6859c04c;hb=383f1ee85fbe6c7317781db2b05018e7932b9eab;hp=aef445aec46012261a998356b5bca777311bcfad;hpb=ac72dafab4e3223fb522c0c17fd80f950d91a0c9;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index aef445ae..7d7ac901 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); @@ -297,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; } @@ -335,21 +334,29 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->decorations = self->client->decorations; self->max_horz = self->client->max_horz; self->max_vert = self->client->max_vert; + self->shaded = self->client->shaded; - if (self->decorations & OB_FRAME_DECOR_BORDER) { + if (self->decorations & OB_FRAME_DECOR_BORDER || + (self->client->undecorated && config_theme_keepborder)) self->bwidth = ob_rr_theme->fbwidth; - self->cbwidth_x = ob_rr_theme->cbwidthx; - self->cbwidth_y = ob_rr_theme->cbwidthy; - } else { - self->bwidth = self->cbwidth_x = self->cbwidth_y = 0; - } - self->rbwidth = self->bwidth; + else + self->bwidth = 0; + + if (self->decorations & OB_FRAME_DECOR_BORDER) { + self->cbwidth_l = self->cbwidth_r = ob_rr_theme->cbwidthx; + self->cbwidth_t = self->cbwidth_b = ob_rr_theme->cbwidthy; + } else + self->cbwidth_l = self->cbwidth_t = + self->cbwidth_r = self->cbwidth_b = 0; 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 */ @@ -357,13 +364,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 + self->bwidth; if (self->decorations & OB_FRAME_DECOR_HANDLE && ob_rr_theme->handle_height > 0) { @@ -373,41 +380,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; @@ -458,14 +473,12 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XMapWindow(ob_display, self->titletopleft); XMapWindow(ob_display, self->titletopright); - if (self->decorations & OB_FRAME_DECOR_TITLEBAR && - self->rbwidth) - { + if (self->decorations & OB_FRAME_DECOR_TITLEBAR) { XMoveResizeWindow(ob_display, self->titlebottom, self->bwidth, ob_rr_theme->title_height + self->bwidth, self->width, - self->rbwidth); + self->bwidth); XMapWindow(ob_display, self->titlebottom); } else @@ -522,7 +535,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, @@ -538,11 +551,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, @@ -550,11 +563,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, @@ -701,7 +714,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 + @@ -729,10 +742,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->size.top + self->size.bottom)); if ((moved || resized) && !fake) { - /* when the client has StaticGravity, it likes to move around. */ - XMoveWindow(ob_display, self->client->window, - self->size.left, self->size.top); - /* find the new coordinates, done after setting the frame.size, for frame_client_gravity. */ self->area.x = self->client->area.x; @@ -756,6 +765,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); @@ -789,15 +805,18 @@ 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) + self->max_vert != self->client->max_vert || + self->shaded != self->client->shaded) { gboolean r = (self->client->functions & OB_CLIENT_FUNC_RESIZE) && !(self->client->max_horz && self->client->max_vert); gboolean topbot = !self->client->max_vert; + gboolean sh = self->client->shaded; XSetWindowAttributes a; - /* these ones turn off when max vert */ - a.cursor = ob_cursor(r && topbot ? OB_CURSOR_NORTH : OB_CURSOR_NONE); + /* these ones turn off when max vert, and some when shaded */ + a.cursor = ob_cursor(r && topbot && !sh ? + 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); @@ -806,17 +825,21 @@ static void frame_adjust_cursors(ObFrame *self) XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a); XChangeWindowAttributes(ob_display, self->innerbottom, CWCursor, &a); - /* these ones don't */ - a.cursor = ob_cursor(r ? OB_CURSOR_NORTHWEST : OB_CURSOR_NONE); + /* these ones change when shaded */ + a.cursor = ob_cursor(r ? (sh ? OB_CURSOR_WEST : OB_CURSOR_NORTHWEST) : + OB_CURSOR_NONE); + XChangeWindowAttributes(ob_display, self->titleleft, CWCursor, &a); XChangeWindowAttributes(ob_display, self->tltresize, CWCursor, &a); XChangeWindowAttributes(ob_display, self->tllresize, CWCursor, &a); XChangeWindowAttributes(ob_display, self->titletopleft, CWCursor, &a); - XChangeWindowAttributes(ob_display, self->titleleft, CWCursor, &a); - a.cursor = ob_cursor(r ? OB_CURSOR_NORTHEAST : OB_CURSOR_NONE); + a.cursor = ob_cursor(r ? (sh ? OB_CURSOR_EAST : OB_CURSOR_NORTHEAST) : + OB_CURSOR_NONE); + XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a); XChangeWindowAttributes(ob_display, self->trtresize, CWCursor, &a); XChangeWindowAttributes(ob_display, self->trrresize, CWCursor, &a); XChangeWindowAttributes(ob_display, self->titletopright, CWCursor, &a); - XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a); + + /* these ones are pretty static */ a.cursor = ob_cursor(r ? OB_CURSOR_WEST : OB_CURSOR_NONE); XChangeWindowAttributes(ob_display, self->left, CWCursor, &a); XChangeWindowAttributes(ob_display, self->innerleft, CWCursor, &a); @@ -1313,6 +1336,10 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) (win == self->titletop || win == self->topresize)) /* can't resize vertically when max vert */ return OB_FRAME_CONTEXT_TITLEBAR; + else if (self->shaded && + (win == self->titletop || win == self->topresize)) + /* can't resize vertically when shaded */ + return OB_FRAME_CONTEXT_TITLEBAR; if (win == self->window) return OB_FRAME_CONTEXT_FRAME; if (win == self->label) return OB_FRAME_CONTEXT_TITLEBAR; @@ -1477,6 +1504,13 @@ void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) } } +void frame_rect_to_frame(ObFrame *self, Rect *r) +{ + r->width += self->size.left + self->size.right; + r->height += self->size.top + self->size.bottom; + frame_client_gravity(self, &r->x, &r->y, r->width, r->height); +} + static void flash_done(gpointer data) { ObFrame *self = data; @@ -1555,10 +1589,12 @@ static gboolean frame_animate_iconify(gpointer p) if (self->client->icon_geometry.width == 0) { /* there is no icon geometry set so just go straight down */ - Rect *a = screen_physical_area(); + Rect *a = screen_physical_area_monitor + (screen_find_monitor(&self->area)); iconx = self->area.x + self->area.width / 2 + 32; icony = a->y + a->width; iconw = 64; + g_free(a); } else { iconx = self->client->icon_geometry.x; icony = self->client->icon_geometry.y; @@ -1619,10 +1655,11 @@ void frame_end_iconify_animation(ObFrame *self) if (!self->visible) XUnmapWindow(ob_display, self->window); - else + else { /* Send a ConfigureNotify when the animation is done, this fixes KDE's pager showing the window in the wrong place. */ client_reconfigure(self->client); + } /* we're not animating any more ! */ self->iconify_animation_going = 0; @@ -1630,6 +1667,8 @@ void frame_end_iconify_animation(ObFrame *self) XMoveResizeWindow(ob_display, self->window, self->area.x, self->area.y, self->area.width, self->area.height); + /* we delay re-rendering until after we're done animating */ + framerender_frame(self); XFlush(ob_display); }