all repos — openbox @ 56b01b73a808ccf51991a0aeb5362d5eb6bbfaaa

openbox fork - make it a bit more like ryudo

have the clientpadding color show during resize, and no flashing on unmap. we win !
Dana Jansens danakj@orodu.net
commit

56b01b73a808ccf51991a0aeb5362d5eb6bbfaaa

parent

2aa0a6b01ba718217e2b10107abbcd4236ba5a8f

4 files changed, 46 insertions(+), 12 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -361,6 +361,7 @@

/* adjust the frame to the client's size before showing or placing the window */ frame_adjust_area(self->frame, FALSE, TRUE, FALSE); + frame_adjust_client_area(self->frame); /* where the frame was placed is where the window was originally */ placex = self->area.x;

@@ -2864,6 +2865,8 @@ changes.border_width = self->border_width;

XConfigureWindow(ob_display, self->window, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &changes); + + frame_adjust_client_area(self->frame); } /* find the frame's dimensions and move/resize it */

@@ -2915,17 +2918,18 @@ }

/* if the client is shrinking, then resize the frame before the client */ if (send_resize_client && (w <= oldw && h <= oldh)) { - if (send_resize_client) { - XWindowChanges changes; - changes.x = self->frame->size.left - self->border_width; - changes.y = self->frame->size.top -self->border_width; - changes.width = w; - changes.height = h; - changes.border_width = self->border_width; - XConfigureWindow(ob_display, self->window, - CWX|CWY|CWWidth|CWHeight|CWBorderWidth, - &changes); - } + XWindowChanges changes; + + frame_adjust_client_area(self->frame); + + changes.x = self->frame->size.left - self->border_width; + changes.y = self->frame->size.top -self->border_width; + changes.width = w; + changes.height = h; + changes.border_width = self->border_width; + XConfigureWindow(ob_display, self->window, + CWX|CWY|CWWidth|CWHeight|CWBorderWidth, + &changes); } XFlush(ob_display);
M openbox/frame.copenbox/frame.c

@@ -112,12 +112,17 @@ mask, &attrib);

/* 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 @@ self->focused = FALSE;

/* 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;

@@ -705,6 +712,11 @@ XMapWindow(ob_display, self->right);

} else XUnmapWindow(ob_display, self->right); + XMoveResizeWindow(ob_display, self->backback, + self->size.left, self->size.top, + self->client->area.width, + self->client->area.height); + /* when the client has StaticGravity, it likes to move around. */ XMoveWindow(ob_display, self->client->window, self->size.left - self->client->border_width,

@@ -827,6 +839,14 @@ XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a);

} } +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 +894,8 @@ XSelectInput(ob_display, self->window, FRAME_EVENTMASK);

/* 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 +974,8 @@ }

/* 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);
M openbox/frame.hopenbox/frame.h

@@ -120,6 +120,9 @@ Window innerleft; /*!< For drawing the inner client border */

Window innertop; /*!< For drawing the inner client border */ Window innerright; /*!< For drawing the inner client border */ Window innerbottom; /*!< For drawing the inner client border */ + Window backback; /*!< A colored window shown while resizing */ + Window backfront; /*!< An undrawn-in window, to prevent flashing on + unmap */ /* These are resize handles inside the titlebar */ Window topresize;

@@ -202,6 +205,7 @@ void frame_adjust_theme(ObFrame *self);

void frame_adjust_shape(ObFrame *self); void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized, gboolean fake); +void frame_adjust_client_area(ObFrame *self); void frame_adjust_state(ObFrame *self); void frame_adjust_focus(ObFrame *self, gboolean hilite); void frame_adjust_title(ObFrame *self);
M openbox/framerender.copenbox/framerender.c

@@ -41,6 +41,8 @@ px = (self->focused ?

RrColorPixel(ob_rr_theme->cb_focused_color) : RrColorPixel(ob_rr_theme->cb_unfocused_color)); + XSetWindowBackground(ob_display, self->backback, px); + XClearWindow(ob_display, self->backback); XSetWindowBackground(ob_display, self->innerleft, px); XClearWindow(ob_display, self->innerleft); XSetWindowBackground(ob_display, self->innertop, px);