X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=0dd122148b948caf1b0305a99c6af0283fe9a463;hb=ed4d0ca31a9c1c6c815cb87a058bb1d36a0888c1;hp=cfe2958be32b916021d987efc08b58e6dd27fcad;hpb=619eeaa962e8718901cfc9eabe56e503ba40cd90;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index cfe2958b..0dd12214 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -407,9 +407,9 @@ void client_manage(Window window) do this after adjusting the frame. otherwise it gets all weird and clients don't work right */ - client_configure_full(self, self->area.x, self->area.y, - self->area.width, self->area.height, - FALSE, TRUE); + 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!! @@ -565,7 +565,7 @@ void client_unmanage(ObClient *self) /* ignore enter events from the unmap so it doesnt mess with the focus */ - event_ignore_queued_enters(); + event_ignore_all_queued_enters(); mouse_grab_for_client(self, FALSE); @@ -1585,7 +1585,8 @@ void client_setup_decor_and_functions(ObClient *self) OB_CLIENT_FUNC_SHADE | OB_CLIENT_FUNC_CLOSE | OB_CLIENT_FUNC_BELOW | - OB_CLIENT_FUNC_ABOVE); + OB_CLIENT_FUNC_ABOVE | + OB_CLIENT_FUNC_UNDECORATE); if (!(self->min_size.width < self->max_size.width || self->min_size.height < self->max_size.height)) @@ -1684,6 +1685,11 @@ void client_setup_decor_and_functions(ObClient *self) if (self->max_vert && self->max_horz) 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 */ + if (self->decorations == 0) + self->functions &= ~OB_CLIENT_FUNC_UNDECORATE; + /* finally, the user can have requested no decorations, which overrides everything (but doesnt give it a border if it doesnt have one) */ if (self->undecorated) { @@ -1715,7 +1721,7 @@ void client_setup_decor_and_functions(ObClient *self) static void client_change_allowed_actions(ObClient *self) { - gulong actions[11]; + gulong actions[12]; gint num = 0; /* desktop windows are kept on all desktops */ @@ -1742,6 +1748,8 @@ static void client_change_allowed_actions(ObClient *self) actions[num++] = prop_atoms.net_wm_action_above; if (self->functions & OB_CLIENT_FUNC_BELOW) actions[num++] = prop_atoms.net_wm_action_below; + if (self->functions & OB_CLIENT_FUNC_UNDECORATE) + actions[num++] = prop_atoms.ob_wm_action_undecorate; PROP_SETA32(self->window, net_wm_allowed_actions, atom, actions, num); @@ -2704,12 +2712,13 @@ 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) +void client_configure(ObClient *self, gint x, gint y, gint w, gint h, + gboolean user, gboolean final) { gint oldw, oldh; gboolean send_resize_client; gboolean moved = FALSE, resized = FALSE; + gboolean fmoved, fresized; guint fdecor = self->frame->decorations; gboolean fhorz = self->frame->max_horz; gint logicalw, logicalh; @@ -2745,10 +2754,12 @@ void client_configure_full(ObClient *self, gint x, gint y, gint w, gint h, } /* find the frame's dimensions and move/resize it */ + fmoved = moved; + fresized = resized; if (self->decorations != fdecor || self->max_horz != fhorz) - moved = resized = TRUE; - if (moved || resized) - frame_adjust_area(self->frame, moved, resized, FALSE); + fmoved = fresized = TRUE; + if (fmoved || fresized) + frame_adjust_area(self->frame, fmoved, fresized, FALSE); if ((!user || (user && final)) && !resized) { @@ -3269,10 +3280,6 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) } } - /* Grab pointer across these, so it is the same as actions. Enter events - won't be generated by the windows moving around */ - grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); - if (max_horz != self->max_horz || max_vert != self->max_vert) { if (max_horz != self->max_horz && max_vert != self->max_vert) { /* toggling both */ @@ -3304,19 +3311,18 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) client_calc_layer(self); } - /* These things below can change focus so we can't grab pointer for them */ - ungrab_pointer(); - if (modal != self->modal) { self->modal = modal; /* when a window changes modality, then its stacking order with its transients needs to change */ stacking_raise(CLIENT_AS_WINDOW(self)); + /* it also may get focused. if something is focused that shouldn't be focused anymore, then move the focus */ if (focus_client && client_focus_target(focus_client) != focus_client) client_focus(focus_client); } + if (iconic != self->iconic) client_iconify(self, iconic, FALSE, FALSE); @@ -3573,16 +3579,13 @@ void client_set_layer(ObClient *self, gint layer) void client_set_undecorated(ObClient *self, gboolean undecorated) { - if (self->undecorated != undecorated) { + if (self->undecorated != undecorated && + /* don't let it undecorate if the function is missing, but let + it redecorate */ + (self->functions & OB_CLIENT_FUNC_UNDECORATE || !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, self->area.x, self->area.y, - self->area.width, self->area.height, TRUE, TRUE); client_change_state(self); /* reflect this in the state hints */ } }