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:
parent
584656d96a
commit
5186d04c61
3 changed files with 62 additions and 69 deletions
|
@ -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);
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue