add decoration state to the frame struct. make client_configure adjust the frame if the decorations do not match between the client and the frame, so that when they change it can send a configurenotify to the client.
Dana Jansens danakj@orodu.net
3 files changed,
18 insertions(+),
15 deletions(-)
M
openbox/client.c
→
openbox/client.c
@@ -1027,10 +1027,7 @@ /* this makes sure that these windows appear on all desktops */
if (self->type == Type_Desktop && self->desktop != DESKTOP_ALL) client_set_desktop(self, DESKTOP_ALL, FALSE); - /* change the decors on the frame, and with more/less decorations, - we may also need to be repositioned */ - frame_adjust_area(self->frame, TRUE, TRUE); - /* with new decor, the window's maximized size may change */ + /* adjust the client's decorations, etc. */ client_reconfigure(self); } else { /* this makes sure that these windows appear on all desktops */@@ -1775,6 +1772,9 @@ XResizeWindow(ob_display, self->window, w, h);
/* move/resize the frame to match the request */ if (self->frame) { + if (self->decorations != self->frame->decorations) + moved = resized = TRUE; + if (moved || resized) frame_adjust_area(self->frame, moved, resized);
M
openbox/frame.c
→
openbox/frame.c
@@ -38,6 +38,7 @@
self = g_new(Frame, 1); self->visible = FALSE; + self->decorations = 0; /* create all of the decor windows */ mask = CWOverrideRedirect | CWEventMask;@@ -165,7 +166,7 @@ self->client->window,
ShapeBounding, ShapeSet); num = 0; - if (self->client->decorations & Decor_Titlebar) { + if (self->decorations & Decor_Titlebar) { xrect[0].x = -ob_rr_theme->bevel; xrect[0].y = -ob_rr_theme->bevel; xrect[0].width = self->width + self->bwidth * 2;@@ -174,7 +175,7 @@ self->bwidth * 2;
++num; } - if (self->client->decorations & Decor_Handle) { + if (self->decorations & Decor_Handle) { xrect[1].x = -ob_rr_theme->bevel; xrect[1].y = FRAME_HANDLE_Y(self); xrect[1].width = self->width + self->bwidth * 2;@@ -193,7 +194,8 @@
void frame_adjust_area(Frame *self, gboolean moved, gboolean resized) { if (resized) { - if (self->client->decorations & Decor_Border) { + self->decorations = self->client->decorations; + if (self->decorations & Decor_Border) { self->bwidth = ob_rr_theme->bwidth; self->cbwidth = ob_rr_theme->cbwidth; } else {@@ -223,7 +225,7 @@ self->label_x = -1;
self->max_x = -1; self->close_x = -1; - if (self->client->decorations & Decor_Titlebar) { + if (self->decorations & Decor_Titlebar) { XMoveResizeWindow(ob_display, self->title, -self->bwidth, -self->bwidth, self->width, ob_rr_theme->title_height);@@ -235,7 +237,7 @@ layout_title(self);
} else XUnmapWindow(ob_display, self->title); - if (self->client->decorations & Decor_Handle) { + if (self->decorations & Decor_Handle) { XMoveResizeWindow(ob_display, self->handle, -self->bwidth, FRAME_HANDLE_Y(self), self->width, ob_rr_theme->handle_height);@@ -425,28 +427,28 @@ self->label_width = self->width - (ob_rr_theme->bevel + 1) * 2;
for (lc = ob_rr_theme->title_layout; *lc != '\0'; ++lc) { switch (*lc) { case 'N': - if (!(self->client->decorations & Decor_Icon)) break; + if (!(self->decorations & Decor_Icon)) break; if (n) { *lc = ' '; break; } /* rm duplicates */ n = TRUE; self->label_width -= (ob_rr_theme->button_size + 2 + ob_rr_theme->bevel + 1); break; case 'D': - if (!(self->client->decorations & Decor_AllDesktops)) break; + if (!(self->decorations & Decor_AllDesktops)) break; if (d) { *lc = ' '; break; } /* rm duplicates */ d = TRUE; self->label_width -= (ob_rr_theme->button_size + ob_rr_theme->bevel + 1); break; case 'S': - if (!(self->client->decorations & Decor_Shade)) break; + if (!(self->decorations & Decor_Shade)) break; if (s) { *lc = ' '; break; } /* rm duplicates */ s = TRUE; self->label_width -= (ob_rr_theme->button_size + ob_rr_theme->bevel + 1); break; case 'I': - if (!(self->client->decorations & Decor_Iconify)) break; + if (!(self->decorations & Decor_Iconify)) break; if (i) { *lc = ' '; break; } /* rm duplicates */ i = TRUE; self->label_width -= (ob_rr_theme->button_size +@@ -457,14 +459,14 @@ if (l) { *lc = ' '; break; } /* rm duplicates */
l = TRUE; break; case 'M': - if (!(self->client->decorations & Decor_Maximize)) break; + if (!(self->decorations & Decor_Maximize)) break; if (m) { *lc = ' '; break; } /* rm duplicates */ m = TRUE; self->label_width -= (ob_rr_theme->button_size + ob_rr_theme->bevel + 1); break; case 'C': - if (!(self->client->decorations & Decor_Close)) break; + if (!(self->decorations & Decor_Close)) break; if (c) { *lc = ' '; break; } /* rm duplicates */ c = TRUE; self->label_width -= (ob_rr_theme->button_size +
M
openbox/frame.h
→
openbox/frame.h
@@ -37,6 +37,7 @@
Strut size; Rect area; gboolean visible; + int decorations; Window title; Window label;