metacity r3596 - in trunk: . src/ui



Author: tthurman
Date: Mon Feb 25 15:39:49 2008
New Revision: 3596
URL: http://svn.gnome.org/viewvc/metacity?rev=3596&view=rev

Log:
2008-02-25  Thomas Wood  <thos gnome org>

        * src/ui/preview-widget.[ch] (meta_preview_get_clip_region):
	allow users of the preview widget to get a mask for windows
	in the correct shape for the current theme.



Modified:
   trunk/ChangeLog
   trunk/src/ui/preview-widget.c
   trunk/src/ui/preview-widget.h

Modified: trunk/src/ui/preview-widget.c
==============================================================================
--- trunk/src/ui/preview-widget.c	(original)
+++ trunk/src/ui/preview-widget.c	Mon Feb 25 15:39:49 2008
@@ -460,3 +460,112 @@
   
   return default_icon;
 }
+
+GdkRegion *
+meta_preview_get_clip_region (MetaPreview *preview, gint new_window_width, gint new_window_height)
+{
+  GdkRectangle xrect;
+  GdkRegion *corners_xregion, *window_xregion;
+  gint flags;
+  MetaFrameLayout *fgeom;
+  MetaFrameStyle *frame_style;
+
+  g_return_if_fail (META_IS_PREVIEW (preview));
+
+  flags = (META_PREVIEW (preview)->flags);
+
+  frame_style = meta_theme_get_frame_style (preview->theme,
+      META_FRAME_TYPE_NORMAL, flags);
+
+  fgeom = frame_style->layout;
+
+  corners_xregion = gdk_region_new ();
+
+  if (fgeom->top_left_corner_rounded_radius != 0)
+    {
+      const int corner = fgeom->top_left_corner_rounded_radius;
+      const float radius = sqrt(corner) + corner;
+      int i;
+
+      for (i=0; i<corner; i++)
+        {
+
+          const int width = floor(0.5 + radius - sqrt(radius*radius - (radius-(i+0.5))*(radius-(i+0.5))));
+          xrect.x = 0;
+          xrect.y = i;
+          xrect.width = width;
+          xrect.height = 1;
+
+          gdk_region_union_with_rect (corners_xregion, &xrect);
+        }
+    }
+
+  if (fgeom->top_right_corner_rounded_radius != 0)
+    {
+      const int corner = fgeom->top_right_corner_rounded_radius;
+      const float radius = sqrt(corner) + corner;
+      int i;
+
+      for (i=0; i<corner; i++)
+        {
+          const int width = floor(0.5 + radius - sqrt(radius*radius - (radius-(i+0.5))*(radius-(i+0.5))));
+          xrect.x = new_window_width - width;
+          xrect.y = i;
+          xrect.width = width;
+          xrect.height = 1;
+
+          gdk_region_union_with_rect (corners_xregion, &xrect);
+        }
+    }
+
+  if (fgeom->bottom_left_corner_rounded_radius != 0)
+    {
+      const int corner = fgeom->bottom_left_corner_rounded_radius;
+      const float radius = sqrt(corner) + corner;
+      int i;
+
+      for (i=0; i<corner; i++)
+        {
+          const int width = floor(0.5 + radius - sqrt(radius*radius - (radius-(i+0.5))*(radius-(i+0.5))));
+          xrect.x = 0;
+          xrect.y = new_window_height - i - 1;
+          xrect.width = width;
+          xrect.height = 1;
+
+          gdk_region_union_with_rect (corners_xregion, &xrect);
+        }
+    }
+
+  if (fgeom->bottom_right_corner_rounded_radius != 0)
+    {
+      const int corner = fgeom->bottom_right_corner_rounded_radius;
+      const float radius = sqrt(corner) + corner;
+      int i;
+
+      for (i=0; i<corner; i++)
+        {
+          const int width = floor(0.5 + radius - sqrt(radius*radius - (radius-(i+0.5))*(radius-(i+0.5))));
+          xrect.x = new_window_width - width;
+          xrect.y = new_window_height - i - 1;
+          xrect.width = width;
+          xrect.height = 1;
+
+          gdk_region_union_with_rect (corners_xregion, &xrect);
+        }
+    }
+
+  window_xregion = gdk_region_new ();
+
+  xrect.x = 0;
+  xrect.y = 0;
+  xrect.width = new_window_width;
+  xrect.height = new_window_height;
+
+  gdk_region_union_with_rect (window_xregion, &xrect);
+  gdk_region_subtract (window_xregion, corners_xregion);
+  gdk_region_destroy (corners_xregion);
+
+  return window_xregion;
+}
+
+

Modified: trunk/src/ui/preview-widget.h
==============================================================================
--- trunk/src/ui/preview-widget.h	(original)
+++ trunk/src/ui/preview-widget.h	Mon Feb 25 15:39:49 2008
@@ -77,6 +77,9 @@
 void meta_preview_set_button_layout (MetaPreview            *preview,
                                      const MetaButtonLayout *button_layout);
 
+GdkRegion * meta_preview_get_clip_region (MetaPreview *preview,
+                                          gint new_window_width,
+                                          gint new_window_height);
 
 GdkPixbuf* meta_preview_get_icon (void);
 GdkPixbuf* meta_preview_get_mini_icon (void);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]