From 5f7ffb00ba0050de28e915f6dcbd711b03eec938 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 14 Mar 2007 13:58:36 +0000 Subject: [PATCH] refix for managing iconic windows, without having the frame map which caused flashing. instead, keep track of if the frame has been mapped yet. if it hasn't and it is getting hidden, then make sure to unmap the child. --- openbox/client.c | 5 ++--- openbox/frame.c | 28 +++++++++++++++++----------- openbox/frame.h | 1 + 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index f5e600a2..1a0d2531 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -2116,10 +2116,9 @@ void client_showhide(ObClient *self) { if (client_should_show(self)) { - if (!self->frame->visible) - frame_show(self->frame); + frame_show(self->frame); } - else if (self->frame->visible) { + else { frame_hide(self->frame); /* Fall back focus since we're disappearing */ diff --git a/openbox/frame.c b/openbox/frame.c index 9a506d15..3fd8b22a 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -238,18 +238,28 @@ void frame_show(ObFrame *self) self->visible = TRUE; XMapWindow(ob_display, self->client->window); XMapWindow(ob_display, self->window); + self->firstmap = TRUE; } } void frame_hide(ObFrame *self) { - if (self->visible) { - self->visible = FALSE; - self->client->ignore_unmaps += 2; - /* we unmap the client itself so that we can get MapRequest - events, and because the ICCCM tells us to! */ - XUnmapWindow(ob_display, self->window); - XUnmapWindow(ob_display, self->client->window); + if (self->visible || self->firstmap == FALSE) { + if (self->visible) { + self->visible = FALSE; + self->client->ignore_unmaps += 2; + /* we unmap the client itself so that we can get MapRequest + events, and because the ICCCM tells us to! */ + XUnmapWindow(ob_display, self->window); + XUnmapWindow(ob_display, self->client->window); + } else { + /* the frame wasn't visible, but the frame is being hidden now. + so we don't need to unmap the frame, but we do need to unmap + the client. */ + self->client->ignore_unmaps += 1; + XUnmapWindow(ob_display, self->client->window); + } + self->firstmap = TRUE; } } @@ -535,10 +545,6 @@ void frame_grab_client(ObFrame *self, ObClient *client) /* map the client so it maps when the frame does */ XMapWindow(ob_display, client->window); - /* map the frame so they are in a consistant state together */ - XMapWindow(ob_display, self->window); - /* reflect that we're initially visible */ - self->visible = TRUE; /* set all the windows for the frame in the window_map */ g_hash_table_insert(window_map, &self->window, client); diff --git a/openbox/frame.h b/openbox/frame.h index 0d044366..70855b1b 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -76,6 +76,7 @@ struct _ObFrame Strut size; Rect area; gboolean visible; + gboolean firstmap; /*! Whether the window is obscured at all or fully visible. */ gboolean obscured; -- 2.39.2