[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