X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=c8d87ab4516fbe5ae8ffeabb48def3e4f9bbce92;hb=1aa0bc66eb45ba466d1d071d0e6c13631331e091;hp=878654628ee583f911485a6411b9a1f40efd6f68;hpb=4d82dd3017655aef64893897bc12064e5c51469d;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 87865462..c8d87ab4 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -249,10 +249,6 @@ void client_manage(Window window) grab_server(FALSE); - /* add to client list/map */ - client_list = g_list_append(client_list, self); - g_hash_table_insert(window_map, &self->window, self); - /* update the focus lists */ focus_order_add_new(self); @@ -300,8 +296,7 @@ void client_manage(Window window) dispatch_client(Event_Client_New, self, 0, 0); /* make sure the window is visible */ - if (client_normal(self)) - client_move_onscreen(self, TRUE); + client_move_onscreen(self, TRUE); screen_update_areas(); @@ -324,6 +319,10 @@ void client_manage(Window window) dispatch_client(Event_Client_Mapped, self, 0, 0); + /* add to client list/map */ + client_list = g_list_append(client_list, self); + g_hash_table_insert(window_map, &self->window, self); + ob_debug("Managed window 0x%lx (%s)\n", window, self->class); } @@ -428,6 +427,7 @@ void client_unmanage(ObClient *self) unmapping/mapping */ PROP_ERASE(self->window, net_wm_desktop); PROP_ERASE(self->window, net_wm_state); + PROP_ERASE(self->window, 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 */ @@ -479,13 +479,13 @@ gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h, /* XXX watch for xinerama dead areas */ a = screen_area(self->desktop); - if (*x >= a->x + a->width - 1) + if (!self->strut.right && *x >= a->x + a->width - 1) *x = a->x + a->width - self->frame->area.width; - if (*y >= a->y + a->height - 1) + if (!self->strut.bottom && *y >= a->y + a->height - 1) *y = a->y + a->height - self->frame->area.height; - if (*x + self->frame->area.width - 1 < a->x) + if (!self->strut.left && *x + self->frame->area.width - 1 < a->x) *x = a->x; - if (*y + self->frame->area.height - 1 < a->y) + if (!self->strut.top && *y + self->frame->area.height - 1 < a->y) *y = a->y; if (rude) { @@ -495,13 +495,13 @@ gboolean client_find_onscreen(ObClient *self, int *x, int *y, int w, int h, /* 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) + if (!self->strut.left && *x < a->x) *x = a->x; + if (!self->strut.right && *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) + if (!self->strut.top && *y < a->y) *y = a->y; + if (!self->strut.bottom && *y + h > a->y + a->height) *y = a->y + a->height - h; } } @@ -1347,11 +1347,8 @@ void client_update_strut(ObClient *self) if (!PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { STRUT_SET(self->strut, 0, 0, 0, 0); } else { - if (num == 4) { - g_message("new strut: %d %d %d %d", - data[0], data[2], data[1], data[3]); + if (num == 4) STRUT_SET(self->strut, data[0], data[2], data[1], data[3]); - } else STRUT_SET(self->strut, 0, 0, 0, 0); g_free(data); @@ -1657,9 +1654,10 @@ static void client_apply_startup_state(ObClient *self) */ } -void client_configure(ObClient *self, ObCorner anchor, - int x, int y, int w, int h, - gboolean user, gboolean final) +void client_configure_full(ObClient *self, ObCorner anchor, + int x, int y, int w, int h, + gboolean user, gboolean final, + gboolean force_reply) { gboolean moved = FALSE, resized = FALSE; @@ -1851,20 +1849,19 @@ void client_configure(ObClient *self, ObCorner anchor, if (moved || resized) frame_adjust_area(self->frame, moved, resized); - /* If you send this and the client hasn't changed you end up with buggy - clients (emacs) freaking out, cuz they send back a configure every - time they receive this event, which resends them this event... etc. - */ - if ((!user && moved) || (user && final)) { + if (force_reply || (!resized && ((!user && moved) || (user && final)))) + { XEvent event; event.type = ConfigureNotify; event.xconfigure.display = ob_display; event.xconfigure.event = self->window; event.xconfigure.window = self->window; - + /* root window real coords */ - event.xconfigure.x = self->frame->area.x + self->frame->size.left; - event.xconfigure.y = self->frame->area.y + self->frame->size.top; + event.xconfigure.x = self->frame->area.x + self->frame->size.left - + self->border_width; + event.xconfigure.y = self->frame->area.y + self->frame->size.top - + self->border_width; event.xconfigure.width = w; event.xconfigure.height = h;