summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-05-07 12:28:33 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-05-11 22:21:39 -0400
commit78d20b9301dde74b7fe4c4d6899fcf35937658da (patch)
treea41fc7ef2ba9e2802fa3d328b78f569fb5c2855b
parentbc6643f3c22a61c0ce6072cf3e2d33e552d19fe0 (diff)
downloadgtk+-78d20b9301dde74b7fe4c4d6899fcf35937658da.tar.gz
infobar: Add gtk_info_bar_remove_action_widget
This is mainly for completeness, since gtk_container_remove will not work for those anymore.
-rw-r--r--docs/reference/gtk/gtk4-sections.txt1
-rw-r--r--gtk/gtkinfobar.c37
-rw-r--r--gtk/gtkinfobar.h3
3 files changed, 39 insertions, 2 deletions
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 6ac6044a70..ba5d96cd7b 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1743,6 +1743,7 @@ GtkInfoBar
gtk_info_bar_new
gtk_info_bar_new_with_buttons
gtk_info_bar_add_action_widget
+gtk_info_bar_remove_action_widget
gtk_info_bar_add_button
gtk_info_bar_add_buttons
gtk_info_bar_set_response_sensitive
diff --git a/gtk/gtkinfobar.c b/gtk/gtkinfobar.c
index 485c8956e5..a8baa91f1c 100644
--- a/gtk/gtkinfobar.c
+++ b/gtk/gtkinfobar.c
@@ -168,7 +168,8 @@ typedef struct _ResponseData ResponseData;
struct _ResponseData
{
- gint response_id;
+ int response_id;
+ gulong handler_id;
};
enum
@@ -288,6 +289,16 @@ get_response_data (GtkWidget *widget,
return ad;
}
+static void
+clear_response_data (GtkWidget *widget)
+{
+ ResponseData *data;
+
+ data = get_response_data (widget, FALSE);
+ g_signal_handler_disconnect (widget, data->handler_id);
+ g_object_set_data (G_OBJECT (widget), "gtk-info-bar-reponse-data", NULL);
+}
+
static GtkWidget *
find_button (GtkInfoBar *info_bar,
gint response_id)
@@ -594,7 +605,7 @@ gtk_info_bar_add_action_widget (GtkInfoBar *info_bar,
closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated),
G_OBJECT (info_bar));
- g_signal_connect_closure_by_id (child, signal_id, 0, closure, FALSE);
+ ad->handler_id = g_signal_connect_closure_by_id (child, signal_id, 0, closure, FALSE);
}
else
g_warning ("Only 'activatable' widgets can be packed into the action area of a GtkInfoBar");
@@ -603,6 +614,28 @@ gtk_info_bar_add_action_widget (GtkInfoBar *info_bar,
}
/**
+ * gtk_info_bar_remove_action_widget:
+ * @info_bar: a #GtkInfoBar
+ * @widget: an action widget to remove
+ *
+ * Removes a widget from the action area of @info_bar, after
+ * it been put there by a call to gtk_info_bar_add_action_widget()
+ * or gtk_info_bar_add_button().
+ */
+void
+gtk_info_bar_remove_action_widget (GtkInfoBar *info_bar,
+ GtkWidget *widget)
+{
+ g_return_if_fail (GTK_IS_INFO_BAR (info_bar));
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ g_return_if_fail (gtk_widget_get_parent (widget) == info_bar->action_area);
+
+ clear_response_data (widget);
+
+ gtk_container_remove (GTK_CONTAINER (info_bar->action_area), widget);
+}
+
+/**
* gtk_info_bar_add_button:
* @info_bar: a #GtkInfoBar
* @button_text: text of button
diff --git a/gtk/gtkinfobar.h b/gtk/gtkinfobar.h
index 139b609afc..3a2997d927 100644
--- a/gtk/gtkinfobar.h
+++ b/gtk/gtkinfobar.h
@@ -58,6 +58,9 @@ void gtk_info_bar_add_action_widget (GtkInfoBar *info_bar,
GtkWidget *child,
gint response_id);
GDK_AVAILABLE_IN_ALL
+void gtk_info_bar_remove_action_widget (GtkInfoBar *info_bar,
+ GtkWidget *widget);
+GDK_AVAILABLE_IN_ALL
GtkWidget *gtk_info_bar_add_button (GtkInfoBar *info_bar,
const gchar *button_text,
gint response_id);