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

This commit is contained in:
Dana Jansens 2003-08-25 08:49:48 +00:00
parent 584656d96a
commit 5186d04c61
3 changed files with 62 additions and 69 deletions

View file

@ -233,7 +233,7 @@ void client_manage(Window window)
/* create the ObClient struct, and populate it from the hints on the /* create the ObClient struct, and populate it from the hints on the
window */ window */
self = g_new(ObClient, 1); self = g_new0(ObClient, 1);
self->obwin.type = Window_Client; self->obwin.type = Window_Client;
self->window = window; self->window = window;
@ -309,8 +309,6 @@ void client_manage(Window window)
if (ob_state() == OB_STATE_RUNNING) if (ob_state() == OB_STATE_RUNNING)
client_move_onscreen(self, TRUE); client_move_onscreen(self, TRUE);
screen_update_areas();
client_showhide(self); client_showhide(self);
/* use client_focus instead of client_activate cuz client_activate does /* 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); client_list = g_list_append(client_list, self);
g_hash_table_insert(window_map, &self->window, 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 */ /* update the list hints */
client_set_list(); client_set_list();
@ -651,26 +652,11 @@ static void client_toggle_border(ObClient *self, gboolean show)
static void client_get_all(ObClient *self) static void client_get_all(ObClient *self)
{ {
/* update EVERYTHING!! */ /* non-zero defaults */
self->ignore_unmaps = 0;
/* defaults */
self->frame = NULL;
self->session = NULL;
self->title = self->icon_title = NULL;
self->title_count = 1; self->title_count = 1;
self->name = self->class = self->role = NULL;
self->wmstate = NormalState; self->wmstate = NormalState;
self->transient = FALSE;
self->transients = NULL;
self->transient_for = NULL;
self->layer = -1; self->layer = -1;
self->urgent = FALSE;
self->positioned = FALSE;
self->decorate = TRUE; self->decorate = TRUE;
self->group = NULL;
self->nicons = 0;
client_get_area(self); client_get_area(self);
client_update_transient_for(self); client_update_transient_for(self);
@ -1131,6 +1117,10 @@ void client_setup_decor_and_functions(ObClient *self)
self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE; 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 /* finally, the user can have requested no decorations, which overrides
everything */ everything */
if (!self->decorate) if (!self->decorate)
@ -1408,12 +1398,13 @@ void client_update_strut(ObClient *self)
guint num; guint num;
guint32 *data; guint32 *data;
gboolean got = FALSE; gboolean got = FALSE;
StrutPartial strut;
if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal, if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal,
&data, &num)) { &data, &num)) {
if (num == 12) { if (num == 12) {
got = TRUE; got = TRUE;
STRUT_PARTIAL_SET(self->strut, STRUT_PARTIAL_SET(strut,
data[0], data[2], data[1], data[3], data[0], data[2], data[1], data[3],
data[4], data[5], data[8], data[9], data[4], data[5], data[8], data[9],
data[6], data[7], data[10], data[11]); 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)) { PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) {
if (num == 4) { if (num == 4) {
got = TRUE; got = TRUE;
STRUT_PARTIAL_SET(self->strut, STRUT_PARTIAL_SET(strut,
data[0], data[2], data[1], data[3], data[0], data[2], data[1], data[3],
0, 0, 0, 0, 0, 0, 0, 0); 0, 0, 0, 0, 0, 0, 0, 0);
} }
@ -1433,14 +1424,18 @@ void client_update_strut(ObClient *self)
} }
if (!got) 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); 0, 0, 0, 0, 0, 0, 0, 0);
if (!STRUT_EQUAL(strut, self->strut)) {
self->strut = strut;
/* updating here is pointless while we're being mapped cuz we're not in /* updating here is pointless while we're being mapped cuz we're not in
the client list yet */ the client list yet */
if (self->frame) if (self->frame)
screen_update_areas(); screen_update_areas();
} }
}
void client_update_icons(ObClient *self) void client_update_icons(ObClient *self)
{ {
@ -1743,6 +1738,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
{ {
gboolean moved = FALSE, resized = FALSE; gboolean moved = FALSE, resized = FALSE;
guint fdecor = self->frame->decorations; guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz;
/* make the frame recalculate its dimentions n shit without changing /* make the frame recalculate its dimentions n shit without changing
anything visible for real, this way the constraints below can work with 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)) { if (!(w == self->area.width && h == self->area.height)) {
int basew, baseh, minw, minh; int basew, baseh, minw, minh;
int mw, mh, aw, ah;
/* base size is substituted with min size if not specified */ /* base size is substituted with min size if not specified */
if (self->base_size.width || self->base_size.height) { if (self->base_size.width || self->base_size.height) {
@ -1838,16 +1835,15 @@ void client_configure_full(ObClient *self, ObCorner anchor,
minh = self->base_size.height; minh = self->base_size.height;
} }
if (user) {
/* for interactive resizing. have to move half an increment in each /* for interactive resizing. have to move half an increment in each
direction. */ direction. */
/* how far we are towards the next size inc */ /* how far we are towards the next size inc */
int mw = (w - basew) % self->size_inc.width; mw = (w - basew) % self->size_inc.width;
int mh = (h - baseh) % self->size_inc.height; mh = (h - baseh) % self->size_inc.height;
/* amount to add */ /* amount to add */
int aw = self->size_inc.width / 2; aw = self->size_inc.width / 2;
int ah = self->size_inc.height / 2; ah = self->size_inc.height / 2;
/* don't let us move into a new size increment */ /* don't let us move into a new size increment */
if (mw + aw >= self->size_inc.width) if (mw + aw >= self->size_inc.width)
aw = self->size_inc.width - mw - 1; aw = self->size_inc.width - mw - 1;
@ -1864,7 +1860,6 @@ void client_configure_full(ObClient *self, ObCorner anchor,
if (w < minw) w = minw; if (w < minw) w = minw;
if (h > self->max_size.height) h = self->max_size.height; if (h > self->max_size.height) h = self->max_size.height;
if (h < minh) h = minh; if (h < minh) h = minh;
}
w -= basew; w -= basew;
h -= baseh; h -= baseh;
@ -1888,7 +1883,6 @@ void client_configure_full(ObClient *self, ObCorner anchor,
w += basew; w += basew;
h += baseh; h += baseh;
if (user) {
/* adjust the height to match the width for the aspect ratios. /* adjust the height to match the width for the aspect ratios.
for this, min size is not substituted for base size ever. */ for this, min size is not substituted for base size ever. */
w -= self->base_size.width; w -= self->base_size.width;
@ -1902,7 +1896,6 @@ void client_configure_full(ObClient *self, ObCorner anchor,
w += self->base_size.width; w += self->base_size.width;
h += self->base_size.height; h += self->base_size.height;
} }
}
switch (anchor) { switch (anchor) {
case OB_CORNER_TOPLEFT: case OB_CORNER_TOPLEFT:
@ -1933,7 +1926,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
/* move/resize the frame to match the request */ /* move/resize the frame to match the request */
if (self->frame) { if (self->frame) {
if (self->decorations != fdecor) if (self->decorations != fdecor || self->max_horz != fhorz)
moved = resized = TRUE; moved = resized = TRUE;
if (moved || resized) 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_change_state(self); /* change the state hints on the client */
client_setup_decor_and_functions(self);
/* figure out where the client should be going */ /* figure out where the client should be going */
frame_frame_gravity(self->frame, &x, &y); frame_frame_gravity(self->frame, &x, &y);
client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE); client_configure(self, OB_CORNER_TOPLEFT, x, y, w, h, TRUE, TRUE);

View file

@ -213,6 +213,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
{ {
if (resized) { if (resized) {
self->decorations = self->client->decorations; self->decorations = self->client->decorations;
self->max_horz = self->client->max_horz;
if (self->decorations & OB_FRAME_DECOR_BORDER) { if (self->decorations & OB_FRAME_DECOR_BORDER) {
self->bwidth = ob_rr_theme->bwidth; self->bwidth = ob_rr_theme->bwidth;
@ -222,11 +223,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
} }
self->rbwidth = self->bwidth; self->rbwidth = self->bwidth;
if (self->client->max_vert && self->client->max_horz) if (self->max_horz)
self->client->decorations =
self->decorations &= ~OB_FRAME_DECOR_HANDLE;
if (self->client->max_horz)
self->bwidth = self->cbwidth_x = 0; self->bwidth = self->cbwidth_x = 0;
STRUT_SET(self->innersize, STRUT_SET(self->innersize,
@ -235,7 +232,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
self->cbwidth_x, self->cbwidth_x,
self->cbwidth_y); self->cbwidth_y);
self->width = self->client->area.width + self->cbwidth_x * 2 - 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 */ self->width = MAX(self->width, 1); /* no lower than 1 */
/* set border widths */ /* set border widths */

View file

@ -59,6 +59,7 @@ struct _ObFrame
gboolean obscured; gboolean obscured;
guint decorations; guint decorations;
gboolean max_horz;
Window title; Window title;
Window label; Window label;