diff --git a/face-frame.patch b/face-frame.patch new file mode 100644 index 0000000..580769a --- /dev/null +++ b/face-frame.patch @@ -0,0 +1,162 @@ +Index: gnome-screensaver/src/gs-lock-plug.c +=================================================================== +--- gnome-screensaver/src/gs-lock-plug.c (revision 1445) ++++ gnome-screensaver/src/gs-lock-plug.c (working copy) +@@ -1147,6 +1147,148 @@ + return TRUE; + } + ++static cairo_surface_t * ++surface_from_pixbuf (GdkPixbuf *pixbuf) ++{ ++ cairo_surface_t *surface; ++ cairo_t *cr; ++ ++ surface = cairo_image_surface_create (gdk_pixbuf_get_has_alpha (pixbuf) ? ++ CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, ++ gdk_pixbuf_get_width (pixbuf), ++ gdk_pixbuf_get_height (pixbuf)); ++ cr = cairo_create (surface); ++ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); ++ cairo_paint (cr); ++ cairo_destroy (cr); ++ ++ return surface; ++} ++ ++static void ++curved_rectangle (cairo_t *cr, ++ double x0, ++ double y0, ++ double width, ++ double height, ++ double radius) ++{ ++ double x1; ++ double y1; ++ ++ x1 = x0 + width; ++ y1 = y0 + height; ++ ++ if (!width || !height) { ++ return; ++ } ++ ++ if (width / 2 < radius) { ++ if (height / 2 < radius) { ++ cairo_move_to (cr, x0, (y0 + y1) / 2); ++ cairo_curve_to (cr, x0 ,y0, x0, y0, (x0 + x1) / 2, y0); ++ cairo_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1) / 2); ++ cairo_curve_to (cr, x1, y1, x1, y1, (x1 + x0) / 2, y1); ++ cairo_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1) / 2); ++ } else { ++ cairo_move_to (cr, x0, y0 + radius); ++ cairo_curve_to (cr, x0, y0, x0, y0, (x0 + x1) / 2, y0); ++ cairo_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius); ++ cairo_line_to (cr, x1, y1 - radius); ++ cairo_curve_to (cr, x1, y1, x1, y1, (x1 + x0) / 2, y1); ++ cairo_curve_to (cr, x0, y1, x0, y1, x0, y1 - radius); ++ } ++ } else { ++ if (height / 2 < radius) { ++ cairo_move_to (cr, x0, (y0 + y1) / 2); ++ cairo_curve_to (cr, x0, y0, x0 , y0, x0 + radius, y0); ++ cairo_line_to (cr, x1 - radius, y0); ++ cairo_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1) / 2); ++ cairo_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1); ++ cairo_line_to (cr, x0 + radius, y1); ++ cairo_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1) / 2); ++ } else { ++ cairo_move_to (cr, x0, y0 + radius); ++ cairo_curve_to (cr, x0 , y0, x0 , y0, x0 + radius, y0); ++ cairo_line_to (cr, x1 - radius, y0); ++ cairo_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius); ++ cairo_line_to (cr, x1, y1 - radius); ++ cairo_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1); ++ cairo_line_to (cr, x0 + radius, y1); ++ cairo_curve_to (cr, x0, y1, x0, y1, x0, y1 - radius); ++ } ++ } ++ ++ cairo_close_path (cr); ++} ++ ++static void ++image_set_from_pixbuf (GtkImage *image, ++ GdkPixbuf *source) ++{ ++ cairo_t *cr; ++ cairo_t *cr_mask; ++ cairo_surface_t *surface; ++ GdkPixmap *pixmap; ++ GdkPixmap *bitmask; ++ int w; ++ int h; ++ int depth; ++ int frame_width; ++ double radius; ++ ++ frame_width = 5; ++ ++ w = gdk_pixbuf_get_width (source) + frame_width * 2; ++ h = gdk_pixbuf_get_height (source) + frame_width * 2; ++ depth = gdk_visual_get_system ()->depth; ++ ++ radius = w / 3.0; ++ ++ gs_debug ("creating pixmap w:%d h:%d d:%d", w, h, depth); ++ pixmap = gdk_pixmap_new (GTK_WIDGET (image)->window, w, h, depth); ++ bitmask = gdk_pixmap_new (GTK_WIDGET (image)->window, w, h, 1); ++ ++ cr = gdk_cairo_create (pixmap); ++ cr_mask = gdk_cairo_create (bitmask); ++ ++ /* setup mask */ ++ cairo_rectangle (cr_mask, 0, 0, w, h); ++ cairo_set_operator (cr_mask, CAIRO_OPERATOR_CLEAR); ++ cairo_fill (cr_mask); ++ ++ curved_rectangle (cr_mask, 0, 0, w, h, radius); ++ cairo_set_operator (cr_mask, CAIRO_OPERATOR_OVER); ++ cairo_set_source_rgb (cr_mask, 1, 1, 1); ++ cairo_fill (cr_mask); ++ ++ /* set up image */ ++ cairo_rectangle (cr, 0, 0, w, h); ++ cairo_set_source_rgb (cr, 0.8, 0.8, 0.8); ++ cairo_fill (cr); ++ ++ curved_rectangle (cr, frame_width, frame_width, ++ w - frame_width * 2, h - frame_width * 2, ++ radius); ++ cairo_set_source_rgb (cr, 0.5, 0.5, 0.5); ++ cairo_fill_preserve (cr); ++ ++ surface = surface_from_pixbuf (source); ++ cairo_set_source_surface (cr, surface, frame_width, frame_width); ++ cairo_fill (cr); ++ ++ gtk_image_set_from_pixmap (image, pixmap, bitmask); ++ ++ cairo_surface_destroy (surface); ++ ++ gdk_pixmap_unref (bitmask); ++ gdk_pixmap_unref (pixmap); ++ ++ cairo_destroy (cr_mask); ++ cairo_destroy (cr); ++} ++ ++ + static gboolean + set_face_image (GSLockPlug *plug) + { +@@ -1176,7 +1318,7 @@ + return FALSE; + } + +- gtk_image_set_from_pixbuf (GTK_IMAGE (plug->priv->auth_face_image), pixbuf); ++ image_set_from_pixbuf (GTK_IMAGE (plug->priv->auth_face_image), pixbuf); + + g_object_unref (pixbuf); + diff --git a/gnome-screensaver.spec b/gnome-screensaver.spec index 7d9e9a8..61dcac9 100644 --- a/gnome-screensaver.spec +++ b/gnome-screensaver.spec @@ -14,7 +14,7 @@ Summary: GNOME Screensaver Name: gnome-screensaver Version: 2.23.3 -Release: 0.2008.05.14.0%{?dist} +Release: 0.2008.05.14.1%{?dist} License: GPLv2+ Group: Amusements/Graphics Source0: http://download.gnome.org/sources/gnome-screensaver/2.23/%{name}-%{version}.tar.bz2 @@ -26,6 +26,7 @@ Patch2: gnome-screensaver-2.18.0-securitytoken.patch Patch4: gnome-keyring.patch Patch7: gnome-screensaver-2.20.0-blank-by-default.patch Patch8: gnome-screensaver-2.20.0-selinux-permit.patch +Patch20: face-frame.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) URL: http://www.gnome.org @@ -80,6 +81,7 @@ simple, sane, secure defaults and be well integrated with the desktop. %patch4 -p1 -b .gnome-keyring %patch7 -p1 -b .blank-by-default %patch8 -p1 -b .selinux-permit +%patch20 -p1 -b .face-frame %build # grr, autoreconf seems to break with intltool 0.36.0, unless @@ -146,6 +148,9 @@ fi %doc %{_mandir}/man1/*.1.gz %changelog +* Fri May 16 2008 Jon McCann - 2.23.3-0.2008.05.14.1 +- Add frame to face image + * Wed May 14 2008 Jon McCann - 2.23.3-0.2008.05.14.0 - Update to snapshot