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,30 +282,13 @@ void client_manage(Window window)
/* non-zero defaults */ /* non-zero defaults */
self->wmstate = WithdrawnState; /* make sure it gets updated first time */ self->wmstate = WithdrawnState; /* make sure it gets updated first time */
self->gravity = NorthWestGravity;
self->desktop = screen_num_desktops; /* always an invalid value */ self->desktop = screen_num_desktops; /* always an invalid value */
self->user_time = focus_client ? focus_client->user_time : CurrentTime; self->user_time = focus_client ? focus_client->user_time : CurrentTime;
/* get all the stuff off the window */
client_get_all(self, TRUE); 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 /* specify that if we exit, the window should not be destroyed and
should be reparented back to root automatically */ should be reparented back to root automatically */
XChangeSaveSet(ob_display, window, SetModeInsert); XChangeSaveSet(ob_display, window, SetModeInsert);
@ -315,11 +298,33 @@ void client_manage(Window window)
frame_grab_client(self->frame); 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 /* do this after we have a frame.. it uses the frame to help determine the
WM_STATE to apply. */ WM_STATE to apply. */
client_change_state(self); 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 */ /* do this to add ourselves to the stacking list in a non-intrusive way */
client_calc_layer(self); client_calc_layer(self);
@ -453,6 +458,9 @@ void client_manage(Window window)
stacking_raise(CLIENT_AS_WINDOW(self)); 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 /* 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 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 */ /* 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) if (self->fullscreen)
a = self->pre_fullscreen_area; 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->fullscreen = self->max_horz = self->max_vert = FALSE;
self->decorations = 0; /* unmanaged windows have no decor */ 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, void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
gboolean user, gboolean final, gboolean user, gboolean final)
gboolean force_reply)
{ {
gint oldw, oldh, oldrx, oldry; gint oldw, oldh;
gboolean send_resize_client; gboolean send_resize_client;
gboolean moved = FALSE, resized = FALSE, rootmoved = FALSE; gboolean moved = FALSE, resized = FALSE;
guint fdecor = self->frame->decorations; guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz; gboolean fhorz = self->frame->max_horz;
gint logicalw, logicalh; gint logicalw, logicalh;
@ -2702,17 +2711,7 @@ void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h,
if (moved || resized) if (moved || resized)
frame_adjust_area(self->frame, moved, resized, FALSE); frame_adjust_area(self->frame, moved, resized, FALSE);
/* find the client's position relative to the root window */ if ((!user || (user && final)) && !resized)
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))
{ {
XEvent event; 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.event = self->window;
event.xconfigure.window = 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 */ /* root window real coords */
event.xconfigure.x = self->root_pos.x; event.xconfigure.x = self->root_pos.x;
event.xconfigure.y = self->root_pos.y; event.xconfigure.y = self->root_pos.y;