X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=930f3ee4d174571bd5e2576383133dd66a6b6a14;hb=425dc318088b4c675cc0d7e6d75c6ff552cee448;hp=037894668aca89b009690f5dc8ebeb1461196875;hpb=52c345c3002fe7bb134d35cb5446fa2601ff192f;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 03789466..930f3ee4 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -126,7 +126,7 @@ void client_set_list() windows = NULL; PROP_SETA32(RootWindow(ob_display, ob_screen), - net_client_list, window, (guint32*)windows, size); + net_client_list, window, (gulong*)windows, size); if (windows) g_free(windows); @@ -344,6 +344,24 @@ void client_manage(Window window) place_client(self, &x, &y); + /* make sure the window is visible. */ + client_find_onscreen(self, &x, &y, + self->frame->area.width, + self->frame->area.height, + /* non-normal clients has less rules, and + windows that are being restored from a + session do also. we can assume you want + it back where you saved it. Clients saying + they placed themselves are subjected to + harder rules, ones that are placed by + place.c or by the user are allowed partially + off-screen and on xinerama divides (ie, + it is up to the placement routines to avoid + the xinerama divides) */ + ((self->positioned & PPosition) && + !(self->positioned & USPosition)) && + client_normal(self) && + !self->session); if (x != ox || y != oy) client_move(self, x, y); } @@ -534,7 +552,7 @@ static void client_restore_session_state(ObClient *self) self->session = it->data; RECT_SET_POINT(self->area, self->session->x, self->session->y); - self->positioned = TRUE; + self->positioned = PPosition; if (self->session->w > 0) self->area.width = self->session->w; if (self->session->h > 0) @@ -603,8 +621,8 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h, /* XXX watch for xinerama dead areas */ /* This makes sure windows aren't entirely outside of the screen so you * can't see them at all */ - a = screen_area(self->desktop); if (client_normal(self)) { + a = screen_area(self->desktop); if (!self->strut.right && *x >= a->x + a->width - 1) *x = a->x + a->width - self->frame->area.width; if (!self->strut.bottom && *y >= a->y + a->height - 1) @@ -616,16 +634,16 @@ gboolean client_find_onscreen(ObClient *self, gint *x, gint *y, gint w, gint h, } /* This here doesn't let windows even a pixel outside the screen, - * not applied to all windows. Not sure if it's going to stay at all. - * I wonder if disabling this will break struts somehow? Let's find out. */ + * when called from client_manage, programs placing themselves are + * forced completely onscreen, while things like + * xterm -geometry resolution-width/2 will work fine. Trying to + * place it completely offscreen will be handled in the above code. + * Sorry for this confused comment, i am tired. */ if (rude) { /* avoid the xinerama monitor divide while we're at it, * remember to fix the placement stuff to avoid it also and * then remove this XXX */ a = screen_physical_area_monitor(client_monitor(self)); - /* this is ben's MOZILLA BITCHSLAP. "oh ya it fucking feels good. - Java can suck it too." */ - /* dont let windows map/move into the strut unless they are bigger than the available area */ if (w <= a->width) { @@ -1109,7 +1127,7 @@ void client_update_normal_hints(ObClient *self) /* normal windows can't request placement! har har if (!client_normal(self)) */ - self->positioned = !!(size.flags & (PPosition|USPosition)); + self->positioned = (size.flags & (PPosition|USPosition)); if (size.flags & PWinGravity) { self->gravity = size.win_gravity; @@ -1282,7 +1300,7 @@ void client_setup_decor_and_functions(ObClient *self) static void client_change_allowed_actions(ObClient *self) { - guint32 actions[9]; + gulong actions[9]; gint num = 0; /* desktop windows are kept on all desktops */ @@ -1697,8 +1715,8 @@ void client_update_icons(ObClient *self) static void client_change_state(ObClient *self) { - guint32 state[2]; - guint32 netstate[11]; + gulong state[2]; + gulong netstate[11]; guint num; state[0] = self->wmstate; @@ -1786,9 +1804,8 @@ static ObStackingLayer calc_layer(ObClient *self) else if (self->type == OB_CLIENT_TYPE_DESKTOP) l = OB_STACKING_LAYER_DESKTOP; else if (self->type == OB_CLIENT_TYPE_DOCK) { - if (self->above) l = OB_STACKING_LAYER_DOCK_ABOVE; - else if (self->below) l = OB_STACKING_LAYER_DOCK_BELOW; - else l = OB_STACKING_LAYER_DOCK_NORMAL; + if (self->below) l = OB_STACKING_LAYER_NORMAL; + else l = OB_STACKING_LAYER_ABOVE; } else if (self->above) l = OB_STACKING_LAYER_ABOVE; else if (self->below) l = OB_STACKING_LAYER_BELOW; @@ -2780,6 +2797,9 @@ void client_unfocus(ObClient *self) void client_activate(ObClient *self, gboolean here) { + /* This check is for the client_list_menu trying to activate + * a closed client. */ + if (!g_list_find(client_list, self)) return; if (client_normal(self) && screen_showing_desktop) screen_show_desktop(FALSE); if (self->iconic) @@ -3000,6 +3020,13 @@ void client_set_undecorated(ObClient *self, gboolean undecorated) if (self->undecorated != undecorated) { self->undecorated = undecorated; client_setup_decor_and_functions(self); + /* Make sure the client knows it might have moved. Maybe there is a + * better way of doing this so only one client_configure is sent, but + * since 125 of these are sent per second when moving the window (with + * user = FALSE) i doubt it matters much. + */ + client_configure(self, OB_CORNER_TOPLEFT, self->area.x, self->area.y, + self->area.width, self->area.height, TRUE, TRUE); client_change_state(self); /* reflect this in the state hints */ } }