// Make this caption widget active.
	internal void MakeActive()
			{
				// If we have a passive grab active, then remove it.
				if((flags & CaptionFlags.Grabbed) != 0)
				{
					try
					{
						IntPtr display = dpy.Lock();
						Xlib.XUngrabButton
							(display, 0 /* AnyButton */,
							 (1 << 15) /* AnyModifier */,
							 GetWidgetHandle());

						// We might have a frozen mouse pointer, so allow
						// events to proceed just in case.
						Xlib.XAllowEvents
							(display, 2 /* ReplayPointer */,
							 dpy.knownEventTime);
					}
					finally
					{
						dpy.Unlock();
					}
					flags &= ~CaptionFlags.Grabbed;
				}

				// Change the visual aspect of this window to active.
				flags |= CaptionFlags.Active;
				if(gradient != null)
				{
					gradient.Dispose();
					gradient = null;
				}
				Repaint();
			}
	// Paint this widget in response to an "Expose" event.
	protected override void OnPaint(Graphics graphics)
			{
				// Draw the thick 3D border around the outside first.
				graphics.DrawEffect(0, 0, width, height, Effect.Raised);

				// Get the rectangle containing the caption area.
				Rectangle rect = new Rectangle
					(FrameBorderSize, FrameBorderSize,
					 width - FrameBorderSize * 2,
					 captionHeight - FrameBorderSize);

				// If the rectangle does not overlap the expose region,
				// then there is no point drawing the main caption area.
				if(!graphics.ExposeRegion.Overlaps(rect))
				{
					return;
				}

				// Get the colors to use for the foreground and background.
				Color foreground, background, endBackground;
				if((flags & CaptionFlags.Active) != 0)
				{
					foreground = new Color(StandardColor.HighlightForeground);
					background = new Color(StandardColor.HighlightBackground);
					endBackground =
						new Color(StandardColor.HighlightEndBackground);
				}
				else
				{
					foreground = new Color(StandardColor.Background);
					background = new Color(StandardColor.BottomShadow);
					endBackground = new Color(StandardColor.EndBackground);
				}

				// Create a gradient for the title bar, if necessary.
				if(gradient != null &&
				   (gradient.Width != rect.width ||
				    gradient.Height != rect.height))
				{
					// The size has changed and we need a new gradient.
					gradient.Dispose();
					gradient = null;
				}
				if(gradient == null && screen.DefaultDepth >= 15)
				{
					DotGNU.Images.Image image = CreateGradient
						(rect.width, rect.height, background, endBackground);
					gradient = new Xsharp.Image(screen, image.GetFrame(0));
					image.Dispose();
				}

				// Clear the caption background.
				if(gradient == null)
				{
					graphics.Foreground = background;
					graphics.SetFillSolid();
					graphics.FillRectangle(rect);
				}
				else
				{
					graphics.SetFillTiled(gradient.Pixmap, rect.x, rect.y);
					graphics.FillRectangle(rect);
					graphics.SetFillSolid();
				}

				// Draw the caption buttons and then subtract that
				// region off the caption rectangle so we don't get
				// bleed through when we draw the caption text.
				rect.width -= DrawCaptionButtons
					(graphics, rect, flags, (CaptionFlags)(~0));

				// Bail out if the rectangle is too small for the text.
				if(rect.width <= 2)
				{
					return;
				}

				// Position the caption text.
				Font font = GetCaptionFont();
				FontExtents extents = font.GetFontExtents(graphics);
				int textY = (rect.height - extents.Ascent) / 2;
				textY += rect.y + extents.Ascent;

				// Draw the caption text, clipped to the caption area
				// so that it won't overwrite the buttons on the right.
				using(Region region = new Region(graphics.ExposeRegion))
				{
					region.Intersect(rect);
					graphics.SetClipRegion(region);
					graphics.Foreground = foreground;
					graphics.DrawString(rect.x + 2, textY, child.Name, font);
				}
			}
	// Make this caption widget inactive.
	internal void MakeInactive()
			{
				// Add a passive grab so that we can intercept button
				// press events before the child window gets them
				// and cause the window to be raised first.
				if((flags & CaptionFlags.Grabbed) == 0)
				{
					try
					{
						IntPtr display = dpy.Lock();
						Xlib.XGrabButton
							(display, 0 /* AnyButton */,
							 (1 << 15) /* AnyModifier */,
							 GetWidgetHandle(), XBool.False,
							 (uint)(EventMask.ButtonPressMask),
							 0 /* GrabModeSync */, 1 /* GrabModeAsync */,
							 XWindow.Zero, XCursor.Zero);
					}
					finally
					{
						dpy.Unlock();
					}
					flags |= CaptionFlags.Grabbed;
				}

				// Change the visual aspect of this window to inactive.
				flags &= ~CaptionFlags.Active;
				if(gradient != null)
				{
					gradient.Dispose();
					gradient = null;
				}
				Repaint();
			}