[pavucontrol] 01/07: Backport patches from upstream that fix gtk/glade usage
Felipe Sateler
fsateler at moszumanska.debian.org
Wed Oct 22 23:49:27 UTC 2014
This is an automated email from the git hooks/post-receive script.
fsateler pushed a commit to branch master
in repository pavucontrol.
commit 597bef2f0eb32ebb672684bc221c9288bae16565
Author: Felipe Sateler <fsateler at debian.org>
Date: Wed Oct 22 20:02:46 2014 -0300
Backport patches from upstream that fix gtk/glade usage
---
...he-widget-before-returning-it-from-create.patch | 196 +++++++++++++++++++++
...antiate-cardwidget-devicewidget-and-rolew.patch | 76 ++++++++
debian/patches/series | 2 +
3 files changed, 274 insertions(+)
diff --git a/debian/patches/0003-Reference-the-widget-before-returning-it-from-create.patch b/debian/patches/0003-Reference-the-widget-before-returning-it-from-create.patch
new file mode 100644
index 0000000..2d42d17
--- /dev/null
+++ b/debian/patches/0003-Reference-the-widget-before-returning-it-from-create.patch
@@ -0,0 +1,196 @@
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Thu, 28 Aug 2014 12:58:05 +0200
+Subject: Reference the widget before returning it from ::create methods
+
+Widgets (unlike Windows and Dialogs) returned by Gtk::Builder::get_widget*
+start owned by the GtkBuilder object, the idea being that they will get
+added to a container before the scope of the GtkBuilder object ends, and it
+thus automatically gets destroyed.
+
+But in the various ::create methods in pavucontrol, a pointer to the widget
+gets returned, so that it can be added to a cointainer by the caller.
+However as soon as the ::create method exits the GtkBuilder object owning
+the widget, and thus also the widget gets destroyed, and we end up returning
+free-ed memory.
+
+This commit fixes this by making all ::create methods take a reference on
+the widget before returning it, and having all the callers unreference the
+widget after adding it to a container.
+
+https://bugs.freedesktop.org/show_bug.cgi?id=83144
+https://bugzilla.redhat.com/show_bug.cgi?id=1133339
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ src/cardwidget.cc | 1 +
+ src/channelwidget.cc | 1 +
+ src/devicewidget.cc | 1 +
+ src/mainwindow.cc | 6 ++++++
+ src/rolewidget.cc | 1 +
+ src/sinkinputwidget.cc | 1 +
+ src/sinkwidget.cc | 1 +
+ src/sourceoutputwidget.cc | 1 +
+ src/sourcewidget.cc | 1 +
+ src/streamwidget.cc | 1 +
+ 10 files changed, 15 insertions(+)
+
+diff --git a/src/cardwidget.cc b/src/cardwidget.cc
+index c79ac6c..28c558d 100644
+--- a/src/cardwidget.cc
++++ b/src/cardwidget.cc
+@@ -45,6 +45,7 @@ CardWidget* CardWidget::create() {
+ CardWidget* w;
+ Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create_from_file(GLADE_FILE, "cardWidget");
+ x->get_widget_derived("cardWidget", w);
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/channelwidget.cc b/src/channelwidget.cc
+index 6f59de2..fe94c11 100644
+--- a/src/channelwidget.cc
++++ b/src/channelwidget.cc
+@@ -53,6 +53,7 @@ ChannelWidget* ChannelWidget::create() {
+ x->add_from_file(GLADE_FILE, "adjustment1");
+ x->add_from_file(GLADE_FILE, "channelWidget");
+ x->get_widget_derived("channelWidget", w);
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/devicewidget.cc b/src/devicewidget.cc
+index 1c34ea6..2fb8095 100644
+--- a/src/devicewidget.cc
++++ b/src/devicewidget.cc
+@@ -84,6 +84,7 @@ void DeviceWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) {
+ snprintf(text, sizeof(text), "<b>%s</b>", pa_channel_position_to_pretty_string(m.map[i]));
+ cw->channelLabel->set_markup(text);
+ channelsVBox->pack_start(*cw, false, false, 0);
++ cw->unreference();
+ }
+ channelWidgets[m.channels-1]->last = true;
+
+diff --git a/src/mainwindow.cc b/src/mainwindow.cc
+index 741af94..a67b15c 100644
+--- a/src/mainwindow.cc
++++ b/src/mainwindow.cc
+@@ -298,6 +298,7 @@ void MainWindow::updateCard(const pa_card_info &info) {
+ else {
+ cardWidgets[info.index] = w = CardWidget::create();
+ cardsVBox->pack_start(*w, false, false, 0);
++ w->unreference();
+ w->index = info.index;
+ is_new = true;
+ }
+@@ -414,6 +415,7 @@ bool MainWindow::updateSink(const pa_sink_info &info) {
+ sinkWidgets[info.index] = w = SinkWidget::create(this);
+ w->setChannelMap(info.channel_map, !!(info.flags & PA_SINK_DECIBEL_VOLUME));
+ sinksVBox->pack_start(*w, false, false, 0);
++ w->unreference();
+ w->index = info.index;
+ w->monitor_index = info.monitor_source;
+ is_new = true;
+@@ -572,6 +574,7 @@ void MainWindow::updateSource(const pa_source_info &info) {
+ sourceWidgets[info.index] = w = SourceWidget::create(this);
+ w->setChannelMap(info.channel_map, !!(info.flags & PA_SOURCE_DECIBEL_VOLUME));
+ sourcesVBox->pack_start(*w, false, false, 0);
++ w->unreference();
+ w->index = info.index;
+ is_new = true;
+
+@@ -687,6 +690,7 @@ void MainWindow::updateSinkInput(const pa_sink_input_info &info) {
+ sinkInputWidgets[info.index] = w = SinkInputWidget::create(this);
+ w->setChannelMap(info.channel_map, true);
+ streamsVBox->pack_start(*w, false, false, 0);
++ w->unreference();
+ w->index = info.index;
+ w->clientIndex = info.client;
+ is_new = true;
+@@ -742,6 +746,7 @@ void MainWindow::updateSourceOutput(const pa_source_output_info &info) {
+ w->setChannelMap(info.channel_map, true);
+ #endif
+ recsVBox->pack_start(*w, false, false, 0);
++ w->unreference();
+ w->index = info.index;
+ w->clientIndex = info.client;
+ is_new = true;
+@@ -835,6 +840,7 @@ bool MainWindow::createEventRoleWidget() {
+
+ eventRoleWidget = RoleWidget::create();
+ streamsVBox->pack_start(*eventRoleWidget, false, false, 0);
++ eventRoleWidget->unreference();
+ eventRoleWidget->role = "sink-input-by-media-role:event";
+ eventRoleWidget->setChannelMap(cm, true);
+
+diff --git a/src/rolewidget.cc b/src/rolewidget.cc
+index fd3196c..db07f92 100644
+--- a/src/rolewidget.cc
++++ b/src/rolewidget.cc
+@@ -40,6 +40,7 @@ RoleWidget* RoleWidget::create() {
+ RoleWidget* w;
+ Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create_from_file(GLADE_FILE, "streamWidget");
+ x->get_widget_derived("streamWidget", w);
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/sinkinputwidget.cc b/src/sinkinputwidget.cc
+index b88b718..5a0ba39 100644
+--- a/src/sinkinputwidget.cc
++++ b/src/sinkinputwidget.cc
+@@ -43,6 +43,7 @@ SinkInputWidget* SinkInputWidget::create(MainWindow* mainWindow) {
+ Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create_from_file(GLADE_FILE, "streamWidget");
+ x->get_widget_derived("streamWidget", w);
+ w->init(mainWindow);
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/sinkwidget.cc b/src/sinkwidget.cc
+index 1726550..adfa2d9 100644
+--- a/src/sinkwidget.cc
++++ b/src/sinkwidget.cc
+@@ -70,6 +70,7 @@ SinkWidget* SinkWidget::create(MainWindow* mainWindow) {
+ Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create_from_file(GLADE_FILE, "deviceWidget");
+ x->get_widget_derived("deviceWidget", w);
+ w->init(mainWindow, "sink");
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/sourceoutputwidget.cc b/src/sourceoutputwidget.cc
+index 827c5a8..4d915b0 100644
+--- a/src/sourceoutputwidget.cc
++++ b/src/sourceoutputwidget.cc
+@@ -49,6 +49,7 @@ SourceOutputWidget* SourceOutputWidget::create(MainWindow* mainWindow) {
+ Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create_from_file(GLADE_FILE, "streamWidget");
+ x->get_widget_derived("streamWidget", w);
+ w->init(mainWindow);
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/sourcewidget.cc b/src/sourcewidget.cc
+index 5e4ecf0..fde5333 100644
+--- a/src/sourcewidget.cc
++++ b/src/sourcewidget.cc
+@@ -35,6 +35,7 @@ SourceWidget* SourceWidget::create(MainWindow* mainWindow) {
+ Glib::RefPtr<Gtk::Builder> x = Gtk::Builder::create_from_file(GLADE_FILE, "deviceWidget");
+ x->get_widget_derived("deviceWidget", w);
+ w->init(mainWindow, "source");
++ w->reference();
+ return w;
+ }
+
+diff --git a/src/streamwidget.cc b/src/streamwidget.cc
+index 94363ec..e602cce 100644
+--- a/src/streamwidget.cc
++++ b/src/streamwidget.cc
+@@ -77,6 +77,7 @@ void StreamWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) {
+ snprintf(text, sizeof(text), "<b>%s</b>", pa_channel_position_to_pretty_string(m.map[i]));
+ cw->channelLabel->set_markup(text);
+ channelsVBox->pack_start(*cw, false, false, 0);
++ cw->unreference();
+ }
+ channelWidgets[m.channels-1]->last = true;
+ channelWidgets[m.channels-1]->setBaseVolume(PA_VOLUME_NORM);
diff --git a/debian/patches/0004-Do-not-instantiate-cardwidget-devicewidget-and-rolew.patch b/debian/patches/0004-Do-not-instantiate-cardwidget-devicewidget-and-rolew.patch
new file mode 100644
index 0000000..51f5101
--- /dev/null
+++ b/debian/patches/0004-Do-not-instantiate-cardwidget-devicewidget-and-rolew.patch
@@ -0,0 +1,76 @@
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Fri, 29 Aug 2014 09:42:04 +0200
+Subject: Do not instantiate cardwidget,
+ devicewidget and rolewidget with a type of EventBox
+
+RoleWidget::create contains:
+ x->get_widget_derived("streamWidget", w);
+
+But streamWidget is defined as following in the glade file:
+<object class="GtkEventBox" id="streamWidget">
+
+Where as RoleWidget is derived from [Minimal]StreamWidget, which is derived
+from Gtk::VBox, so this is clearly wrong.
+
+Adding:
+printf("rolewidget type: %s\n", g_type_name(G_TYPE_FROM_INSTANCE(w->gobj())));
+for debugging shows that this really leads to RoleWidget being instantiated
+as an EventBox (yet things still work due to sheer luck).
+
+This commit fixes this, by putting the streamWidget id at the right level of
+the hierarchy in the glade file (and likewise for cardWidget and deviceWidget).
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ src/pavucontrol.glade | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/pavucontrol.glade b/src/pavucontrol.glade
+index 6defb3d..fd43217 100644
+--- a/src/pavucontrol.glade
++++ b/src/pavucontrol.glade
+@@ -12,12 +12,12 @@
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">window1</property>
+ <child>
+- <object class="GtkEventBox" id="cardWidget">
++ <object class="GtkEventBox" id="cardWidgetBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="visible_window">False</property>
+ <child>
+- <object class="GtkVBox" id="cardWidget1">
++ <object class="GtkVBox" id="cardWidget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+@@ -202,12 +202,12 @@
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">window1</property>
+ <child>
+- <object class="GtkEventBox" id="deviceWidget">
++ <object class="GtkEventBox" id="deviceWidgetBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="visible_window">False</property>
+ <child>
+- <object class="GtkVBox" id="streamWidget2">
++ <object class="GtkVBox" id="deviceWidget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+@@ -1316,12 +1316,12 @@
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">window1</property>
+ <child>
+- <object class="GtkEventBox" id="streamWidget">
++ <object class="GtkEventBox" id="streamWidgetBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="visible_window">False</property>
+ <child>
+- <object class="GtkVBox" id="streamWidget2">
++ <object class="GtkVBox" id="streamWidget">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
diff --git a/debian/patches/series b/debian/patches/series
index 23e6a91..b20ca94 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,4 @@
0001-Don-t-crash-if-pa_stream_peek-returns-NULL.patch
0002-README-updating.patch
+0003-Reference-the-widget-before-returning-it-from-create.patch
+0004-Do-not-instantiate-cardwidget-devicewidget-and-rolew.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-pulseaudio/pavucontrol.git
More information about the pkg-pulseaudio-devel
mailing list