X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=4cfece1dd2e8996bcc83632ab195e8b70ebfab46;hb=94c95663a86b1b40463fcd1e25a9ac4bc10954c1;hp=14d2210385967b979b83a7800654f5c84d6770b6;hpb=32b64b6cf5876364c891b97bd5227cc53aeac17b;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 14d22103..4cfece1d 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -411,10 +411,11 @@ void client_manage(Window window) splash screens get "transient" set to TRUE by the place_client call */ - transient || - (!(self->positioned & USPosition) && - client_normal(self) && - !self->session)); + ob_state() == OB_STATE_RUNNING && + (transient || + (!(self->positioned & USPosition) && + client_normal(self) && + !self->session))); } /* if the window isn't user-sized, then make it fit inside @@ -426,10 +427,11 @@ void client_manage(Window window) splash screens get "transient" set to TRUE by the place_client call */ - if (transient || - (!(self->sized & USSize) && - client_normal(self) && - !self->session)) + if (ob_state() == OB_STATE_RUNNING && + (transient || + (!(self->sized & USSize) && + client_normal(self) && + !self->session))) { /* make a copy to modify */ Rect a = *screen_area_monitor(self->desktop, client_monitor(self)); @@ -629,6 +631,7 @@ void client_unmanage(ObClient *self) { guint j; GSList *it; + gulong ignore_start; ob_debug("Unmanaging window: 0x%x plate 0x%x (%s) (%s)\n", self->window, self->frame->window, @@ -640,13 +643,16 @@ void client_unmanage(ObClient *self) don't generate more events */ XSelectInput(ob_display, self->window, NoEventMask); + /* ignore enter events from the unmap so it doesnt mess with the focus */ + if (!client_focused(self) || !config_focus_under_mouse) + ignore_start = event_start_ignore_all_enters(); + frame_hide(self->frame); /* flush to send the hide to the server quickly */ XFlush(ob_display); - /* ignore enter events from the unmap so it doesnt mess with the - focus */ - event_ignore_all_queued_enters(); + if (!client_focused(self) || !config_focus_under_mouse) + event_end_ignore_all_enters(ignore_start); mouse_grab_for_client(self, FALSE); @@ -1148,6 +1154,9 @@ static void client_get_desktop(ObClient *self) for (it = self->group->members; it; it = g_slist_next(it)) { ObClient *c = it->data; + + if (c->desktop == DESKTOP_ALL) continue; + if (c != self) { if (first) { all = c->desktop; @@ -2310,7 +2319,7 @@ static void client_change_wm_state(ObClient *self) static void client_change_state(ObClient *self) { - gulong netstate[11]; + gulong netstate[12]; guint num; num = 0; @@ -2566,6 +2575,8 @@ static void client_apply_startup_state(ObClient *self, gboolean demands_attention = self->demands_attention; gboolean max_horz = self->max_horz; gboolean max_vert = self->max_vert; + Rect oldarea; + gint l; /* turn them all off in the client, so they won't affect the window being placed */ @@ -2581,10 +2592,12 @@ static void client_apply_startup_state(ObClient *self, do this before applying the states so they have the correct pre-max/pre-fullscreen values */ - client_configure(self, x, y, w, h, FALSE, TRUE); + client_try_configure(self, &x, &y, &w, &h, &l, &l, FALSE); ob_debug("placed window 0x%x at %d, %d with size %d x %d\n", self->window, self->area.x, self->area.y, self->area.width, self->area.height); + oldarea = self->area; /* save the area */ + RECT_SET(self->area, x, y, w, h); /* put where it should be for the premax stuff */ /* apply the states. these are in a carefully crafted order.. */ @@ -2606,6 +2619,12 @@ static void client_apply_startup_state(ObClient *self, else if (max_horz) client_maximize(self, TRUE, 1); + /* if the window hasn't been configured yet, then do so now */ + if (!fullscreen && !max_vert && !max_horz) { + self->area = oldarea; + client_configure(self, x, y, w, h, FALSE, TRUE); + } + /* set the desktop hint, to make sure that it always exists */ PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); @@ -2888,7 +2907,20 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, if (fmoved || fresized) frame_adjust_area(self->frame, fmoved, fresized, FALSE); - if ((!user || (user && final)) && !resized) + /* This is kinda tricky and should not be changed.. let me explain! + + When user = FALSE, then the request is coming from the application + itself, and we are more strict about when to send a synthetic + ConfigureNotify. We strictly follow the rules of the ICCCM sec 4.1.5 + in this case. + + When user = TRUE, then the request is coming from "us", like when we + maximize a window or sometihng. In this case we are more lenient. We + used to follow the same rules as above, but _Java_ Swing can't handle + this. So just to appease Swing, when user = TRUE, we always send + a synthetic ConfigureNotify to give the window its root coordinates. + */ + if ((!user && !resized) || (user && final)) { XEvent event; @@ -2931,13 +2963,6 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h, self->frame->size.left, self->frame->size.top, w, h); } - if (!resized) { - /* when the client has StaticGravity, it likes to move around. - also this correctly positions the client when it maps */ - XMoveWindow(ob_display, self->window, - self->frame->size.left, self->frame->size.top); - } - XFlush(ob_display); } @@ -3230,8 +3255,7 @@ void client_set_desktop_recursive(ObClient *self, client_set_desktop_recursive(it->data, target, donthide); } -void client_set_desktop(ObClient *self, guint target, - gboolean donthide) +void client_set_desktop(ObClient *self, guint target, gboolean donthide) { self = client_search_top_normal_parent(self); client_set_desktop_recursive(self, target, donthide); @@ -3500,10 +3524,6 @@ gboolean client_focus(ObClient *self) self = client_focus_target(self); if (!client_can_focus(self)) { - if (!self->frame->visible) { - /* update the focus lists */ - focus_order_to_top(self); - } ob_debug_type(OB_DEBUG_FOCUS, "Client %s can't be focused\n", self->title); return FALSE; @@ -3861,13 +3881,12 @@ ObClient *client_search_transient(ObClient *self, ObClient *search) } #define WANT_EDGE(cur, c) \ - if(cur == c) \ - continue; \ - if(!client_normal(cur)) \ + if (cur == c) \ continue; \ - if(screen_desktop != cur->desktop && cur->desktop != DESKTOP_ALL) \ + if (c->desktop != cur->desktop && cur->desktop != DESKTOP_ALL && \ + cur->desktop != screen_desktop) \ continue; \ - if(cur->iconic) \ + if (cur->iconic) \ continue; #define HIT_EDGE(my_edge_start, my_edge_end, his_edge_start, his_edge_end) \