all repos — openbox @ 436c85576e99f4df81273f8b510a94605e676cab

openbox fork - make it a bit more like ryudo

only perform the actions necessary when performing an engine_adjust_area. pass whether the client has moved or resized
Dana Jansens danakj@orodu.net
commit

436c85576e99f4df81273f8b510a94605e676cab

parent

2bdc37e9200bef650867d7b9b2a251327b922629

4 files changed, 101 insertions(+), 86 deletions(-)

jump to
M engines/engineinterface.hengines/engineinterface.h

@@ -20,7 +20,8 @@ typedef void EngineFrameReleaseClient(Frame *self, Client *client);

/* frame_adjust_area */ /*! Update the frame's size/position to match the client */ -typedef void EngineFrameAdjustArea(Frame *self); +typedef void EngineFrameAdjustArea(Frame *self, gboolean moved, + gboolean resized); /* frame_adjust_shape */ /*! Shape the frame window to the client window */ typedef void EngineFrameAdjustShape(Frame *self);
M engines/openbox/openbox.cengines/openbox/openbox.c

@@ -406,75 +406,81 @@ }

#endif } -void frame_adjust_area(ObFrame *self) +void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized) { - if (self->frame.client->decorations & Decor_Border) { - self->bwidth = s_bwidth; - self->cbwidth = s_cbwidth; - } else { - self->bwidth = self->cbwidth = 0; - } - STRUT_SET(self->innersize, self->cbwidth, self->cbwidth, - self->cbwidth, self->cbwidth); - self->width = self->frame.client->area.width + self->cbwidth * 2; - g_assert(self->width > 0); + if (resized) { + if (self->frame.client->decorations & Decor_Border) { + self->bwidth = s_bwidth; + self->cbwidth = s_cbwidth; + } else { + self->bwidth = self->cbwidth = 0; + } + STRUT_SET(self->innersize, self->cbwidth, self->cbwidth, + self->cbwidth, self->cbwidth); + self->width = self->frame.client->area.width + self->cbwidth * 2; + g_assert(self->width > 0); - /* set border widths */ - XSetWindowBorderWidth(ob_display, self->frame.plate, self->cbwidth); - XSetWindowBorderWidth(ob_display, self->frame.window, self->bwidth); - XSetWindowBorderWidth(ob_display, self->title, self->bwidth); - XSetWindowBorderWidth(ob_display, self->handle, self->bwidth); - XSetWindowBorderWidth(ob_display, self->lgrip, self->bwidth); - XSetWindowBorderWidth(ob_display, self->rgrip, self->bwidth); + /* set border widths */ + XSetWindowBorderWidth(ob_display, self->frame.plate, self->cbwidth); + XSetWindowBorderWidth(ob_display, self->frame.window, self->bwidth); + XSetWindowBorderWidth(ob_display, self->title, self->bwidth); + XSetWindowBorderWidth(ob_display, self->handle, self->bwidth); + XSetWindowBorderWidth(ob_display, self->lgrip, self->bwidth); + XSetWindowBorderWidth(ob_display, self->rgrip, self->bwidth); - /* position/size and map/unmap all the windows */ + /* position/size and map/unmap all the windows */ - /* they all default off, they're turned on in layout_title */ - self->icon_x = -1; - self->desk_x = -1; - self->icon_x = -1; - self->label_x = -1; - self->max_x = -1; - self->close_x = -1; - - if (self->frame.client->decorations & Decor_Titlebar) { - XMoveResizeWindow(ob_display, self->title, - -self->bwidth, -self->bwidth, - self->width, TITLE_HEIGHT); - self->innersize.top += TITLE_HEIGHT + self->bwidth; - XMapWindow(ob_display, self->title); + /* they all default off, they're turned on in layout_title */ + self->icon_x = -1; + self->desk_x = -1; + self->icon_x = -1; + self->label_x = -1; + self->max_x = -1; + self->close_x = -1; + + if (self->frame.client->decorations & Decor_Titlebar) { + XMoveResizeWindow(ob_display, self->title, + -self->bwidth, -self->bwidth, + self->width, TITLE_HEIGHT); + self->innersize.top += TITLE_HEIGHT + self->bwidth; + XMapWindow(ob_display, self->title); + + /* layout the title bar elements */ + layout_title(self); + } else { + XUnmapWindow(ob_display, self->title); + /* make all the titlebar stuff not render */ + self->frame.client->decorations &= ~(Decor_Icon | Decor_Iconify | + Decor_Maximize | Decor_Close | + Decor_AllDesktops); + } - /* layout the title bar elements */ - layout_title(self); - } else { - XUnmapWindow(ob_display, self->title); - /* make all the titlebar stuff not render */ - self->frame.client->decorations &= ~(Decor_Icon | Decor_Iconify | - Decor_Maximize | Decor_Close | - Decor_AllDesktops); + if (self->frame.client->decorations & Decor_Handle) { + XMoveResizeWindow(ob_display, self->handle, + -self->bwidth, HANDLE_Y(self), + self->width, s_handle_height); + XMoveWindow(ob_display, self->lgrip, + -self->bwidth, -self->bwidth); + XMoveWindow(ob_display, self->rgrip, + -self->bwidth + self->width - + GRIP_WIDTH, -self->bwidth); + self->innersize.bottom += s_handle_height + + self->bwidth; + XMapWindow(ob_display, self->handle); + } else + XUnmapWindow(ob_display, self->handle); } - if (self->frame.client->decorations & Decor_Handle) { - XMoveResizeWindow(ob_display, self->handle, - -self->bwidth, HANDLE_Y(self), - self->width, s_handle_height); - XMoveWindow(ob_display, self->lgrip, - -self->bwidth, -self->bwidth); - XMoveWindow(ob_display, self->rgrip, - -self->bwidth + self->width - - GRIP_WIDTH, -self->bwidth); - self->innersize.bottom += s_handle_height + - self->bwidth; - XMapWindow(ob_display, self->handle); - } else - XUnmapWindow(ob_display, self->handle); + if (moved) { + /* find the new coordinates */ + self->frame.area.x = self->frame.client->area.x; + self->frame.area.y = self->frame.client->area.y; + frame_client_gravity((Frame*)self, + &self->frame.area.x, &self->frame.area.y); + } - /* find the new coordinates */ - self->frame.area.x = self->frame.client->area.x; - self->frame.area.y = self->frame.client->area.y; - frame_client_gravity((Frame*)self, - &self->frame.area.x, &self->frame.area.y); - /* move and resize the top level frame */ + /* move and resize the top level frame. + shading can change without being moved or resized */ XMoveResizeWindow(ob_display, self->frame.window, self->frame.area.x, self->frame.area.y, self->width,

@@ -482,30 +488,38 @@ (self->frame.client->shaded ? TITLE_HEIGHT :

self->innersize.top + self->innersize.bottom + self->frame.client->area.height)); - /* move and resize the plate */ - XMoveResizeWindow(ob_display, self->frame.plate, - self->innersize.left - self->cbwidth, - self->innersize.top - self->cbwidth, - self->frame.client->area.width, - self->frame.client->area.height); - /* when the client has StaticGravity, it likes to move around. */ - XMoveWindow(ob_display, self->frame.client->window, 0, 0); + if (resized) { + /* move and resize the plate */ + XMoveResizeWindow(ob_display, self->frame.plate, + self->innersize.left - self->cbwidth, + self->innersize.top - self->cbwidth, + self->frame.client->area.width, + self->frame.client->area.height); + /* when the client has StaticGravity, it likes to move around. */ + XMoveWindow(ob_display, self->frame.client->window, 0, 0); + } - STRUT_SET(self->frame.size, - self->innersize.left + self->bwidth, - self->innersize.top + self->bwidth, - self->innersize.right + self->bwidth, - self->innersize.bottom + self->bwidth); + if (resized) { + STRUT_SET(self->frame.size, + self->innersize.left + self->bwidth, + self->innersize.top + self->bwidth, + self->innersize.right + self->bwidth, + self->innersize.bottom + self->bwidth); + } + /* shading can change without being moved or resized */ RECT_SET_SIZE(self->frame.area, self->frame.client->area.width + self->frame.size.left + self->frame.size.right, - self->frame.client->area.height + - self->frame.size.top + self->frame.size.bottom); + (self->frame.client->shaded ? TITLE_HEIGHT : + self->frame.client->area.height + + self->frame.size.top + self->frame.size.bottom)); - render(self); + if (resized) { + render(self); - frame_adjust_shape(self); + frame_adjust_shape(self); + } } void frame_adjust_state(ObFrame *self)

@@ -553,7 +567,7 @@

/* map the client so it maps when the frame does */ XMapWindow(ob_display, client->window); - frame_adjust_area(self); + frame_adjust_area(self, TRUE, TRUE); /* set all the windows for the frame in the client_map */ g_hash_table_insert(client_map, (gpointer)self->frame.window, client);
M openbox/client.copenbox/client.c

@@ -822,7 +822,7 @@

if (self->frame) { /* change the decors on the frame, and with more/less decorations, we may also need to be repositioned */ - engine_frame_adjust_area(self->frame); + engine_frame_adjust_area(self->frame, TRUE, TRUE); /* with new decor, the window's maximized size may change */ client_remaximize(self); }

@@ -1390,7 +1390,7 @@ XResizeWindow(ob_display, self->window, w, h);

/* move/resize the frame to match the request */ if (self->frame) { - engine_frame_adjust_area(self->frame); + engine_frame_adjust_area(self->frame, moved, resized); if (moved) { if (!user || final) {

@@ -1630,7 +1630,7 @@ self->wmstate = shade ? IconicState : NormalState;

self->shaded = shade; client_change_state(self); /* resize the frame to just the titlebar */ - engine_frame_adjust_area(self->frame); + engine_frame_adjust_area(self->frame, FALSE, FALSE); } void client_close(Client *self)
M openbox/event.copenbox/event.c

@@ -275,8 +275,6 @@ xwc.border_width = e->xconfigurerequest.border_width;

xwc.sibling = e->xconfigurerequest.above; xwc.stack_mode = e->xconfigurerequest.detail; - g_message("Proxying configure event for 0x%lx", window); - /* we are not to be held responsible if someone sends us an invalid request! */ xerror_set_ignore(TRUE);

@@ -323,6 +321,7 @@ static void event_handle_client(Client *client, XEvent *e)

{ XEvent ce; Atom msgtype; + int i=0; switch (e->type) { case FocusIn:

@@ -330,10 +329,10 @@ case FocusOut:

client_set_focused(client, e->type == FocusIn); break; case ConfigureRequest: - g_message("ConfigureRequest for window %lx", client->window); /* compress these */ while (XCheckTypedWindowEvent(ob_display, client->window, ConfigureRequest, &ce)) { + ++i; /* XXX if this causes bad things.. we can compress config req's with the same mask. */ e->xconfigurerequest.value_mask |=

@@ -352,6 +351,7 @@ ce.xconfigurerequest.border_width;

if (ce.xconfigurerequest.value_mask & CWStackMode) e->xconfigurerequest.detail = ce.xconfigurerequest.detail; } + if (i) g_message("Compressed %d Configures", i); /* if we are iconic (or shaded (fvwm does this)) ignore the event */ if (client->iconic || client->shaded) return;