X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=191fa9943331ac148f61659861e090f9272f77d1;hb=a4f023cf3a085d414a03e2d074e6eaa5258e4391;hp=1219f15d737cd4e5a923ea465fe2ce4fd60c19e9;hpb=02c15aca65f0e5eb7b82ed3176ab492fe19e6eff;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index 1219f15d..191fa994 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -233,8 +233,10 @@ void client_manage(Window window) self = g_new(ObClient, 1); self->obwin.type = Window_Client; self->window = window; + client_get_all(self); client_restore_session_state(self); + client_change_state(self); /* remove the client's border (and adjust re gravity) */ @@ -318,15 +320,15 @@ void client_manage(Window window) if (screen_showing_desktop) screen_show_desktop(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 list hints */ client_set_list(); 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); } @@ -463,21 +465,17 @@ static void client_restore_session_state(ObClient *self) { ObSessionState *s; - g_message("looking for %s", self->name); - s = session_state_find(self); - g_message("returned %p %d", s, self->positioned); if (!(s)) return; - g_message("restoring state for %s", s->name); - - g_message("%d %d %d %d", s->x, s->y, s->w, s->h); RECT_SET(self->area, s->x, s->y, s->w, s->h); - XResizeWindow(ob_display, self->window, s->w, s->h); self->positioned = TRUE; - g_message("desktop %d", s->desktop); + XResizeWindow(ob_display, self->window, s->w, s->h); + self->desktop = s->desktop == DESKTOP_ALL ? s->desktop : MIN(screen_num_desktops - 1, s->desktop); + PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); + self->shaded = s->shaded; self->iconic = s->iconic; self->skip_pager = s->skip_pager; @@ -496,7 +494,8 @@ 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)) { + self->frame->area.width, + self->frame->area.height, rude)) { client_configure(self, OB_CORNER_TOPLEFT, x, y, self->area.width, self->area.height, TRUE, TRUE); @@ -705,7 +704,6 @@ static void client_get_desktop(ObClient *self) if (!trdesk) /* defaults to the current desktop */ self->desktop = screen_desktop; - } if (self->desktop != d) { /* set the desktop hint, to make sure that it always exists */ @@ -960,10 +958,7 @@ void client_update_normal_hints(ObClient *self) /* get the hints from the window */ if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) { - /* don't let apps tell me where to put transient windows, but only if - they have a valid parent */ - self->positioned = !!(size.flags & (PPosition|USPosition)) && - !self->transient_for; + self->positioned = !!(size.flags & (PPosition|USPosition)); if (size.flags & PWinGravity) { self->gravity = size.win_gravity; @@ -1119,13 +1114,8 @@ void client_setup_decor_and_functions(ObClient *self) client_change_allowed_actions(self); if (self->frame) { - /* this makes sure that these windows appear on all desktops */ - if (self->type == OB_CLIENT_TYPE_DESKTOP && - self->desktop != DESKTOP_ALL) - client_set_desktop(self, DESKTOP_ALL, FALSE); - - /* adjust the client's decorations, etc. */ - client_reconfigure(self); + /* adjust the client's decorations, etc. */ + client_reconfigure(self); } else { /* this makes sure that these windows appear on all desktops */ if (self->type == OB_CLIENT_TYPE_DESKTOP && @@ -1248,9 +1238,6 @@ void client_update_wmhints(ObClient *self) } } - /* the WM_HINTS can contain an icon */ - client_update_icons(self); - /* because the self->transient flag wont change from this call, we don't need to update the window's type and such, only its transient_for, and the transients lists of other windows in @@ -1258,6 +1245,9 @@ void client_update_wmhints(ObClient *self) client_update_transient_for(self); } + /* the WM_HINTS can contain an icon */ + client_update_icons(self); + XFree(hints); } @@ -1380,17 +1370,35 @@ void client_update_strut(ObClient *self) { guint num; guint32 *data; + gboolean got = FALSE; + + if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal, + &data, &num)) { + if (num == 12) { + got = TRUE; + STRUT_PARTIAL_SET(self->strut, + data[0], data[2], data[1], data[3], + data[4], data[5], data[8], data[9], + data[6], data[7], data[10], data[11]); + } + g_free(data); + } - if (!PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { - STRUT_SET(self->strut, 0, 0, 0, 0); - } else { - 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); + if (!got && + PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) { + if (num == 4) { + got = TRUE; + STRUT_PARTIAL_SET(self->strut, + data[0], data[2], data[1], data[3], + 0, 0, 0, 0, 0, 0, 0, 0); + } + g_free(data); } + if (!got) + STRUT_PARTIAL_SET(self->strut, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); + /* updating here is pointless while we're being mapped cuz we're not in the client list yet */ if (self->frame) @@ -1697,6 +1705,12 @@ void client_configure_full(ObClient *self, ObCorner anchor, gboolean force_reply) { gboolean moved = FALSE, resized = FALSE; + gint fdecor = self->frame->decorations; + + /* make the frame recalculate its dimentions n shit without changing + anything visible for real, this way the constraints below can work with + the updated frame dimensions. */ + frame_adjust_area(self->frame, TRUE, TRUE, TRUE); /* gets the frame's position */ frame_client_gravity(self->frame, &x, &y); @@ -1743,8 +1757,8 @@ void client_configure_full(ObClient *self, ObCorner anchor, /* set the size and position if maximized */ if (self->max_horz) { - x = a->x - self->frame->size.left; - w = a->width; + x = a->x; + w = a->width - self->frame->size.left - self->frame->size.right; } if (self->max_vert) { y = a->y; @@ -1875,18 +1889,18 @@ void client_configure_full(ObClient *self, ObCorner anchor, /* for app-requested resizes, always resize if 'resized' is true. for user-requested ones, only resize if final is true, or when - resizing in opaque mode */ + resizing in redraw mode */ if ((!user && resized) || - (user && (final || (resized && config_opaque_resize)))) + (user && (final || (resized && config_redraw_resize)))) XResizeWindow(ob_display, self->window, w, h); /* move/resize the frame to match the request */ if (self->frame) { - if (self->decorations != self->frame->decorations) + if (self->decorations != fdecor) moved = resized = TRUE; if (moved || resized) - frame_adjust_area(self->frame, moved, resized); + frame_adjust_area(self->frame, moved, resized, FALSE); if (!resized && (force_reply || ((!user && moved) || (user && final)))) { @@ -2156,7 +2170,7 @@ void client_shade(ObClient *self, gboolean shade) self->shaded = shade; client_change_state(self); /* resize the frame to just the titlebar */ - frame_adjust_area(self->frame, FALSE, FALSE); + frame_adjust_area(self->frame, FALSE, FALSE, FALSE); } void client_close(ObClient *self)