X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=24d3eb535a93ae3f3eaa428298df54585ffefa65;hb=c1d21a1a6d88189ab3c5569b2b776d846bb6c11a;hp=c6a47b0859ffee452ec7340e3ba1396088075d10;hpb=fd77a0a7b3f892925f203287b8b46c6ec9be94ea;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index c6a47b08..24d3eb53 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -190,7 +190,7 @@ ObFrame *frame_new(ObClient *client) /* make sure the size will be different the first time, so the extent hints will be set */ - STRUT_SET(self->size, -1, -1, -1, -1); + STRUT_SET(self->oldsize, -1, -1, -1, -1); set_theme_statics(self); @@ -276,9 +276,14 @@ void frame_adjust_shape_kind(ObFrame *self, int kind) { gint num; XRectangle xrect[2]; + gboolean shaped; - if (!((kind == ShapeBounding && self->client->shaped) || - (kind == ShapeInput && self->client->shaped_input))) { + shaped = (kind == ShapeBounding && self->client->shaped); +#ifdef ShapeInput + shaped |= (kind == ShapeInput && self->client->shaped_input); +#endif + + if (!shaped) { /* clear the shape on the frame window */ XShapeCombineMask(obt_display, self->window, kind, self->size.left, @@ -323,17 +328,15 @@ void frame_adjust_shape(ObFrame *self) { #ifdef SHAPE frame_adjust_shape_kind(self, ShapeBounding); +#ifdef ShapeInput frame_adjust_shape_kind(self, ShapeInput); #endif +#endif } void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized, gboolean fake) { - Strut oldsize; - - oldsize = self->size; - if (resized) { /* do this before changing the frame's status like max_horz max_vert */ frame_adjust_cursors(self); @@ -345,7 +348,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, self->shaded = self->client->shaded; if (self->decorations & OB_FRAME_DECOR_BORDER) - self->bwidth = ob_rr_theme->fbwidth; + self->bwidth = self->client->undecorated ? + ob_rr_theme->ubwidth : ob_rr_theme->fbwidth; else self->bwidth = 0; @@ -374,13 +378,22 @@ void frame_adjust_area(ObFrame *self, gboolean moved, STRUT_SET(self->size, self->cbwidth_l + (!self->max_horz ? self->bwidth : 0), - self->cbwidth_t + self->bwidth, + self->cbwidth_t + + (!self->max_horz || !self->max_vert ? self->bwidth : 0), self->cbwidth_r + (!self->max_horz ? self->bwidth : 0), self->cbwidth_b + (!self->max_horz || !self->max_vert ? self->bwidth : 0)); if (self->decorations & OB_FRAME_DECOR_TITLEBAR) self->size.top += ob_rr_theme->title_height + self->bwidth; + else if (self->max_horz && self->max_vert) { + /* A maximized and undecorated window needs a small border on the + top of the window to let the user still undecorate/unmaximize the + window via the client menu. */ + /* XXX This size should probably be a theme option. */ + self->size.top += 1; + } + if (self->decorations & OB_FRAME_DECOR_HANDLE && ob_rr_theme->handle_height > 0) { @@ -849,7 +862,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, frame_adjust_shape(self); } - if (!STRUT_EQUAL(self->size, oldsize)) { + if (!STRUT_EQUAL(self->size, self->oldsize)) { gulong vals[4]; vals[0] = self->size.left; vals[1] = self->size.right; @@ -859,6 +872,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, CARDINAL, vals, 4); OBT_PROP_SETA32(self->client->window, KDE_NET_WM_FRAME_STRUT, CARDINAL, vals, 4); + self->oldsize = self->size; } /* if this occurs while we are focus cycling, the indicator needs to @@ -956,7 +970,7 @@ void frame_adjust_state(ObFrame *self) void frame_adjust_focus(ObFrame *self, gboolean hilite) { ob_debug_type(OB_DEBUG_FOCUS, - "Frame for 0x%x has focus: %d\n", + "Frame for 0x%x has focus: %d", self->client->window, hilite); self->focused = hilite; self->need_render = TRUE; @@ -1371,18 +1385,27 @@ ObFrameContext frame_context_from_string(const gchar *name) return OB_FRAME_CONTEXT_CLOSE; else if (!g_ascii_strcasecmp("MoveResize", name)) return OB_FRAME_CONTEXT_MOVE_RESIZE; + else if (!g_ascii_strcasecmp("Dock", name)) + return OB_FRAME_CONTEXT_DOCK; + return OB_FRAME_CONTEXT_NONE; } ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) { ObFrame *self; + ObWindow *obwin; if (moveresize_in_progress) return OB_FRAME_CONTEXT_MOVE_RESIZE; if (win == obt_root(ob_screen)) - return OB_FRAME_CONTEXT_ROOT ; + return OB_FRAME_CONTEXT_ROOT; + if ((obwin = window_find(win))) { + if (WINDOW_IS_DOCK(obwin)) { + return OB_FRAME_CONTEXT_DOCK; + } + } if (client == NULL) return OB_FRAME_CONTEXT_NONE; if (win == client->window) { /* conceptually, this is the desktop, as far as users are