[entangle] Fix crash when camera has no control widgets (rhbz #650528)

Daniel P. Berrange berrange at fedoraproject.org
Mon Nov 8 11:06:09 UTC 2010


commit ed43161354f66d9cb6573a79a647c8a482122e5e
Author: Daniel P. Berrange <dan at berrange.com>
Date:   Mon Nov 8 10:53:25 2010 +0000

    Fix crash when camera has no control widgets (rhbz #650528)
    
    * entangle-0.1.0-gir-repo-version.patch,
      entangle-0.1.0-udev-crash.patch: Remove obsolete files
    * entangle-0.2.0-controls-empty.patch: Fix crash with no widgets
    * entangle.spec: Add new patch

 entangle-0.1.0-gir-repo-version.patch |   12 --
 entangle-0.1.0-udev-crash.patch       |   25 ----
 entangle-0.2.0-controls-empty.patch   |  194 +++++++++++++++++++++++++++++++++
 entangle.spec                         |   10 ++-
 4 files changed, 203 insertions(+), 38 deletions(-)
---
diff --git a/entangle-0.2.0-controls-empty.patch b/entangle-0.2.0-controls-empty.patch
new file mode 100644
index 0000000..039f7f6
--- /dev/null
+++ b/entangle-0.2.0-controls-empty.patch
@@ -0,0 +1,194 @@
+commit 0473f3dab7ca9ea091ed60e20753aa0133f9d1fb
+Author: Daniel P. Berrange <berrange at redhat.com>
+Date:   Wed Oct 6 18:14:18 2010 +0100
+
+    Update to cope with cameras which have no controls
+    
+    Some camera drivers claim to support controls, but then don't
+    return any. This updates the UI code to cope with this situation
+    instead of crashing
+    
+    * frontend/entangle-camera-manager.c: Hide controls panel
+      and disable settings menu/toolbutton if no controls are
+      available
+    * frontend/entangle-control-panel.c,
+      frontend/entangle-control-panel.h: Export a property if
+      there are any visible controls
+
+diff --git a/src/frontend/entangle-camera-manager.c b/src/frontend/entangle-camera-manager.c
+index eb49482..ee14370 100644
+--- a/src/frontend/entangle-camera-manager.c
++++ b/src/frontend/entangle-camera-manager.c
+@@ -280,32 +280,39 @@ static void do_capture_widget_sensitivity(EntangleCameraManager *manager)
+ {
+     EntangleCameraManagerPrivate *priv = manager->priv;
+     GtkWidget *toolCapture;
+-    GtkWidget *settingsScroll;
++    GtkWidget *settingsBox;
+     GtkWidget *iconScroll;
+ 
+     GtkWidget *toolNew;
+     GtkWidget *toolOpen;
++    GtkWidget *toolSettings;
+     GtkWidget *menuNew;
+     GtkWidget *menuOpen;
+     GtkWidget *menuConnect;
+     GtkWidget *menuDisconnect;
+     GtkWidget *menuHelp;
++    GtkWidget *menuSettings;
+ 
+     GtkWidget *cancel;
+     GtkWidget *operation;
+     GtkWidget *confirm;
++    gboolean hasControls;
++
++    hasControls = entangle_control_panel_get_has_controls(priv->controlPanel);
+ 
+     toolCapture = glade_xml_get_widget(priv->glade, "toolbar-capture");
+-    settingsScroll = glade_xml_get_widget(priv->glade, "settings-scroll");
++    settingsBox = glade_xml_get_widget(priv->glade, "settings-box");
+     iconScroll = glade_xml_get_widget(priv->glade, "icon-scroll");
+ 
+     toolNew = glade_xml_get_widget(priv->glade, "toolbar-new");
+     toolOpen = glade_xml_get_widget(priv->glade, "toolbar-open");
++    toolSettings = glade_xml_get_widget(priv->glade, "toolbar-settings");
+     menuNew = glade_xml_get_widget(priv->glade, "menu-new");
+     menuOpen = glade_xml_get_widget(priv->glade, "menu-open");
+     menuConnect = glade_xml_get_widget(priv->glade, "menu-connect");
+     menuDisconnect = glade_xml_get_widget(priv->glade, "menu-disconnect");
+     menuHelp = glade_xml_get_widget(priv->glade, "menu-help-camera");
++    menuSettings = glade_xml_get_widget(priv->glade, "menu-settings");
+ 
+     cancel = glade_xml_get_widget(priv->glade, "toolbar-cancel");
+     operation = glade_xml_get_widget(priv->glade, "toolbar-operation");
+@@ -360,12 +367,23 @@ static void do_capture_widget_sensitivity(EntangleCameraManager *manager)
+     if (priv->camera && !entangle_camera_get_has_preview(priv->camera))
+         gtk_widget_set_tooltip_text(priv->menuItemPreview, "This camera does not support image preview");
+ 
+-    if (priv->camera && entangle_camera_get_has_settings(priv->camera))
+-        gtk_widget_show(settingsScroll);
+-    else
+-        gtk_widget_hide(settingsScroll);
++    if (priv->camera &&
++        hasControls &&
++        entangle_camera_get_has_settings(priv->camera)) {
++        gtk_widget_show(settingsBox);
++        gtk_widget_set_sensitive(toolSettings, TRUE);
++        gtk_widget_set_sensitive(menuSettings, TRUE);
++        gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toolSettings), TRUE);
++        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuSettings), TRUE);
++    } else {
++        gtk_widget_hide(settingsBox);
++        gtk_widget_set_sensitive(toolSettings, FALSE);
++        gtk_widget_set_sensitive(menuSettings, FALSE);
++        gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toolSettings), FALSE);
++        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuSettings), FALSE);
++    }
+ 
+-    gtk_widget_set_sensitive(settingsScroll, !priv->task);
++    gtk_widget_set_sensitive(settingsBox, !priv->task);
+     /*gtk_widget_set_sensitive(iconScroll, !priv->task)*/
+ 
+     if (priv->task) {
+diff --git a/src/frontend/entangle-control-panel.c b/src/frontend/entangle-control-panel.c
+index bc8f09a..9d83a95 100644
+--- a/src/frontend/entangle-control-panel.c
++++ b/src/frontend/entangle-control-panel.c
+@@ -38,6 +38,8 @@
+ struct _EntangleControlPanelPrivate {
+     EntangleCamera *camera;
+     EntangleCameraScheduler *cameraScheduler;
++
++    gboolean hasControls;
+ };
+ 
+ G_DEFINE_TYPE(EntangleControlPanel, entangle_control_panel, GTK_TYPE_VBOX);
+@@ -45,6 +47,7 @@ G_DEFINE_TYPE(EntangleControlPanel, entangle_control_panel, GTK_TYPE_VBOX);
+ enum {
+     PROP_O,
+     PROP_CAMERA,
++    PROP_HAS_CONTROLS,
+ };
+ 
+ 
+@@ -138,11 +141,14 @@ static void do_setup_control_group(EntangleControlPanel *panel,
+                                    GtkVBox *box,
+                                    EntangleControlGroup *grp)
+ {
++    EntangleControlPanelPrivate *priv = panel->priv;
+     int i;
+ 
+     for (i = 0 ; i < entangle_control_group_count(grp) ; i++) {
+         EntangleControl *control = entangle_control_group_get(grp, i);
+ 
++        priv->hasControls = TRUE;
++
+         ENTANGLE_DEBUG("Build control %d %s",
+                    entangle_control_id(control),
+                    entangle_control_label(control));
+@@ -299,6 +305,9 @@ static void do_setup_camera(EntangleControlPanel *panel)
+ 
+     grp = entangle_camera_get_controls(priv->camera);
+ 
++    if (!grp)
++        return;
++
+     do_setup_control_group(panel, GTK_VBOX(panel), grp);
+     gtk_widget_show_all(GTK_WIDGET(panel));
+ }
+@@ -317,6 +326,10 @@ static void entangle_control_panel_get_property(GObject *object,
+             g_value_set_object(value, priv->camera);
+             break;
+ 
++        case PROP_HAS_CONTROLS:
++            g_value_set_boolean(value, priv->hasControls);
++            break;
++
+         default:
+             G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+         }
+@@ -375,6 +388,17 @@ static void entangle_control_panel_class_init(EntangleControlPanelClass *klass)
+                                                         G_PARAM_STATIC_NICK |
+                                                         G_PARAM_STATIC_BLURB));
+ 
++    g_object_class_install_property(object_class,
++                                    PROP_CAMERA,
++                                    g_param_spec_boolean("has-controls",
++                                                         "Has Controls",
++                                                         "Has Controls",
++                                                         FALSE,
++                                                         G_PARAM_READABLE |
++                                                         G_PARAM_STATIC_NAME |
++                                                         G_PARAM_STATIC_NICK |
++                                                         G_PARAM_STATIC_BLURB));
++
+     g_type_class_add_private(klass, sizeof(EntangleControlPanelPrivate));
+ }
+ 
+@@ -435,6 +459,14 @@ EntangleCameraScheduler *entangle_control_panel_get_camera_scheduler(EntangleCon
+     return priv->cameraScheduler;
+ }
+ 
++gboolean entangle_control_panel_get_has_controls(EntangleControlPanel *panel)
++{
++    EntangleControlPanelPrivate *priv = panel->priv;
++
++    return priv->hasControls;
++}
++
++
+ /*
+  * Local variables:
+  *  c-indent-level: 4
+diff --git a/src/frontend/entangle-control-panel.h b/src/frontend/entangle-control-panel.h
+index 19ee794..f74d418 100644
+--- a/src/frontend/entangle-control-panel.h
++++ b/src/frontend/entangle-control-panel.h
+@@ -66,6 +66,7 @@ void entangle_control_panel_set_camera_scheduler(EntangleControlPanel *panel,
+                                                  EntangleCameraScheduler *sched);
+ EntangleCameraScheduler *entangle_control_panel_get_camera_scheduler(EntangleControlPanel *panel);
+ 
++gboolean entangle_control_panel_get_has_controls(EntangleControlPanel *panel);
+ 
+ G_END_DECLS
+ 
diff --git a/entangle.spec b/entangle.spec
index 303b6ea..b804f20 100644
--- a/entangle.spec
+++ b/entangle.spec
@@ -11,10 +11,11 @@
 Summary: Tethered shooting & control of digital cameras
 Name: entangle
 Version: 0.2.0
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: GPLv3+
 Group: Applications/Multimedia
 Source: http://entangle-photo.org/download/sources/%{name}-%{version}.tar.gz
+Patch1: %{name}-%{version}-controls-empty.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
 URL: http://entangle-photo.org/
 
@@ -52,6 +53,7 @@ and 'hands off' shooting directly from the controlling computer.
 
 %prep
 %setup -q
+%patch1 -p1
 
 %build
 
@@ -116,6 +118,12 @@ update-desktop-database %{_datadir}/applications
 %endif
 
 %changelog
+* Mon Nov  8 2010 Daniel P. Berrange <berrange at redhat.com> - 0.2.0-2
+- Fix crash when camera has no control widgets (rhbz #628163)
+
+* Wed Oct  6 2010 Daniel P. Berrange <berrange at redhat.com> - 0.2.0-1
+- Update to 0.2.0 release
+
 * Tue Jul 13 2010 Daniel P. Berrange <berrange at redhat.com> - 0.1.0-7
 - Fix gir repo version for GPhoto hack
 


More information about the scm-commits mailing list