In F-19 we had a long list of bugfix patches, most of these have been merged

into gnome-3.10 but not all have been merged yet, re-add the non merged ones
- Fix video recording not working
- Allow changing effects while recording
- Disallow changing camera settings while recording
- Fix cheese misbehavior when going from 0 -> 1 or 1 -> 0 camera devices
This commit is contained in:
Hans de Goede 2013-09-12 10:36:15 +02:00
parent 8961056e8d
commit 9b94ca029c
17 changed files with 1026 additions and 248 deletions

View File

@ -0,0 +1,108 @@
From d4288cd182064bca3bc3cd3d62c794737c9db426 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 7 Aug 2013 15:13:57 +0200
Subject: [PATCH 01/13] cheese: Don't allow changing the camera and/or its
resolution while recording
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-application.vala | 1 +
src/cheese-preferences.vala | 16 +++++++++++++++-
src/cheese-window.vala | 7 +++++++
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
index 4cbfa49..0f9f33d 100644
--- a/src/cheese-application.vala
+++ b/src/cheese-application.vala
@@ -160,6 +160,7 @@ public class Cheese.Application : Gtk.Application
main_window.show ();
setup_camera ();
preferences_dialog = new PreferencesDialog (camera);
+ main_window.mode_change_changed.connect (preferences_dialog.enable_camera_controls);
this.add_window (main_window);
}
}
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index e078cbb..bad3c71 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -24,6 +24,7 @@ using Gtk;
public class Cheese.PreferencesDialog : GLib.Object
{
private Cheese.Camera camera;
+ private bool camera_controls_sensitive;
private GLib.Settings settings;
@@ -56,6 +57,7 @@ public class Cheese.PreferencesDialog : GLib.Object
public PreferencesDialog (Cheese.Camera camera)
{
this.camera = camera;
+ this.camera_controls_sensitive = true;
settings = new GLib.Settings ("org.gnome.Cheese");
@@ -499,7 +501,7 @@ public class Cheese.PreferencesDialog : GLib.Object
if (camera.get_selected_device ().get_device_node () == dev.get_device_node ())
source_combo.set_active_iter (iter);
- if (camera_model.iter_n_children (null) > 1)
+ if (camera_model.iter_n_children (null) > 1 && camera_controls_sensitive)
source_combo.sensitive = true;
}
@@ -548,6 +550,18 @@ public class Cheese.PreferencesDialog : GLib.Object
}
/**
+ * Set camera controls sensitivity
+ */
+ public void enable_camera_controls (bool sensitive)
+ {
+ camera_controls_sensitive = sensitive;
+ photo_resolution_combo.sensitive = sensitive;
+ video_resolution_combo.sensitive = sensitive;
+ if (camera_model.iter_n_children (null) > 1)
+ source_combo.sensitive = sensitive;
+ }
+
+ /**
* Show the dialog.
*/
public void show ()
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index a406288..bc53b4e 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -373,6 +373,11 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
}
/**
+ * Signal raised when mode_change changes
+ */
+ public signal void mode_change_changed (bool enabled);
+
+ /**
* Make the media capture mode actions sensitive.
*/
private void enable_mode_change ()
@@ -381,6 +386,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
mode.set_enabled (true);
var effects = this.application.lookup_action ("effects") as SimpleAction;
effects.set_enabled (true);
+ mode_change_changed (true);
}
/**
@@ -392,6 +398,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
mode.set_enabled (false);
var effects = this.application.lookup_action ("effects") as SimpleAction;
effects.set_enabled (false);
+ mode_change_changed (false);
}
/**
--
1.8.3.1

View File

@ -1,126 +0,0 @@
From 486bfc9c76ec05d469ec124407cbaa026544c620 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Sun, 10 Jun 2012 14:50:54 +0200
Subject: [PATCH 1/4] cheese-thumb-view: Don't set columns to 5000 in
horizontal mode
Rather then assuming 5000 will be enough, just set the number of columns to
the number of thumbnails we have.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-window.vala | 4 ++--
src/thumbview/cheese-thumb-view.c | 21 ++++++++++++++++++++-
src/thumbview/cheese-thumb-view.h | 1 +
src/vapi/cheese-thumbview.vapi | 1 +
4 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index 26f5524..cb4eeb4 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -724,7 +724,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
if (is_wide_mode)
{
- thumb_view.set_columns (1);
+ thumb_view.set_vertical (true);
thumb_nav.set_vertical (true);
if (thumbnails_bottom.get_child () != null)
{
@@ -737,7 +737,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
}
else
{
- thumb_view.set_columns (5000);
+ thumb_view.set_vertical (false);
thumb_nav.set_vertical (false);
if (thumbnails_right.get_child () != null)
{
diff --git a/src/thumbview/cheese-thumb-view.c b/src/thumbview/cheese-thumb-view.c
index f4694f5..4ce8f56 100644
--- a/src/thumbview/cheese-thumb-view.c
+++ b/src/thumbview/cheese-thumb-view.c
@@ -51,6 +51,7 @@ typedef struct
GFileMonitor *video_file_monitor;
GnomeDesktopThumbnailFactory *factory;
gboolean multiplex_thumbnail_generator;
+ gboolean vertical;
guint n_items;
guint idle_id;
GQueue *thumbnails;
@@ -602,7 +603,10 @@ cheese_thumb_view_row_inserted_cb (GtkTreeModel *tree_model,
CheeseThumbViewPrivate *priv = CHEESE_THUMB_VIEW_GET_PRIVATE (thumb_view);
priv->n_items++;
- gtk_widget_set_size_request (GTK_WIDGET (thumb_view), -1, -1);
+ if (!priv->vertical)
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), priv->n_items);
+ else
+ gtk_widget_set_size_request (GTK_WIDGET (thumb_view), -1, -1);
}
static void
@@ -617,6 +621,8 @@ cheese_thumb_view_row_deleted_cb (GtkTreeModel *tree_model,
gtk_widget_set_size_request (GTK_WIDGET (thumb_view),
THUMB_VIEW_MINIMUM_WIDTH,
THUMB_VIEW_MINIMUM_HEIGHT);
+ else if (!priv->vertical)
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), priv->n_items);
}
static void
@@ -685,6 +691,7 @@ cheese_thumb_view_constructed (GObject *object)
THUMBNAIL_BASENAME_URL_COLUMN, GTK_SORT_ASCENDING);
cheese_thumb_view_fill (thumb_view);
+ cheese_thumb_view_set_vertical (thumb_view, FALSE);
}
GtkWidget *
@@ -697,6 +704,18 @@ cheese_thumb_view_new ()
}
void
+cheese_thumb_view_set_vertical (CheeseThumbView *thumb_view, gboolean vertical)
+{
+ CheeseThumbViewPrivate *priv = CHEESE_THUMB_VIEW_GET_PRIVATE (thumb_view);
+
+ priv->vertical = vertical;
+ if (!priv->vertical && priv->n_items)
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), priv->n_items);
+ else
+ gtk_icon_view_set_columns(GTK_ICON_VIEW (thumb_view), 1);
+}
+
+void
cheese_thumb_view_start_monitoring_photo_path (CheeseThumbView *thumb_view, const char *path_photos)
{
CheeseThumbViewPrivate *priv = CHEESE_THUMB_VIEW_GET_PRIVATE (thumb_view);
diff --git a/src/thumbview/cheese-thumb-view.h b/src/thumbview/cheese-thumb-view.h
index 140a283..b2ca2b3 100644
--- a/src/thumbview/cheese-thumb-view.h
+++ b/src/thumbview/cheese-thumb-view.h
@@ -54,6 +54,7 @@ GList *cheese_thumb_view_get_selected_images_list (CheeseThumbView *thumb_view);
char * cheese_thumb_view_get_selected_image (CheeseThumbView *thumb_view);
guint cheese_thumb_view_get_n_selected (CheeseThumbView *thumbview);
void cheese_thumb_view_remove_item (CheeseThumbView *thumb_view, GFile *file);
+void cheese_thumb_view_set_vertical (CheeseThumbView *thumb_view, gboolean vertical);
void cheese_thumb_view_start_monitoring_photo_path (CheeseThumbView *thumbview, const char *path_photos);
void cheese_thumb_view_start_monitoring_video_path (CheeseThumbView *thumbview, const char *path_videos);
diff --git a/src/vapi/cheese-thumbview.vapi b/src/vapi/cheese-thumbview.vapi
index 669b724..61b323e 100644
--- a/src/vapi/cheese-thumbview.vapi
+++ b/src/vapi/cheese-thumbview.vapi
@@ -9,6 +9,7 @@ namespace Cheese
public List<GLib.File> get_selected_images_list ();
public int get_n_selected ();
public void remove_item (GLib.File file);
+ public void set_vertical (bool vertical);
public void start_monitoring_photo_path (string path_photos);
public void start_monitoring_video_path (string path_videos);
}
--
1.7.11.4

View File

@ -0,0 +1,89 @@
From 8c401d7fe5c85e60e84d08f1562fd721bef01be0 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 09:05:19 +0200
Subject: [PATCH 02/13] cheese-window: Add cancel_running_action () method
And use it to stop recording / the photo countdown when we get an error
while either one is active.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-window.vala | 47 +++++++++++++++++++++++++++++++----------------
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index bc53b4e..675a92e 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -724,6 +724,34 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
}
/**
+ * Cancel the current action (if any)
+ */
+ private bool cancel_running_action ()
+ {
+ if ((current_countdown != null && current_countdown.running) ||
+ is_bursting || is_recording)
+ {
+ action_cancelled = true;
+ switch (current_mode)
+ {
+ case MediaMode.PHOTO:
+ current_countdown.stop ();
+ finish_countdown_callback ();
+ break;
+ case MediaMode.BURST:
+ toggle_photo_bursting (false);
+ break;
+ case MediaMode.VIDEO:
+ toggle_video_recording (false);
+ break;
+ }
+ action_cancelled = false;
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Cancel the current activity if the escape key is pressed.
*
* @param event the key event, to check which key was pressed
@@ -736,23 +764,9 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
key = Gdk.keyval_name (event.keyval);
if (strcmp (key, "Escape") == 0)
{
- if ((current_countdown != null && current_countdown.running) || is_bursting || is_recording)
+ if (cancel_running_action())
{
- action_cancelled = true;
- switch (current_mode)
- {
- case MediaMode.PHOTO:
- current_countdown.stop ();
- finish_countdown_callback ();
- break;
- case MediaMode.BURST:
- toggle_photo_bursting (false);
- break;
- case MediaMode.VIDEO:
- toggle_video_recording (false);
- break;
- }
- action_cancelled = false;
+ return false;
}
else if (is_effects_selector_active)
{
@@ -1154,6 +1168,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
*/
public void camera_state_change_null ()
{
+ cancel_running_action();
if (!error_layer.visible)
{
show_error (_("There was an error playing video from the webcam"));
--
1.8.3.1

View File

@ -1,45 +0,0 @@
From 9c2b429ec0b027657c0767103fbbfebbc8a992ed Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 22 Aug 2012 10:02:08 +0200
Subject: [PATCH 3/4] Fix cheese_camera_device_update_format_table() going
into an infinite loop
Some devices report a very small min_width / height down to reporting
0x0 as minimum resolution, which causes an infinte loop in
cheese_camera_device_update_format_table().
This patch limits the minimum resultion to 160x120, both to fix the
infinite loop issue, and to remove ridiculous resolutions such as
2x2, 5x3, 11x7, 22x15 etc. which are seen in the resolution drop down on
some devices.
For more details on the infinite loop issue, see:
https://bugzilla.redhat.com/show_bug.cgi?id=850505
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
libcheese/cheese-camera-device.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/libcheese/cheese-camera-device.c b/libcheese/cheese-camera-device.c
index 9b977a4..653cba9 100644
--- a/libcheese/cheese-camera-device.c
+++ b/libcheese/cheese-camera-device.c
@@ -296,6 +296,14 @@ cheese_camera_device_update_format_table (CheeseCameraDevice *device)
min_height = gst_value_get_int_range_min (height);
max_height = gst_value_get_int_range_max (height);
+ /* Some devices report a very small min_width / height down to reporting
+ * 0x0 as minimum resolution, which causes an infinte loop below, limit
+ * these to something reasonable. */
+ if (min_width < 160)
+ min_width = 160;
+ if (min_height < 120)
+ min_height = 120;
+
cur_width = min_width;
cur_height = min_height;
--
1.7.11.4

View File

@ -0,0 +1,87 @@
From 1537ad2673843e033035edfe144ffc78bdab5a43 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 6 Aug 2013 14:50:00 +0200
Subject: [PATCH 03/13] cheese-window: Allow changing effects while shooting /
recording a video
There is no technical reason to disable the effect selector while shooting
a video. Likewise there is no technical reason to disallow start / stop
recording / shooting, or changing mode when the effect selector is change.
Removing these unnecessary limitations simplifies the code, and allows users
to change effects while recording a video.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-application.vala | 25 +++----------------------
src/cheese-window.vala | 4 ----
2 files changed, 3 insertions(+), 26 deletions(-)
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
index 0f9f33d..9cb5ac5 100644
--- a/src/cheese-application.vala
+++ b/src/cheese-application.vala
@@ -368,17 +368,8 @@ public class Cheese.Application : Gtk.Application
switch (new_state)
{
case Gst.State.PLAYING:
- if (effects.state.get_boolean ())
- {
- mode.set_enabled (false);
- shoot.set_enabled (false);
- }
- else
- {
- mode.set_enabled (true);
- shoot.set_enabled (true);
- }
-
+ mode.set_enabled (true);
+ shoot.set_enabled (true);
effects.set_enabled (true);
main_window.camera_state_change_playing ();
@@ -491,17 +482,7 @@ public class Cheese.Application : Gtk.Application
{
return_if_fail (value != null);
- var state = value.get_boolean ();
-
- var shoot = this.lookup_action ("shoot") as SimpleAction;
- var mode = this.lookup_action ("mode") as SimpleAction;
-
- // Effects selection and shooting/mode changes are mutually exclusive.
- shoot.set_enabled (!state);
- mode.set_enabled (!state);
-
- main_window.set_effects (state);
-
+ main_window.set_effects (value.get_boolean ());
action.set_state (value);
}
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index 675a92e..07cf0f4 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -384,8 +384,6 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
{
var mode = this.application.lookup_action ("mode") as SimpleAction;
mode.set_enabled (true);
- var effects = this.application.lookup_action ("effects") as SimpleAction;
- effects.set_enabled (true);
mode_change_changed (true);
}
@@ -396,8 +394,6 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
{
var mode = this.application.lookup_action ("mode") as SimpleAction;
mode.set_enabled (false);
- var effects = this.application.lookup_action ("effects") as SimpleAction;
- effects.set_enabled (false);
mode_change_changed (false);
}
--
1.8.3.1

View File

@ -1,73 +0,0 @@
From 121fd6f5355b5e56fa21004f030fe02eb1de7ae7 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 22 Aug 2012 10:58:57 +0200
Subject: [PATCH 4/4] Ensure width is a multiple of 8, and height a multiple
of 2
We ask Gstreamer to us an YUV format in the pipeline, by setting the
camera-bins "filter-caps" to "video/x-raw-yuv", and gstreamer demands
of yuv format frames that their width is a multiple of 8, and their height
a multiple of 2.
Previous to this patch my bttv tvcard lists the following resolutions in
cheese:
924x576 (*)
920x576
640x480
462x288 (*)
460x288 (*)
320x240
231x144 (*)
230x144 (*)
160x120
Where all the ones marked with an asterisk don't work.
After this patch the list is:
920x576
640x480
456x288
320x240
224x144
160x120
And all work.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
libcheese/cheese-camera-device.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/libcheese/cheese-camera-device.c b/libcheese/cheese-camera-device.c
index 653cba9..370abff 100644
--- a/libcheese/cheese-camera-device.c
+++ b/libcheese/cheese-camera-device.c
@@ -313,8 +313,10 @@ cheese_camera_device_update_format_table (CheeseCameraDevice *device)
{
CheeseVideoFormat *format = g_slice_new0 (CheeseVideoFormat);
- format->width = cur_width;
- format->height = cur_height;
+ /* Gstreamer wants resolutions for YUV formats where the width is
+ * a multiple of 8, and the height is a multiple of 2 */
+ format->width = cur_width & ~7;
+ format->height = cur_height & ~1;
cheese_camera_device_add_format (device, format);
@@ -328,8 +330,10 @@ cheese_camera_device_update_format_table (CheeseCameraDevice *device)
{
CheeseVideoFormat *format = g_slice_new0 (CheeseVideoFormat);
- format->width = cur_width;
- format->height = cur_height;
+ /* Gstreamer wants resolutions for YUV formats where the width is
+ * a multiple of 8, and the height is a multiple of 2 */
+ format->width = cur_width & ~7;
+ format->height = cur_height & ~1;
cheese_camera_device_add_format (device, format);
--
1.7.11.4

View File

@ -0,0 +1,55 @@
From dcccb73f44970d7f8ed8e7d70986f9ffecfc6491 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 3 Sep 2013 15:56:25 +0200
Subject: [PATCH 04/13] cheese-camera: Fix video recording with gstreamer >=
1.1.4
gstreamer >= 1.1.4 requires us to fully specify the video-capture-source caps,
otherwise cheese prints this:
(cheese:22606): cheese-WARNING **: Filter caps do not completely specify the output format: gstcapsfilter.c(348): gst_capsfilter_prepare_buf (): /GstCameraBin:camerabin/GstCapsFilter:videobin-capsfilter:
Output caps are unfixed: video/x-raw, framerate=(fraction)30/1, width=(int)640, height=(int)480, format=(string){ YUY2, YV12, BGR, RGB, I420 }, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
And video-recording is broken.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
libcheese/cheese-camera.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
index a625359..fdeb973 100644
--- a/libcheese/cheese-camera.c
+++ b/libcheese/cheese-camera.c
@@ -743,7 +743,7 @@ cheese_camera_set_new_caps (CheeseCamera *camera)
{
CheeseCameraPrivate *priv;
CheeseCameraDevice *device;
- GstCaps *caps;
+ GstCaps *caps, *i420_caps, *video_caps;
gchar *caps_desc;
int width, height;
@@ -768,8 +768,17 @@ cheese_camera_set_new_caps (CheeseCamera *camera)
g_object_set (gst_bin_get_by_name (GST_BIN (priv->video_source),
"video_source_filter"), "caps", caps, NULL);
g_object_set (priv->camerabin, "viewfinder-caps", caps,
- "image-capture-caps", caps, "video-capture-caps", caps,
- NULL);
+ "image-capture-caps", caps, NULL);
+
+ /* We must pick a format for the video-source, otherwise gstreamer
+ becomes unhappy */
+ i420_caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "I420", NULL);
+ video_caps = gst_caps_intersect (caps, i420_caps);
+ g_object_set (priv->camerabin, "video-capture-caps", video_caps, NULL);
+
+ gst_caps_unref (i420_caps);
+ gst_caps_unref (video_caps);
gst_caps_unref (caps);
width = priv->current_format->width;
--
1.8.3.1

View File

@ -0,0 +1,90 @@
From ce2689370cc4cfd8e2fb3f2fba154a979792d934 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 11:14:16 +0200
Subject: [PATCH 05/13] cheese-preferences: Add camera_changed () method
This centralizes camera-change handling, and adds a check for their being
no camera removing a whole bunch of glib Critical messages being printed
when cheese is started without a camera.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-preferences.vala | 34 +++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index bad3c71..2f2d679 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -130,6 +130,28 @@ public class Cheese.PreferencesDialog : GLib.Object
}
/**
+ * Update resolution list and save the current camera to settings.
+ */
+ private void camera_changed ()
+ {
+ Cheese.CameraDevice device, iter_device;
+ TreeIter iter;
+
+ device = camera.get_selected_device ();
+ if (device == null)
+ return;
+ settings.set_string ("camera", device.get_device_node ());
+ setup_resolutions_for_device (device);
+
+ for (bool next = camera_model.get_iter_first (out iter); next;
+ next = camera_model.iter_next (ref iter)) {
+ camera_model.get (iter, 1, out iter_device, -1);
+ if (iter_device == device)
+ source_combo.set_active_iter (iter);
+ }
+ }
+
+ /**
* Initialize and populate the camera device combo box model.
*/
private void initialize_camera_devices ()
@@ -142,8 +164,7 @@ public class Cheese.PreferencesDialog : GLib.Object
devices.foreach(add_camera_device);
- settings.set_string ("camera", camera.get_selected_device ().get_device_node ());
- setup_resolutions_for_device (camera.get_selected_device ());
+ camera_changed ();
}
/**
@@ -229,8 +250,7 @@ public class Cheese.PreferencesDialog : GLib.Object
combo.model.get (iter, 1, out dev);
camera.set_device_by_device_node (dev.get_device_node ());
camera.switch_camera_device ();
- setup_resolutions_for_device (camera.get_selected_device ());
- settings.set_string ("camera", dev.get_device_node ());
+ camera_changed ();
}
/**
@@ -476,8 +496,7 @@ public class Cheese.PreferencesDialog : GLib.Object
}
}
- settings.set_string ("camera", camera.get_selected_device ().get_device_node ());
- setup_resolutions_for_device (camera.get_selected_device ());
+ camera_changed ();
}
/**
@@ -498,9 +517,6 @@ public class Cheese.PreferencesDialog : GLib.Object
0, dev.get_name () + " (" + dev.get_device_node () + ")",
1, dev);
- if (camera.get_selected_device ().get_device_node () == dev.get_device_node ())
- source_combo.set_active_iter (iter);
-
if (camera_model.iter_n_children (null) > 1 && camera_controls_sensitive)
source_combo.sensitive = true;
}
--
1.8.3.1

View File

@ -0,0 +1,44 @@
From 0d94fa92ab66b43f08b2b9d906fe0f4c963424af Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 11:38:05 +0200
Subject: [PATCH 06/13] cheese_camera_get_camera_devices: Allow calling before
cheese_camera_setup()
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
libcheese/cheese-camera.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
index fdeb973..332780a 100644
--- a/libcheese/cheese-camera.c
+++ b/libcheese/cheese-camera.c
@@ -363,6 +363,9 @@ cheese_camera_detect_camera_devices (CheeseCamera *camera)
{
CheeseCameraPrivate *priv = camera->priv;
+ if (priv->monitor)
+ return; /* Camera devices already detected */
+
priv->num_camera_devices = 0;
priv->camera_devices = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);
@@ -1650,13 +1653,11 @@ cheese_camera_setup (CheeseCamera *camera, const gchar *uuid, GError **error)
GPtrArray *
cheese_camera_get_camera_devices (CheeseCamera *camera)
{
- CheeseCameraPrivate *priv;
-
g_return_val_if_fail (CHEESE_IS_CAMERA (camera), NULL);
- priv = camera->priv;
+ cheese_camera_detect_camera_devices (camera);
- return g_ptr_array_ref (priv->camera_devices);
+ return g_ptr_array_ref (camera->priv->camera_devices);
}
/**
--
1.8.3.1

View File

@ -0,0 +1,131 @@
From de2a756fd016ecf41963d46bb6c9389ee931611d Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 11:40:41 +0200
Subject: [PATCH 07/13] cheese: Move camera_setup to cheese-preferences
cheese-preferences already keeps track of which cameras there are and is in
control of selecting camera resolution and the source-device. This patch also
makes it control of start / stop, thereby logical grouping all camera-control
code in a single place.
Having all camera control code in a single place makes dealing with various
hotplug issues a lot easier.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-application.vala | 20 ++++----------------
src/cheese-preferences.vala | 24 ++++++++++++++++++++++--
src/vapi/cheese-common.vapi | 2 +-
3 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
index 9cb5ac5..b0d0dbe 100644
--- a/src/cheese-application.vala
+++ b/src/cheese-application.vala
@@ -158,8 +158,10 @@ public class Cheese.Application : Gtk.Application
main_window.key_press_event.connect (on_webcam_key_pressed);
main_window.show ();
- setup_camera ();
+ create_camera ();
preferences_dialog = new PreferencesDialog (camera);
+ preferences_dialog.camera_error.connect (main_window.show_error);
+ preferences_dialog.camera_play ();
main_window.mode_change_changed.connect (preferences_dialog.enable_camera_controls);
this.add_window (main_window);
}
@@ -266,7 +268,7 @@ public class Cheese.Application : Gtk.Application
/**
* Setup the camera listed in GSettings.
*/
- public void setup_camera ()
+ public void create_camera ()
{
var effects = this.lookup_action ("effects") as SimpleAction;
var mode = this.lookup_action ("mode") as SimpleAction;
@@ -280,19 +282,6 @@ public class Cheese.Application : Gtk.Application
settings.get_int ("photo-x-resolution"),
settings.get_int ("photo-y-resolution"));
- try
- {
- camera.setup (device);
- }
- catch (Error err)
- {
- video_preview.hide ();
- message ("Error during camera setup: %s\n", err.message);
- main_window.show_error (err.message);
-
- return;
- }
-
double value;
value = settings.get_double ("brightness");
@@ -321,7 +310,6 @@ public class Cheese.Application : Gtk.Application
camera.state_flags_changed.connect (on_camera_state_flags_changed);
main_window.set_camera (camera);
- camera.play ();
}
/**
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index 2f2d679..5bd2ced 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -113,6 +113,28 @@ public class Cheese.PreferencesDialog : GLib.Object
}
/**
+ * Signal raised when there is an error with the camera device
+ */
+ public signal void camera_error (string? error);
+
+ /**
+ * Start playing video from the camera
+ */
+ public void camera_play ()
+ {
+ try
+ {
+ camera.setup (null);
+ camera.play ();
+ camera_changed ();
+ }
+ catch (Error err)
+ {
+ camera_error (err.message);
+ }
+ }
+
+ /**
* Set up combo box cell renderers.
*/
private void setup_combo_box_models ()
@@ -163,8 +185,6 @@ public class Cheese.PreferencesDialog : GLib.Object
source_combo.sensitive = false;
devices.foreach(add_camera_device);
-
- camera_changed ();
}
/**
diff --git a/src/vapi/cheese-common.vapi b/src/vapi/cheese-common.vapi
index 26e12a2..cd8a71c 100644
--- a/src/vapi/cheese-common.vapi
+++ b/src/vapi/cheese-common.vapi
@@ -49,7 +49,7 @@ namespace Cheese
public void toggle_effects_pipeline (bool active);
public void connect_effect_texture (Cheese.Effect effect, Clutter.Texture texture);
public void set_video_format (Cheese.VideoFormat format);
- public void setup (string udi) throws GLib.Error;
+ public void setup (string? udi) throws GLib.Error;
public void start_video_recording (string filename);
public void stop ();
public void stop_video_recording ();
--
1.8.3.1

View File

@ -0,0 +1,108 @@
From 55491c023d2d08795c156beb0a43ae8292d74a49 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 11:59:55 +0200
Subject: [PATCH 08/13] cheese: Properly deal with going from 0 -> 1 devices
Before this patch cheese showed a "No device found" message when started
without any devices connected, and would keep showing this after the user
plugged in a webcam. The new cam also could not be selected from the
preferences dialog.
After this patch cheese will automatically switch to showing video from a
newly plugged in webcam (when it had no devices before).
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-application.vala | 1 +
src/cheese-preferences.vala | 28 +++++++++++++++++++++++++---
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/src/cheese-application.vala b/src/cheese-application.vala
index b0d0dbe..be4837e 100644
--- a/src/cheese-application.vala
+++ b/src/cheese-application.vala
@@ -367,6 +367,7 @@ public class Cheese.Application : Gtk.Application
mode.set_enabled (false);
shoot.set_enabled (false);
+ preferences_dialog.camera_stop ();
main_window.camera_state_change_null ();
break;
default:
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index 5bd2ced..04a77ac 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -25,6 +25,8 @@ public class Cheese.PreferencesDialog : GLib.Object
{
private Cheese.Camera camera;
private bool camera_controls_sensitive;
+ private bool camera_is_setup;
+ private bool camera_is_playing;
private GLib.Settings settings;
@@ -124,8 +126,16 @@ public class Cheese.PreferencesDialog : GLib.Object
{
try
{
- camera.setup (null);
- camera.play ();
+ if (!camera_is_setup)
+ {
+ camera.setup (null);
+ camera_is_setup = true;
+ }
+ if (!camera_is_playing)
+ {
+ camera.play ();
+ camera_is_playing = true;
+ }
camera_changed ();
}
catch (Error err)
@@ -135,6 +145,14 @@ public class Cheese.PreferencesDialog : GLib.Object
}
/**
+ * Call this when the gstreamer pipe transitions to NULL
+ */
+ public void camera_stop ()
+ {
+ camera_is_playing = false;
+ }
+
+ /**
* Set up combo box cell renderers.
*/
private void setup_combo_box_models ()
@@ -270,7 +288,7 @@ public class Cheese.PreferencesDialog : GLib.Object
combo.model.get (iter, 1, out dev);
camera.set_device_by_device_node (dev.get_device_node ());
camera.switch_camera_device ();
- camera_changed ();
+ camera_play ();
}
/**
@@ -531,6 +549,7 @@ public class Cheese.PreferencesDialog : GLib.Object
{
TreeIter iter;
Cheese.CameraDevice dev = (Cheese.CameraDevice) device;
+ bool was_empty = camera_model.iter_n_children (null) == 0;
camera_model.append (out iter);
camera_model.set (iter,
@@ -539,6 +558,9 @@ public class Cheese.PreferencesDialog : GLib.Object
if (camera_model.iter_n_children (null) > 1 && camera_controls_sensitive)
source_combo.sensitive = true;
+
+ if (was_empty)
+ source_combo.set_active_iter (iter);
}
/**
--
1.8.3.1

View File

@ -0,0 +1,56 @@
From 632e0253bf899a40c5f90a0584fad936189be821 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 13:45:38 +0200
Subject: [PATCH 09/13] cheese: Avoid unnecessary calls to
switch_camera_device()
And thus avoid stopping and restarting the stream for no reason.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-preferences.vala | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index 04a77ac..e962062 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -27,6 +27,7 @@ public class Cheese.PreferencesDialog : GLib.Object
private bool camera_controls_sensitive;
private bool camera_is_setup;
private bool camera_is_playing;
+ private string camera_device_node;
private GLib.Settings settings;
@@ -180,7 +181,8 @@ public class Cheese.PreferencesDialog : GLib.Object
device = camera.get_selected_device ();
if (device == null)
return;
- settings.set_string ("camera", device.get_device_node ());
+ camera_device_node = device.get_device_node ();
+ settings.set_string ("camera", camera_device_node);
setup_resolutions_for_device (device);
for (bool next = camera_model.get_iter_first (out iter); next;
@@ -283,10 +285,16 @@ public class Cheese.PreferencesDialog : GLib.Object
TreeIter iter;
Cheese.CameraDevice dev;
+ string dev_node;
combo.get_active_iter (out iter);
combo.model.get (iter, 1, out dev);
- camera.set_device_by_device_node (dev.get_device_node ());
+ dev_node = dev.get_device_node ();
+
+ if (dev_node == camera_device_node)
+ return;
+
+ camera.set_device_by_device_node (dev_node);
camera.switch_camera_device ();
camera_play ();
}
--
1.8.3.1

View File

@ -0,0 +1,30 @@
From ec54a4dcbe7b814ab7b8ee60a44faefc091a3f96 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 18 Jun 2013 14:01:45 +0200
Subject: [PATCH 10/13] on_camera_update_num_camera_devices: Remove unnecessary
camera_changed() call
If the camera is actually changed then camera_changed already gets called
from either camera_play() or on_source_change().
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-preferences.vala | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index e962062..2120432 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -541,8 +541,6 @@ public class Cheese.PreferencesDialog : GLib.Object
remove_camera_device (iter, old_device, active_device);
}
}
-
- camera_changed ();
}
/**
--
1.8.3.1

View File

@ -0,0 +1,72 @@
From 7be2bcd05f80ffa8ee5ec7847a527ac07b6f8b87 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 19 Jun 2013 16:47:41 +0200
Subject: [PATCH 11/13] cheese-preferences: Simplify remove_camera_device
Now that we cache the device-node for the active camera, remove_camera_device
and its callers can be simplified.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-preferences.vala | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index 2120432..faf6877 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -508,12 +508,6 @@ public class Cheese.PreferencesDialog : GLib.Object
TreeIter iter;
camera_model.get_iter_first (out iter);
- // Combobox active element.
- TreeIter active_iter;
- Cheese.CameraDevice active_device;
- source_combo.get_active_iter (out active_iter);
- camera_model.get (active_iter, 1, out active_device, -1);
-
// Find which device was removed.
bool device_removed = false;
devices.foreach ((device) =>
@@ -525,7 +519,7 @@ public class Cheese.PreferencesDialog : GLib.Object
// Found the device that was removed.
if (strcmp (old_device.device_node, new_device.device_node) != 0)
{
- remove_camera_device (iter, new_device, active_device);
+ remove_camera_device (iter, new_device);
device_removed = true;
// Remember, this is from the anonymous function!
return;
@@ -538,7 +532,7 @@ public class Cheese.PreferencesDialog : GLib.Object
{
Cheese.CameraDevice old_device;
camera_model.get (iter, 1, out old_device, -1);
- remove_camera_device (iter, old_device, active_device);
+ remove_camera_device (iter, old_device);
}
}
}
@@ -573,16 +567,15 @@ public class Cheese.PreferencesDialog : GLib.Object
* Remove the supplied camera device from the device combo box model.
*
* @param iter the iterator of the device to remove
- * @param device_node the device to remove from the combo box model
- * @param active_device_node the currently-active camera device
+ * @param device the device to remove from the combo box model
*/
- private void remove_camera_device (TreeIter iter, Cheese.CameraDevice device_node,
- Cheese.CameraDevice active_device_node)
+ private void remove_camera_device (TreeIter iter,
+ Cheese.CameraDevice device)
{
unowned GLib.PtrArray devices = camera.get_camera_devices ();
// Check if the camera that we want to remove, is the active one
- if (strcmp (device_node.device_node, active_device_node.device_node) == 0)
+ if (device.device_node == camera_device_node)
{
if (devices.len > 0)
set_new_available_camera_device (iter);
--
1.8.3.1

View File

@ -0,0 +1,66 @@
From 51ff0d863bc0e160094ec684018ee0068b7b612a Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 19 Jun 2013 17:29:28 +0200
Subject: [PATCH 12/13] cheese-preferences: Cleanly handle going from 1 -> 0
devices
Cleanly handle going from 1 -> 0 devices and going from 1 -> 0 -> 1 devices.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-preferences.vala | 26 +++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)
diff --git a/src/cheese-preferences.vala b/src/cheese-preferences.vala
index faf6877..cad7eba 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -280,13 +280,13 @@ public class Cheese.PreferencesDialog : GLib.Object
[CCode (instance_pos = -1)]
public void on_source_change (Gtk.ComboBox combo)
{
- // TODO: Handle going from 1 to 0 devices, cleanly!
- return_if_fail (camera.num_camera_devices > 0);
-
TreeIter iter;
Cheese.CameraDevice dev;
string dev_node;
+ if (combo.get_active () == -1)
+ return;
+
combo.get_active_iter (out iter);
combo.model.get (iter, 1, out dev);
dev_node = dev.get_device_node ();
@@ -572,16 +572,20 @@ public class Cheese.PreferencesDialog : GLib.Object
private void remove_camera_device (TreeIter iter,
Cheese.CameraDevice device)
{
- unowned GLib.PtrArray devices = camera.get_camera_devices ();
-
- // Check if the camera that we want to remove, is the active one
- if (device.device_node == camera_device_node)
+ if (camera.num_camera_devices == 0) /* Last camera gone? */
{
- if (devices.len > 0)
- set_new_available_camera_device (iter);
- else
- this.dialog.hide();
+ ListStore resolution_model = new ListStore (2, typeof (string),
+ typeof (Cheese.VideoFormat));
+ photo_resolution_combo.model = resolution_model;
+ video_resolution_combo.model = resolution_model;
+ camera_device_node = "";
+ camera_error(_("No device found"));
}
+ else if (device.device_node == camera_device_node)
+ {
+ set_new_available_camera_device (iter);
+ }
+
camera_model.remove (iter);
if (camera_model.iter_n_children (null) <= 1)
--
1.8.3.1

View File

@ -0,0 +1,48 @@
From 462287f28f87c5dd9f30f734132b5c6193a1daa1 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 3 Sep 2013 15:39:49 +0200
Subject: [PATCH 13/13] cheese-window: Disable effect switching buttons on
webcam error
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
src/cheese-window.vala | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index 07cf0f4..bc2d3b7 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -1030,9 +1030,11 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
var effects_next = this.lookup_action ("effects-next") as SimpleAction;
var effects_previous = this.lookup_action ("effects-previous") as SimpleAction;
- effects_next.set_enabled (is_effects_selector_active
+ effects_next.set_enabled (!error_layer.visible
+ && is_effects_selector_active
&& current_effects_page != effects_manager.effects.length () / EFFECTS_PER_PAGE);
- effects_previous.set_enabled (is_effects_selector_active
+ effects_previous.set_enabled (!error_layer.visible
+ && is_effects_selector_active
&& current_effects_page != 0);
}
@@ -1151,6 +1153,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
public void camera_state_change_playing ()
{
show_error (null);
+ setup_effects_page_switch_sensitivity ();
Effect effect = effects_manager.get_effect (settings.get_string ("selected-effect"));
if (effect != null)
@@ -1169,6 +1172,7 @@ public class Cheese.MainWindow : Gtk.ApplicationWindow
{
show_error (_("There was an error playing video from the webcam"));
}
+ setup_effects_page_switch_sensitivity ();
}
/**
--
1.8.3.1

View File

@ -1,7 +1,7 @@
Name: cheese
Epoch: 2
Version: 3.9.91
Release: 2%{?dist}
Release: 3%{?dist}
Summary: Application for taking pictures and movies from a webcam
Group: Amusements/Graphics
@ -12,6 +12,24 @@ Source0: http://download.gnome.org/sources/cheese/3.9/%{name}-%{version}.
# https://bugzilla.gnome.org/show_bug.cgi?id=678447
# Patch2: 0002-Setup-vp8enc-in-a-way-suitable-for-realtime-encoding.patch
# https://bugzilla.gnome.org/show_bug.cgi?id=707386
Patch1: 0001-cheese-Don-t-allow-changing-the-camera-and-or-its-re.patch
Patch2: 0002-cheese-window-Add-cancel_running_action-method.patch
# https://bugzilla.gnome.org/show_bug.cgi?id=707387
Patch3: 0003-cheese-window-Allow-changing-effects-while-shooting-.patch
# https://bugzilla.gnome.org/show_bug.cgi?id=707391
Patch4: 0004-cheese-camera-Fix-video-recording-with-gstreamer-1.1.patch
# https://bugzilla.gnome.org/show_bug.cgi?id=603612
Patch5: 0005-cheese-preferences-Add-camera_changed-method.patch
Patch6: 0006-cheese_camera_get_camera_devices-Allow-calling-befor.patch
Patch7: 0007-cheese-Move-camera_setup-to-cheese-preferences.patch
Patch8: 0008-cheese-Properly-deal-with-going-from-0-1-devices.patch
Patch9: 0009-cheese-Avoid-unnecessary-calls-to-switch_camera_devi.patch
Patch10: 0010-on_camera_update_num_camera_devices-Remove-unnecessa.patch
Patch11: 0011-cheese-preferences-Simplify-remove_camera_device.patch
Patch12: 0012-cheese-preferences-Cleanly-handle-going-from-1-0-dev.patch
Patch13: 0013-cheese-window-Disable-effect-switching-buttons-on-we.patch
BuildRequires: gtk3-devel >= 3.0.0
BuildRequires: gstreamer1-devel
BuildRequires: gstreamer1-plugins-bad-free-devel
@ -67,7 +85,19 @@ for writing applications that require a webcam display widget.
%prep
%setup -q
# %patch2 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%build
@ -141,6 +171,14 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
%{_datadir}/gir-1.0/Cheese-3.0.gir
%changelog
* Thu Sep 12 2013 Hans de Goede <hdegoede@redhat.com> - 2:3.9.91-3
- In F-19 we had a long list of bugfix patches, most of these have been merged
into gnome-3.10 but not all have been merged yet, re-add the non merged ones
- Fix video recording not working
- Allow changing effects while recording
- Disallow changing camera settings while recording
- Fix cheese misbehavior when going from 0 -> 1 or 1 -> 0 camera devices
* Tue Sep 03 2013 Kalev Lember <kalevlember@gmail.com> - 2:3.9.91-2
- Rebuilt for libgnome-desktop soname bump
@ -373,7 +411,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
* Thu Aug 19 2010 Matthias Clasen <mclasen@redhat.com> 1:2.31.90-1
- Update to 2.31.90
* Fri Aug 11 2010 Matthias Clasen <mclasen@redhat.com> 1:2.31.1-2
* Wed Aug 11 2010 Matthias Clasen <mclasen@redhat.com> 1:2.31.1-2
- Add an epoch to stay ahead of F14
* Fri Aug 6 2010 Matthias Clasen <mclasen@redhat.com> 2.31.1-1
@ -473,7 +511,7 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
* Wed Dec 3 2008 Matthias Clasen <mclasen@redhat.com> 2.25.2-1
- Update to 2.25.2
* Thu Nov 21 2008 Matthias Clasen <mclasen@redhat.com> 2.25.1-4
* Fri Nov 21 2008 Matthias Clasen <mclasen@redhat.com> 2.25.1-4
- Better URL
* Thu Nov 13 2008 Matthias Clasen <mclasen@redhat.com> 2.25.1-3