Blob Blame History Raw
From a1805cadf3e6f7396a323c26e391cd91c28c829f 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 06/11] 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 aa62a2e..fbb1145 100644
--- a/src/cheese-application.vala
+++ b/src/cheese-application.vala
@@ -368,6 +368,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 a73bb46..06929f5 100644
--- a/src/cheese-preferences.vala
+++ b/src/cheese-preferences.vala
@@ -24,6 +24,8 @@ using Gtk;
 public class Cheese.PreferencesDialog : GLib.Object
 {
   private Cheese.Camera camera;
+  private bool camera_is_setup;
+  private bool camera_is_playing;
 
   private GLib.Settings settings;
 
@@ -122,8 +124,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)
@@ -133,6 +143,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 ()
@@ -268,7 +286,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 ();
   }
 
   /**
@@ -529,6 +547,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,
@@ -537,6 +556,9 @@ public class Cheese.PreferencesDialog : GLib.Object
 
     if (camera_model.iter_n_children (null) > 1)
       source_combo.sensitive = true;
+
+    if (was_empty)
+      source_combo.set_active_iter (iter);
   }
 
   /**
-- 
1.8.3.1