X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=a47c2f06a9f1e2d46dcfbfa7b9c3b8b99b8f30af;hb=3ae58f457bcdfa90b26dad4c9d192f045874ddae;hp=6ca718c8e3f5a297d2f0d1ffe3aa153ba2108214;hpb=25f215444b3c8e7b186b9c3892a9a4f659e79998;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 6ca718c8..a47c2f06 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -22,6 +22,7 @@ #include "openbox.h" #include "extensions.h" #include "prop.h" +#include "grab.h" #include "config.h" #include "framerender.h" #include "mainloop.h" @@ -59,7 +60,7 @@ static Window createWindow(Window parent, Visual *visual, (visual ? 32 : RrDepth(ob_rr_inst)), InputOutput, (visual ? visual : RrVisual(ob_rr_inst)), mask, attrib); - + } static Visual *check_32bit_client(ObClient *c) @@ -124,6 +125,16 @@ ObFrame *frame_new(ObClient *client) mask |= CWEventMask; attrib.event_mask = ELEMENT_EVENTMASK; + self->innerleft = createWindow(self->window, NULL, mask, &attrib); + self->innertop = createWindow(self->window, NULL, mask, &attrib); + self->innerright = createWindow(self->window, NULL, mask, &attrib); + self->innerbottom = createWindow(self->window, NULL, mask, &attrib); + + self->innerblb = createWindow(self->innerbottom, NULL, mask, &attrib); + self->innerbrb = createWindow(self->innerbottom, NULL, mask, &attrib); + self->innerbll = createWindow(self->innerleft, NULL, mask, &attrib); + self->innerbrr = createWindow(self->innerright, NULL, mask, &attrib); + self->title = createWindow(self->window, NULL, mask, &attrib); self->titleleft = createWindow(self->window, NULL, mask, &attrib); self->titletop = createWindow(self->window, NULL, mask, &attrib); @@ -141,11 +152,6 @@ ObFrame *frame_new(ObClient *client) self->left = createWindow(self->window, NULL, mask, &attrib); self->right = createWindow(self->window, NULL, mask, &attrib); - self->innerleft = createWindow(self->window, NULL, mask, &attrib); - self->innertop = createWindow(self->window, NULL, mask, &attrib); - self->innerright = createWindow(self->window, NULL, mask, &attrib); - self->innerbottom = createWindow(self->window, NULL, mask, &attrib); - self->label = createWindow(self->title, NULL, mask, &attrib); self->max = createWindow(self->title, NULL, mask, &attrib); self->close = createWindow(self->title, NULL, mask, &attrib); @@ -156,7 +162,7 @@ ObFrame *frame_new(ObClient *client) self->handle = createWindow(self->window, NULL, mask, &attrib); self->lgrip = createWindow(self->handle, NULL, mask, &attrib); - self->rgrip = createWindow(self->handle, NULL, mask, &attrib); + self->rgrip = createWindow(self->handle, NULL, mask, &attrib); self->handleleft = createWindow(self->handle, NULL, mask, &attrib); self->handleright = createWindow(self->handle, NULL, mask, &attrib); @@ -177,9 +183,9 @@ ObFrame *frame_new(ObClient *client) XMapWindow(ob_display, self->backback); XMapWindow(ob_display, self->backfront); - self->max_press = self->close_press = self->desk_press = + self->max_press = self->close_press = self->desk_press = self->iconify_press = self->shade_press = FALSE; - self->max_hover = self->close_hover = self->desk_hover = + self->max_hover = self->close_hover = self->desk_hover = self->iconify_hover = self->shade_hover = FALSE; set_theme_statics(self); @@ -224,7 +230,7 @@ static void set_theme_statics(ObFrame *self) static void free_theme_statics(ObFrame *self) { - RrAppearanceFree(self->a_unfocused_title); + RrAppearanceFree(self->a_unfocused_title); RrAppearanceFree(self->a_focused_title); RrAppearanceFree(self->a_unfocused_label); RrAppearanceFree(self->a_focused_label); @@ -248,8 +254,14 @@ void frame_show(ObFrame *self) { if (!self->visible) { self->visible = TRUE; + framerender_frame(self); + /* Grab the server to make sure that the frame window is mapped before + the client gets its MapNotify, i.e. to make sure the client is + _visible_ when it gets MapNotify. */ + grab_server(TRUE); XMapWindow(ob_display, self->client->window); XMapWindow(ob_display, self->window); + grab_server(FALSE); } } @@ -334,19 +346,24 @@ 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; + 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->bwidth = self->cbwidth_l = self->cbwidth_t = + } else + self->cbwidth_l = self->cbwidth_t = self->cbwidth_r = self->cbwidth_b = 0; - } if (self->max_horz) { self->cbwidth_l = self->cbwidth_r = 0; - self->width = self->client->area.width - self->bwidth * 2; + self->width = self->client->area.width; if (self->max_vert) self->cbwidth_b = 0; } else @@ -360,21 +377,27 @@ void frame_adjust_area(ObFrame *self, gboolean moved, STRUT_SET(self->size, self->cbwidth_l + (!self->max_horz ? self->bwidth : 0), - self->cbwidth_t + self->bwidth, + self->cbwidth_t + + (!self->max_horz || !self->max_vert || + !self->client->undecorated ? self->bwidth : 0), self->cbwidth_r + (!self->max_horz ? self->bwidth : 0), - self->cbwidth_b + (!self->max_horz || !self->max_vert ? 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 + ob_rr_theme->tswidth; + self->size.top += ob_rr_theme->title_height + self->bwidth; if (self->decorations & OB_FRAME_DECOR_HANDLE && ob_rr_theme->handle_height > 0) { self->size.bottom += ob_rr_theme->handle_height + self->bwidth; } - + /* position/size and map/unmap all the windows */ if (!fake) { + gint innercornerheight = + ob_rr_theme->grip_width - self->size.bottom; + if (self->cbwidth_l) { XMoveResizeWindow(ob_display, self->innerleft, self->size.left - self->cbwidth_l, @@ -385,6 +408,19 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } else XUnmapWindow(ob_display, self->innerleft); + if (self->cbwidth_l && innercornerheight > 0) { + XMoveResizeWindow(ob_display, self->innerbll, + 0, + self->client->area.height - + (ob_rr_theme->grip_width - + self->size.bottom), + self->cbwidth_l, + ob_rr_theme->grip_width - self->size.bottom); + + XMapWindow(ob_display, self->innerbll); + } else + XUnmapWindow(ob_display, self->innerbll); + if (self->cbwidth_r) { XMoveResizeWindow(ob_display, self->innerright, self->size.left + self->client->area.width, @@ -395,6 +431,19 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } else XUnmapWindow(ob_display, self->innerright); + if (self->cbwidth_r && innercornerheight > 0) { + XMoveResizeWindow(ob_display, self->innerbrr, + 0, + self->client->area.height - + (ob_rr_theme->grip_width - + self->size.bottom), + self->cbwidth_r, + ob_rr_theme->grip_width - self->size.bottom); + + XMapWindow(ob_display, self->innerbrr); + } else + XUnmapWindow(ob_display, self->innerbrr); + if (self->cbwidth_t) { XMoveResizeWindow(ob_display, self->innertop, self->size.left - self->cbwidth_l, @@ -415,17 +464,32 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->cbwidth_l + self->cbwidth_r, self->cbwidth_b); + XMoveResizeWindow(ob_display, self->innerblb, + 0, 0, + ob_rr_theme->grip_width + self->bwidth, + self->cbwidth_b); + XMoveResizeWindow(ob_display, self->innerbrb, + self->client->area.width + + self->cbwidth_l + self->cbwidth_r - + (ob_rr_theme->grip_width + self->bwidth), + 0, + ob_rr_theme->grip_width + self->bwidth, + self->cbwidth_b); + XMapWindow(ob_display, self->innerbottom); - } else + XMapWindow(ob_display, self->innerblb); + XMapWindow(ob_display, self->innerbrb); + } else { XUnmapWindow(ob_display, self->innerbottom); + XUnmapWindow(ob_display, self->innerblb); + XUnmapWindow(ob_display, self->innerbrb); + } if (self->bwidth) { gint titlesides; /* height of titleleft and titleright */ - titlesides = (!self->max_horz ? - ob_rr_theme->grip_width : - self->size.top - self->bwidth); + titlesides = (!self->max_horz ? ob_rr_theme->grip_width : 0); XMoveResizeWindow(ob_display, self->titletop, ob_rr_theme->grip_width + self->bwidth, 0, @@ -468,14 +532,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 && - ob_rr_theme->tswidth) - { + if (self->decorations & OB_FRAME_DECOR_TITLEBAR) { XMoveResizeWindow(ob_display, self->titlebottom, - self->bwidth, + (self->max_horz ? 0 : self->bwidth), ob_rr_theme->title_height + self->bwidth, self->width, - ob_rr_theme->tswidth); + self->bwidth); XMapWindow(ob_display, self->titlebottom); } else @@ -492,7 +554,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (self->decorations & OB_FRAME_DECOR_TITLEBAR) { XMoveResizeWindow(ob_display, self->title, - self->bwidth, self->bwidth, + (self->max_horz ? 0 : self->bwidth), + self->bwidth, self->width, ob_rr_theme->title_height); XMapWindow(ob_display, self->title); @@ -532,49 +595,63 @@ void frame_adjust_area(ObFrame *self, gboolean moved, layout_title(self); if (!fake) { + gint sidebwidth = self->max_horz ? 0 : self->bwidth; + if (self->bwidth && self->size.bottom) { XMoveResizeWindow(ob_display, self->handlebottom, ob_rr_theme->grip_width + - self->bwidth * 2, + self->bwidth + sidebwidth, self->size.top + self->client->area.height + self->size.bottom - self->bwidth, self->width - (ob_rr_theme->grip_width + - self->bwidth) * 2, + sidebwidth) * 2, self->bwidth); - XMoveResizeWindow(ob_display, self->lgripleft, - 0, - self->size.top + self->client->area.height + - self->size.bottom - - (!self->max_horz ? - ob_rr_theme->grip_width : - self->size.bottom - self->cbwidth_b), - self->bwidth, - (!self->max_horz ? - ob_rr_theme->grip_width : - self->size.bottom - self->cbwidth_b)); - XMoveResizeWindow(ob_display, self->rgripright, - self->size.left + self->client->area.width + - self->size.right - self->bwidth, - self->size.top + self->client->area.height + - self->size.bottom - - (!self->max_horz ? - ob_rr_theme->grip_width : - self->size.bottom - self->cbwidth_b), - self->bwidth, - (!self->max_horz ? - ob_rr_theme->grip_width : - self->size.bottom - self->cbwidth_b)); + + if (sidebwidth) { + XMoveResizeWindow(ob_display, self->lgripleft, + 0, + self->size.top + + self->client->area.height + + self->size.bottom - + (!self->max_horz ? + ob_rr_theme->grip_width : + self->size.bottom - self->cbwidth_b), + self->bwidth, + (!self->max_horz ? + ob_rr_theme->grip_width : + self->size.bottom - self->cbwidth_b)); + XMoveResizeWindow(ob_display, self->rgripright, + self->size.left + + self->client->area.width + + self->size.right - self->bwidth, + self->size.top + + self->client->area.height + + self->size.bottom - + (!self->max_horz ? + ob_rr_theme->grip_width : + self->size.bottom - self->cbwidth_b), + self->bwidth, + (!self->max_horz ? + ob_rr_theme->grip_width : + self->size.bottom - self->cbwidth_b)); + + XMapWindow(ob_display, self->lgripleft); + XMapWindow(ob_display, self->rgripright); + } else { + XUnmapWindow(ob_display, self->lgripleft); + XUnmapWindow(ob_display, self->rgripright); + } XMoveResizeWindow(ob_display, self->lgripbottom, - self->bwidth, + sidebwidth, self->size.top + self->client->area.height + self->size.bottom - self->bwidth, ob_rr_theme->grip_width + self->bwidth, self->bwidth); XMoveResizeWindow(ob_display, self->rgripbottom, self->size.left + self->client->area.width + - self->size.right - self->bwidth * 2 - + self->size.right - self->bwidth - sidebwidth- ob_rr_theme->grip_width, self->size.top + self->client->area.height + self->size.bottom - self->bwidth, @@ -582,8 +659,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->bwidth); XMapWindow(ob_display, self->handlebottom); - XMapWindow(ob_display, self->lgripleft); - XMapWindow(ob_display, self->rgripright); XMapWindow(ob_display, self->lgripbottom); XMapWindow(ob_display, self->rgripbottom); @@ -592,10 +667,10 @@ void frame_adjust_area(ObFrame *self, gboolean moved, { XMoveResizeWindow(ob_display, self->handletop, ob_rr_theme->grip_width + - self->bwidth * 2, + self->bwidth + sidebwidth, FRAME_HANDLE_Y(self), self->width - (ob_rr_theme->grip_width + - self->bwidth) * 2, + sidebwidth) * 2, self->bwidth); XMapWindow(ob_display, self->handletop); @@ -614,7 +689,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, ob_rr_theme->handle_height); XMoveResizeWindow(ob_display, self->lgriptop, - self->bwidth, + sidebwidth, FRAME_HANDLE_Y(self), ob_rr_theme->grip_width + self->bwidth, @@ -622,8 +697,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XMoveResizeWindow(ob_display, self->rgriptop, self->size.left + self->client->area.width + - self->size.right - self->bwidth * 2 - - ob_rr_theme->grip_width, + self->size.right - self->bwidth - + sidebwidth - ob_rr_theme->grip_width, FRAME_HANDLE_Y(self), ob_rr_theme->grip_width + self->bwidth, @@ -666,7 +741,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, ob_rr_theme->handle_height > 0) { XMoveResizeWindow(ob_display, self->handle, - self->bwidth, + sidebwidth, FRAME_HANDLE_Y(self) + self->bwidth, self->width, ob_rr_theme->handle_height); XMapWindow(ob_display, self->handle); @@ -695,7 +770,10 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XUnmapWindow(ob_display, self->handle); } - if (self->bwidth && !self->max_horz) { + if (self->bwidth && !self->max_horz && + (self->client->area.height + self->size.top + + self->size.bottom) > ob_rr_theme->grip_width * 2) + { XMoveResizeWindow(ob_display, self->left, 0, self->bwidth + ob_rr_theme->grip_width, @@ -708,10 +786,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } else XUnmapWindow(ob_display, self->left); - if (self->bwidth && !self->max_horz) { + if (self->bwidth && !self->max_horz && + (self->client->area.height + self->size.top + + self->size.bottom) > ob_rr_theme->grip_width * 2) + { XMoveResizeWindow(ob_display, self->right, - self->client->area.width + - self->cbwidth_l + self->cbwidth_r + self->bwidth, + self->client->area.width + self->cbwidth_l + + self->cbwidth_r + self->bwidth, self->bwidth + ob_rr_theme->grip_width, self->bwidth, self->client->area.height + @@ -743,16 +824,14 @@ void frame_adjust_area(ObFrame *self, gboolean moved, frame_client_gravity. */ self->area.x = self->client->area.x; self->area.y = self->client->area.y; - frame_client_gravity(self, &self->area.x, &self->area.y, - self->client->area.width, - self->client->area.height); + frame_client_gravity(self, &self->area.x, &self->area.y); } if (!fake) { if (!frame_iconify_animating(self)) /* move and resize the top level frame. shading can change without being moved or resized. - + but don't do this during an iconify animation. it will be reflected afterwards. */ @@ -770,6 +849,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->size.left, self->size.top); if (resized) { + self->need_render = TRUE; framerender_frame(self); frame_adjust_shape(self); } @@ -802,15 +882,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); @@ -819,17 +902,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); @@ -842,12 +929,16 @@ static void frame_adjust_cursors(ObFrame *self) XChangeWindowAttributes(ob_display, self->lgripleft, CWCursor, &a); XChangeWindowAttributes(ob_display, self->lgriptop, CWCursor, &a); XChangeWindowAttributes(ob_display, self->lgripbottom, CWCursor, &a); + XChangeWindowAttributes(ob_display, self->innerbll, CWCursor, &a); + XChangeWindowAttributes(ob_display, self->innerblb, CWCursor, &a); a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHEAST : OB_CURSOR_NONE); XChangeWindowAttributes(ob_display, self->rgrip, CWCursor, &a); XChangeWindowAttributes(ob_display, self->handleright, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgripright, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgriptop, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a); + XChangeWindowAttributes(ob_display, self->innerbrr, CWCursor, &a); + XChangeWindowAttributes(ob_display, self->innerbrb, CWCursor, &a); } } @@ -861,23 +952,27 @@ void frame_adjust_client_area(ObFrame *self) void frame_adjust_state(ObFrame *self) { + self->need_render = TRUE; framerender_frame(self); } void frame_adjust_focus(ObFrame *self, gboolean hilite) { self->focused = hilite; + self->need_render = TRUE; framerender_frame(self); XFlush(ob_display); } void frame_adjust_title(ObFrame *self) { + self->need_render = TRUE; framerender_frame(self); } void frame_adjust_icon(ObFrame *self) { + self->need_render = TRUE; framerender_frame(self); } @@ -912,6 +1007,10 @@ void frame_grab_client(ObFrame *self) g_hash_table_insert(window_map, &self->innertop, self->client); g_hash_table_insert(window_map, &self->innerright, self->client); g_hash_table_insert(window_map, &self->innerbottom, self->client); + g_hash_table_insert(window_map, &self->innerblb, self->client); + g_hash_table_insert(window_map, &self->innerbll, self->client); + g_hash_table_insert(window_map, &self->innerbrb, self->client); + g_hash_table_insert(window_map, &self->innerbrr, self->client); g_hash_table_insert(window_map, &self->title, self->client); g_hash_table_insert(window_map, &self->label, self->client); g_hash_table_insert(window_map, &self->max, self->client); @@ -992,6 +1091,10 @@ void frame_release_client(ObFrame *self) g_hash_table_remove(window_map, &self->innertop); g_hash_table_remove(window_map, &self->innerright); g_hash_table_remove(window_map, &self->innerbottom); + g_hash_table_remove(window_map, &self->innerblb); + g_hash_table_remove(window_map, &self->innerbll); + g_hash_table_remove(window_map, &self->innerbrb); + g_hash_table_remove(window_map, &self->innerbrr); g_hash_table_remove(window_map, &self->title); g_hash_table_remove(window_map, &self->label); g_hash_table_remove(window_map, &self->max); @@ -1326,6 +1429,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; @@ -1339,9 +1446,9 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) if (win == self->lgripbottom) return OB_FRAME_CONTEXT_BLCORNER; if (win == self->handleright) return OB_FRAME_CONTEXT_BRCORNER; if (win == self->rgrip) return OB_FRAME_CONTEXT_BRCORNER; - if (win == self->rgripright) return OB_FRAME_CONTEXT_BLCORNER; - if (win == self->rgriptop) return OB_FRAME_CONTEXT_BLCORNER; - if (win == self->rgripbottom) return OB_FRAME_CONTEXT_BLCORNER; + if (win == self->rgripright) return OB_FRAME_CONTEXT_BRCORNER; + if (win == self->rgriptop) return OB_FRAME_CONTEXT_BRCORNER; + if (win == self->rgripbottom) return OB_FRAME_CONTEXT_BRCORNER; if (win == self->title) return OB_FRAME_CONTEXT_TITLEBAR; if (win == self->titlebottom) return OB_FRAME_CONTEXT_TITLEBAR; if (win == self->titleleft) return OB_FRAME_CONTEXT_TLCORNER; @@ -1360,6 +1467,10 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) if (win == self->innerleft) return OB_FRAME_CONTEXT_LEFT; if (win == self->innerbottom) return OB_FRAME_CONTEXT_BOTTOM; if (win == self->innerright) return OB_FRAME_CONTEXT_RIGHT; + if (win == self->innerbll) return OB_FRAME_CONTEXT_BLCORNER; + if (win == self->innerblb) return OB_FRAME_CONTEXT_BLCORNER; + if (win == self->innerbrr) return OB_FRAME_CONTEXT_BRCORNER; + if (win == self->innerbrb) return OB_FRAME_CONTEXT_BRCORNER; if (win == self->max) return OB_FRAME_CONTEXT_MAXIMIZE; if (win == self->iconify) return OB_FRAME_CONTEXT_ICONIFY; if (win == self->close) return OB_FRAME_CONTEXT_CLOSE; @@ -1370,7 +1481,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) return OB_FRAME_CONTEXT_NONE; } -void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) +void frame_client_gravity(ObFrame *self, gint *x, gint *y) { /* horizontal */ switch (self->client->gravity) { @@ -1433,7 +1544,7 @@ void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) } } -void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h) +void frame_frame_gravity(ObFrame *self, gint *x, gint *y) { /* horizontal */ switch (self->client->gravity) { @@ -1490,6 +1601,20 @@ 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); +} + +void frame_rect_to_client(ObFrame *self, Rect *r) +{ + r->width -= self->size.left + self->size.right; + r->height -= self->size.top + self->size.bottom; + frame_frame_gravity(self, &r->x, &r->y); +} + static void flash_done(gpointer data) { ObFrame *self = data; @@ -1534,7 +1659,7 @@ void frame_flash_start(ObFrame *self) flash_done); g_get_current_time(&self->flash_end); g_time_val_add(&self->flash_end, G_USEC_PER_SEC * 5); - + self->flashing = TRUE; } @@ -1568,10 +1693,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; @@ -1583,7 +1710,7 @@ static gboolean frame_animate_iconify(gpointer p) /* how far do we have left to go ? */ g_get_current_time(&now); time = frame_animate_iconify_time_left(self, &now); - + if (time == 0 || iconifying) { /* start where the frame is supposed to be */ x = self->area.x; @@ -1632,10 +1759,14 @@ 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); + KDE's pager showing the window in the wrong place. since the + window is mapped at a different location and is then moved, we + need to send the synthetic configurenotify, since apps may have + read the position when the client mapped, apparently. */ + client_reconfigure(self->client, TRUE); + } /* we're not animating any more ! */ self->iconify_animation_going = 0; @@ -1643,6 +1774,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); }