From 5186d04c613056c44490bd3f6766fd969e83305a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 25 Aug 2003 08:49:48 +0000 Subject: [PATCH] better handling of maximizing, wrt changing decorations on the windows, and showing the correct decor for the max state especially for windows which dont change size (Xnest) when maximized cuz they are at their maximum size already --- openbox/client.c | 125 +++++++++++++++++++++++------------------------ openbox/frame.c | 9 ++-- openbox/frame.h | 1 + 3 files changed, 64 insertions(+), 71 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 961c6bbf..e905a6f9 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -233,7 +233,7 @@ void client_manage(Window window) /* create the ObClient struct, and populate it from the hints on the window */ - self = g_new(ObClient, 1); + self = g_new0(ObClient, 1); self->obwin.type = Window_Client; self->window = window; @@ -309,8 +309,6 @@ void client_manage(Window window) if (ob_state() == OB_STATE_RUNNING) client_move_onscreen(self, TRUE); - screen_update_areas(); - client_showhide(self); /* use client_focus instead of client_activate cuz client_activate does @@ -329,6 +327,9 @@ void client_manage(Window window) client_list = g_list_append(client_list, self); g_hash_table_insert(window_map, &self->window, self); + /* this has to happen after we're in the client_list */ + screen_update_areas(); + /* update the list hints */ client_set_list(); @@ -651,26 +652,11 @@ static void client_toggle_border(ObClient *self, gboolean show) static void client_get_all(ObClient *self) { - /* update EVERYTHING!! */ - - self->ignore_unmaps = 0; - - /* defaults */ - self->frame = NULL; - self->session = NULL; - self->title = self->icon_title = NULL; + /* non-zero defaults */ self->title_count = 1; - self->name = self->class = self->role = NULL; self->wmstate = NormalState; - self->transient = FALSE; - self->transients = NULL; - self->transient_for = NULL; self->layer = -1; - self->urgent = FALSE; - self->positioned = FALSE; self->decorate = TRUE; - self->group = NULL; - self->nicons = 0; client_get_area(self); client_update_transient_for(self); @@ -1131,6 +1117,10 @@ void client_setup_decor_and_functions(ObClient *self) self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE; } + /* kill the handle on fully maxed windows */ + if (self->max_vert && self->max_horz) + self->decorations &= ~OB_FRAME_DECOR_HANDLE; + /* finally, the user can have requested no decorations, which overrides everything */ if (!self->decorate) @@ -1408,12 +1398,13 @@ void client_update_strut(ObClient *self) guint num; guint32 *data; gboolean got = FALSE; + StrutPartial strut; if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal, &data, &num)) { if (num == 12) { got = TRUE; - STRUT_PARTIAL_SET(self->strut, + STRUT_PARTIAL_SET(strut, data[0], data[2], data[1], data[3], data[4], data[5], data[8], data[9], data[6], data[7], data[10], data[11]); @@ -1425,7 +1416,7 @@ void client_update_strut(ObClient *self) PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { if (num == 4) { got = TRUE; - STRUT_PARTIAL_SET(self->strut, + STRUT_PARTIAL_SET(strut, data[0], data[2], data[1], data[3], 0, 0, 0, 0, 0, 0, 0, 0); } @@ -1433,13 +1424,17 @@ void client_update_strut(ObClient *self) } if (!got) - STRUT_PARTIAL_SET(self->strut, 0, 0, 0, 0, + STRUT_PARTIAL_SET(strut, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - /* updating here is pointless while we're being mapped cuz we're not in - the client list yet */ - if (self->frame) - screen_update_areas(); + if (!STRUT_EQUAL(strut, self->strut)) { + self->strut = strut; + + /* updating here is pointless while we're being mapped cuz we're not in + the client list yet */ + if (self->frame) + screen_update_areas(); + } } void client_update_icons(ObClient *self) @@ -1743,6 +1738,7 @@ void client_configure_full(ObClient *self, ObCorner anchor, { gboolean moved = FALSE, resized = FALSE; guint fdecor = self->frame->decorations; + gboolean fhorz = self->frame->max_horz; /* make the frame recalculate its dimentions n shit without changing anything visible for real, this way the constraints below can work with @@ -1820,6 +1816,7 @@ void client_configure_full(ObClient *self, ObCorner anchor, if (!(w == self->area.width && h == self->area.height)) { int basew, baseh, minw, minh; + int mw, mh, aw, ah; /* base size is substituted with min size if not specified */ if (self->base_size.width || self->base_size.height) { @@ -1838,33 +1835,31 @@ void client_configure_full(ObClient *self, ObCorner anchor, minh = self->base_size.height; } - if (user) { - /* for interactive resizing. have to move half an increment in each - direction. */ - - /* how far we are towards the next size inc */ - int mw = (w - basew) % self->size_inc.width; - int mh = (h - baseh) % self->size_inc.height; - /* amount to add */ - int aw = self->size_inc.width / 2; - int ah = self->size_inc.height / 2; - /* don't let us move into a new size increment */ - if (mw + aw >= self->size_inc.width) - aw = self->size_inc.width - mw - 1; - if (mh + ah >= self->size_inc.height) - ah = self->size_inc.height - mh - 1; - w += aw; - h += ah; + /* for interactive resizing. have to move half an increment in each + direction. */ + + /* how far we are towards the next size inc */ + mw = (w - basew) % self->size_inc.width; + mh = (h - baseh) % self->size_inc.height; + /* amount to add */ + aw = self->size_inc.width / 2; + ah = self->size_inc.height / 2; + /* don't let us move into a new size increment */ + if (mw + aw >= self->size_inc.width) + aw = self->size_inc.width - mw - 1; + if (mh + ah >= self->size_inc.height) + ah = self->size_inc.height - mh - 1; + w += aw; + h += ah; - /* if this is a user-requested resize, then check against min/max - sizes */ - - /* smaller than min size or bigger than max size? */ - if (w > self->max_size.width) w = self->max_size.width; - if (w < minw) w = minw; - if (h > self->max_size.height) h = self->max_size.height; - if (h < minh) h = minh; - } + /* if this is a user-requested resize, then check against min/max + sizes */ + + /* smaller than min size or bigger than max size? */ + if (w > self->max_size.width) w = self->max_size.width; + if (w < minw) w = minw; + if (h > self->max_size.height) h = self->max_size.height; + if (h < minh) h = minh; w -= basew; h -= baseh; @@ -1888,20 +1883,18 @@ void client_configure_full(ObClient *self, ObCorner anchor, w += basew; h += baseh; - if (user) { - /* adjust the height to match the width for the aspect ratios. - for this, min size is not substituted for base size ever. */ - w -= self->base_size.width; - h -= self->base_size.height; + /* adjust the height to match the width for the aspect ratios. + for this, min size is not substituted for base size ever. */ + w -= self->base_size.width; + h -= self->base_size.height; - if (self->min_ratio) - if (h * self->min_ratio > w) h = (int)(w / self->min_ratio); - if (self->max_ratio) - if (h * self->max_ratio < w) h = (int)(w / self->max_ratio); + if (self->min_ratio) + if (h * self->min_ratio > w) h = (int)(w / self->min_ratio); + if (self->max_ratio) + if (h * self->max_ratio < w) h = (int)(w / self->max_ratio); - w += self->base_size.width; - h += self->base_size.height; - } + w += self->base_size.width; + h += self->base_size.height; } switch (anchor) { @@ -1933,7 +1926,7 @@ void client_configure_full(ObClient *self, ObCorner anchor, /* move/resize the frame to match the request */ if (self->frame) { - if (self->decorations != fdecor) + if (self->decorations != fdecor || self->max_horz != fhorz) moved = resized = TRUE; if (moved || resized) @@ -2190,6 +2183,8 @@ void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea) client_change_state(self); /* change the state hints on the client */ + client_setup_decor_and_functions(self); + /* figure out where the client should be going */ frame_frame_gravity(self->frame, &x, &y); client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE); diff --git a/openbox/frame.c b/openbox/frame.c index 633b7cef..6c3b418a 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -213,6 +213,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, { if (resized) { self->decorations = self->client->decorations; + self->max_horz = self->client->max_horz; if (self->decorations & OB_FRAME_DECOR_BORDER) { self->bwidth = ob_rr_theme->bwidth; @@ -222,11 +223,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } self->rbwidth = self->bwidth; - if (self->client->max_vert && self->client->max_horz) - self->client->decorations = - self->decorations &= ~OB_FRAME_DECOR_HANDLE; - - if (self->client->max_horz) + if (self->max_horz) self->bwidth = self->cbwidth_x = 0; STRUT_SET(self->innersize, @@ -235,7 +232,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->cbwidth_x, self->cbwidth_y); self->width = self->client->area.width + self->cbwidth_x * 2 - - (self->client->max_horz ? self->rbwidth * 2 : 0); + (self->max_horz ? self->rbwidth * 2 : 0); self->width = MAX(self->width, 1); /* no lower than 1 */ /* set border widths */ diff --git a/openbox/frame.h b/openbox/frame.h index 333580b4..572d18b6 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -59,6 +59,7 @@ struct _ObFrame gboolean obscured; guint decorations; + gboolean max_horz; Window title; Window label; -- 2.45.2