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 <[email protected]> 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 <[email protected]> +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 <[email protected]> +--- + 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 <[email protected]> +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 <[email protected]> +--- + 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 _______________________________________________ pkg-pulseaudio-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-pulseaudio-devel

