From a0941554f6cfc29dfd4b0da0b5ce83fdd719efa7 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 22 May 2007 01:03:13 +0000 Subject: [PATCH] fix showing the resize cursors at the right times. fix losing the pre-size/position for windows mapped maximized or fullscreen states (and on restart) --- openbox/client.c | 33 ++++++++++++++++----------------- openbox/frame.c | 27 ++++++++++++++++----------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 94b5c480..5cc1df9a 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -403,20 +403,26 @@ void client_manage(Window window) frame_adjust_client_area(self->frame); + /* do this after the window is placed, so the premax/prefullscreen numbers + won't be all wacko!! + also, this moves the window to the position where it has been placed + */ + client_apply_startup_state(self); + /* move the client to its placed position, or it it's already there, generate a ConfigureNotify telling the client where it is. do this after adjusting the frame. otherwise it gets all weird and - clients don't work right */ + clients don't work right + + also do this after applying the startup state so maximize and fullscreen + will get the right sizes and positions if the client is starting with + those states + */ client_configure(self, self->area.x, self->area.y, self->area.width, self->area.height, FALSE, TRUE); - /* do this after the window is placed, so the premax/prefullscreen numbers - won't be all wacko!! - also, this moves the window to the position where it has been placed - */ - client_apply_startup_state(self); if (activate) { guint32 last_time = focus_client ? @@ -1584,6 +1590,8 @@ void client_update_normal_hints(ObClient *self) } } +/*! This needs to be followed by a call to client_configure to make + the changes show */ void client_setup_decor_and_functions(ObClient *self) { /* start with everything (cept fullscreen) */ @@ -1704,14 +1712,9 @@ void client_setup_decor_and_functions(ObClient *self) self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE; } - if (self->max_horz && self->max_vert) { - /* also can't resize maximized windows. - do this after checking for resize to let you maximize */ - self->functions &=~ OB_CLIENT_FUNC_RESIZE; - + if (self->max_horz && self->max_vert) /* kill the handle on fully maxed windows */ self->decorations &= ~(OB_FRAME_DECOR_HANDLE | OB_FRAME_DECOR_GRIPS); - } /* If there are no decorations to remove, don't allow the user to try toggle the state */ @@ -1740,11 +1743,6 @@ void client_setup_decor_and_functions(ObClient *self) } client_change_allowed_actions(self); - - if (self->frame) { - /* adjust the client's decorations, etc. */ - client_reconfigure(self); - } } static void client_change_allowed_actions(ObClient *self) @@ -3615,6 +3613,7 @@ void client_set_undecorated(ObClient *self, gboolean undecorated) { self->undecorated = undecorated; client_setup_decor_and_functions(self); + client_reconfigure(self); /* show the lack of decorations */ client_change_state(self); /* reflect this in the state hints */ } } diff --git a/openbox/frame.c b/openbox/frame.c index 43b50722..80d6ca1e 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -55,6 +55,7 @@ static void layout_title(ObFrame *self); static void set_theme_statics(ObFrame *self); static void free_theme_statics(ObFrame *self); static gboolean frame_animate_iconify(gpointer self); +static void frame_adjust_cursors(ObFrame *self); static Window createWindow(Window parent, Visual *visual, gulong mask, XSetWindowAttributes *attrib) @@ -329,7 +330,13 @@ void frame_adjust_area(ObFrame *self, gboolean moved, oldsize = self->size; if (resized) { + /* do this before changing the frame's status like max_horz max_vert */ + frame_adjust_cursors(self); + + self->functions = self->client->functions; self->decorations = self->client->decorations; + self->max_horz = self->client->max_horz; + self->max_vert = self->client->max_vert; if (self->decorations & OB_FRAME_DECOR_BORDER) { self->bwidth = ob_rr_theme->fbwidth; @@ -340,9 +347,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } self->rbwidth = self->bwidth; - self->max_horz = self->client->max_horz; - self->max_vert = self->client->max_vert; - if (self->max_horz) { self->cbwidth_x = 0; self->width = self->client->area.width - self->bwidth * 2; @@ -740,14 +744,17 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR)) XResizeWindow(ob_display, self->label, self->label_width, ob_rr_theme->label_height); +} - /* set up cursors */ - if (!fake && - (self->functions & OB_CLIENT_FUNC_RESIZE) != - (self->client->functions & OB_CLIENT_FUNC_RESIZE)) +static void frame_adjust_cursors(ObFrame *self) +{ + if ((self->functions & OB_CLIENT_FUNC_RESIZE) != + (self->client->functions & OB_CLIENT_FUNC_RESIZE) || + ((self->max_horz && self->max_vert) != + (self->client->max_horz && self->client->max_vert))) { - gboolean r = self->client->functions & OB_CLIENT_FUNC_RESIZE && - !(self->max_horz && self->max_vert); + gboolean r = (self->client->functions & OB_CLIENT_FUNC_RESIZE) && + !(self->client->max_horz && self->client->max_vert); XSetWindowAttributes a; a.cursor = ob_cursor(r ? OB_CURSOR_NORTH : OB_CURSOR_NONE); @@ -783,8 +790,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XChangeWindowAttributes(ob_display, self->rgripright, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgriptop, CWCursor, &a); XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a); - - self->functions = self->client->functions; } } -- 2.45.2