X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=70873a4377a889dc4b6cd7b701cf08f03f28a489;hb=950516124f49000bd8df0481df0c54a14a05b7f9;hp=697b6d8a7d86d4a2bf2c287cea2f4d8de48b66f5;hpb=eb1fb5580e6a4c3620dfefdfd5704f9927f82ab1;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 697b6d8a..70873a43 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -300,7 +300,7 @@ void client_manage(Window window) dispatch_client(Event_Client_New, self, 0, 0); /* make sure the window is visible */ - client_move_onscreen(self); + client_move_onscreen(self, TRUE); screen_update_areas(); @@ -425,8 +425,8 @@ void client_unmanage(ObClient *self) if (ob_state() != OB_STATE_EXITING) { /* these values should not be persisted across a window unmapping/mapping */ - prop_erase(self->window, prop_atoms.net_wm_desktop); - prop_erase(self->window, prop_atoms.net_wm_state); + PROP_ERASE(self->window, net_wm_desktop); + PROP_ERASE(self->window, net_wm_state); } else { /* if we're left in an iconic state, the client wont be mapped. this is bad, since we will no longer be managing the window on restart */ @@ -454,27 +454,61 @@ void client_unmanage(ObClient *self) client_set_list(); } -void client_move_onscreen(ObClient *self) +void client_move_onscreen(ObClient *self, gboolean rude) +{ + int x = self->area.x; + int y = self->area.y; + if (client_find_onscreen(self, &x, &y, + self->area.width, self->area.height, rude)) { + client_configure(self, OB_CORNER_TOPLEFT, x, y, + self->area.width, self->area.height, + TRUE, TRUE); + } +} + +gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h, + gboolean rude) { Rect *a; - int x = self->frame->area.x, y = self->frame->area.y; + int ox = *x, oy = *y; + + frame_client_gravity(self->frame, x, y); /* get where the frame + would be */ /* XXX watch for xinerama dead areas */ + a = screen_area(self->desktop); - if (x >= a->x + a->width - 1) - x = a->x + a->width - self->frame->area.width; - if (y >= a->y + a->height - 1) - y = a->y + a->height - self->frame->area.height; - if (x + self->frame->area.width - 1 < a->x) - x = a->x; - if (y + self->frame->area.height - 1< a->y) - y = a->y; - - frame_frame_gravity(self->frame, &x, &y); /* get where the client - should be */ - client_configure(self, OB_CORNER_TOPLEFT, x, y, - self->area.width, self->area.height, - TRUE, TRUE); + if (*x >= a->x + a->width - 1) + *x = a->x + a->width - self->frame->area.width; + if (*y >= a->y + a->height - 1) + *y = a->y + a->height - self->frame->area.height; + if (*x + self->frame->area.width - 1 < a->x) + *x = a->x; + if (*y + self->frame->area.height - 1 < a->y) + *y = a->y; + + if (rude) { + /* this is my 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) { + if (*x < a->x) *x = a->x; + if (*x + w > a->x + a->width) + *x = a->x + a->width - w; + } + if (h <= a->height) { + if (*y < a->y) *y = a->y; + if (*y + h > a->y + a->height) + *y = a->y + a->height - h; + } + } + + frame_frame_gravity(self->frame, x, y); /* get where the client + should be */ + + return ox != *x || oy != *y; } static void client_toggle_border(ObClient *self, gboolean show) @@ -891,22 +925,7 @@ void client_update_normal_hints(ObClient *self) /* get the hints from the window */ if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) { - if (size.flags & (PPosition|USPosition)) { - Rect *a; - - /* this is my MOZILLA BITCHSLAP. oh ya it fucking feels good. - Java can suck it too. */ - - /* dont let windows map above/left into the strut unless they - are bigger than the available area */ - a = screen_area(self->desktop); - if (self->area.width <= a->width && self->area.x < a->x) - self->area.x = a->x; - if (self->area.height <= a->height && self->area.y < a->y) - self->area.y = a->y; - - self->positioned = TRUE; - } + self->positioned = !!(size.flags & (PPosition|USPosition)); if (size.flags & PWinGravity) { self->gravity = size.win_gravity;