From 069e9607fa433190307bb8242294a109e88165de Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 21 Jun 2003 18:59:35 +0000 Subject: [PATCH] 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. --- openbox/client.c | 8 ++++---- openbox/frame.c | 24 +++++++++++++----------- openbox/frame.h | 1 + 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index a5c29a3b..87cdba96 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1027,10 +1027,7 @@ void client_setup_decor_and_functions(Client *self) 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 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int 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); diff --git a/openbox/frame.c b/openbox/frame.c index 65e116c8..5409fc76 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -38,6 +38,7 @@ Frame *frame_new() self = g_new(Frame, 1); self->visible = FALSE; + self->decorations = 0; /* create all of the decor windows */ mask = CWOverrideRedirect | CWEventMask; @@ -165,7 +166,7 @@ void frame_adjust_shape(Frame *self) 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 @@ void frame_adjust_shape(Frame *self) ++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_shape(Frame *self) 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 @@ void frame_adjust_area(Frame *self, gboolean moved, gboolean resized) 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 @@ void frame_adjust_area(Frame *self, gboolean moved, gboolean resized) } 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 @@ static void layout_title(Frame *self) 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 @@ static void layout_title(Frame *self) 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 + diff --git a/openbox/frame.h b/openbox/frame.h index bfce4a7d..2720de91 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -37,6 +37,7 @@ typedef struct Frame { Strut size; Rect area; gboolean visible; + int decorations; Window title; Window label; -- 2.39.2