set the default window gravity to NorthWest.

only put the bare minimum inside the server grab.
adjust the frame decorations in client_manage instead of frame_grab_client
remove the last parameter from client_configure_full and just determine it from the other state available.
send configurenotifies at all the right times.
make windows get restored to their position properly when they have a border
This commit is contained in:
Dana Jansens 2007-05-11 02:46:59 +00:00
parent caba57b694
commit 75372cd4a7

View file

@ -282,29 +282,12 @@ void client_manage(Window window)
/* non-zero defaults */
self->wmstate = WithdrawnState; /* make sure it gets updated first time */
self->gravity = NorthWestGravity;
self->desktop = screen_num_desktops; /* always an invalid value */
self->user_time = focus_client ? focus_client->user_time : CurrentTime;
/* get all the stuff off the window */
client_get_all(self, TRUE);
/* per-app settings override stuff, and return the settings for other
uses too */
settings = client_get_settings_state(self);
/* the session should get the last say */
client_restore_session_state(self);
client_setup_decor_and_functions(self);
{
Time t = sn_app_started(self->startup_id, self->class);
if (t) self->user_time = t;
}
/* update the focus lists, do this before the call to change_state or
it can end up in the list twice! */
focus_order_add_new(self);
/* remove the client's border (and adjust re gravity) */
client_toggle_border(self, FALSE);
/* specify that if we exit, the window should not be destroyed and
should be reparented back to root automatically */
@ -315,11 +298,33 @@ void client_manage(Window window)
frame_grab_client(self->frame);
/* we've grabbed everything and set everything that we need to at mapping
time now */
grab_server(FALSE);
/* per-app settings override stuff from client_get_all, and return the
settings for other uses too */
settings = client_get_settings_state(self);
/* the session should get the last say thought */
client_restore_session_state(self);
/* now we have all of the window's information so we can set this up */
client_setup_decor_and_functions(self);
/* remove the client's border (and adjust re gravity) */
client_toggle_border(self, FALSE);
{
Time t = sn_app_started(self->startup_id, self->class);
if (t) self->user_time = t;
}
/* do this after we have a frame.. it uses the frame to help determine the
WM_STATE to apply. */
client_change_state(self);
grab_server(FALSE);
/* add ourselves to the focus order */
focus_order_add_new(self);
/* do this to add ourselves to the stacking list in a non-intrusive way */
client_calc_layer(self);
@ -453,6 +458,9 @@ void client_manage(Window window)
stacking_raise(CLIENT_AS_WINDOW(self));
}
/* adjust the frame to the client's size before showing the window */
frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
/* this has to happen before we try focus the window, but we want it to
happen after the client's stacking has been determined or it looks bad
*/
@ -594,7 +602,12 @@ void client_unmanage(ObClient *self)
/* restore the window's original geometry so it is not lost */
{
Rect a = self->area;
Rect a;
/* give the client its border back */
client_toggle_border(self, TRUE);
a = self->area;
if (self->fullscreen)
a = self->pre_fullscreen_area;
@ -609,9 +622,6 @@ void client_unmanage(ObClient *self)
}
}
/* give the client its border back */
client_toggle_border(self, TRUE);
self->fullscreen = self->max_horz = self->max_vert = FALSE;
self->decorations = 0; /* unmanaged windows have no decor */
@ -2657,12 +2667,11 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
gboolean user, gboolean final,
gboolean force_reply)
gboolean user, gboolean final)
{
gint oldw, oldh, oldrx, oldry;
gint oldw, oldh;
gboolean send_resize_client;
gboolean moved = FALSE, resized = FALSE, rootmoved = FALSE;
gboolean moved = FALSE, resized = FALSE;
guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz;
gint logicalw, logicalh;
@ -2702,17 +2711,7 @@ void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
if (moved || resized)
frame_adjust_area(self->frame, moved, resized, FALSE);
/* find the client's position relative to the root window */
oldrx = self->root_pos.x;
oldry = self->root_pos.y;
rootmoved = (oldrx != (signed)(self->frame->area.x +
self->frame->size.left -
self->border_width) ||
oldry != (signed)(self->frame->area.y +
self->frame->size.top -
self->border_width));
if (force_reply || ((!user || (user && final)) && rootmoved))
if ((!user || (user && final)) && !resized)
{
XEvent event;
@ -2727,6 +2726,9 @@ void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
event.xconfigure.event = self->window;
event.xconfigure.window = self->window;
ob_debug("Sending ConfigureNotify to %s for %d,%d %dx%d\n",
self->title, self->root_pos.x, self->root_pos.y, w, h);
/* root window real coords */
event.xconfigure.x = self->root_pos.x;
event.xconfigure.y = self->root_pos.y;