X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fframe.c;h=0f9e581f964a28f9ec02259008084e3eb6b9ebc9;hb=bfb0c916718cd6f68ef100841a625b06602f616b;hp=a4843d6ff9f577f5407c57e1120f2cf18f07855b;hpb=4b73574406e24df84e909014926e56ab1e5c7934;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index a4843d6f..0f9e581f 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) @@ -156,7 +157,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 +178,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 +225,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); @@ -249,8 +250,13 @@ 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); } } @@ -368,7 +374,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, 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)); + 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->bwidth; @@ -377,7 +384,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, { self->size.bottom += ob_rr_theme->handle_height + self->bwidth; } - + /* position/size and map/unmap all the windows */ if (!fake) { @@ -547,7 +554,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, sidebwidth) * 2, self->bwidth); - + if (sidebwidth) { XMoveResizeWindow(ob_display, self->lgripleft, 0, @@ -710,7 +717,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, @@ -723,10 +733,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 + @@ -765,7 +778,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, 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. */ @@ -1526,6 +1539,13 @@ void frame_rect_to_frame(ObFrame *self, Rect *r) 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; @@ -1570,7 +1590,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; } @@ -1621,7 +1641,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;