[gtk+] window: Add concept of popover "parent"
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] window: Add concept of popover "parent"
- Date: Wed, 17 Jun 2015 13:57:00 +0000 (UTC)
commit 76dc8aced5517b409e2cc7897e1d49a20a0c8ade
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Jun 15 14:05:00 2015 +0200
window: Add concept of popover "parent"
This will be the widget that the popover relates to (::pointing-to in
GtkPopover, ::parent in GtkTextHandle).
Additional API to check the popover/parent relationship between widgets
has been added, which will be useful wherever this is necessary in a
generic manner.
https://bugzilla.gnome.org/show_bug.cgi?id=750993
gtk/gtkpopover.c | 4 +-
gtk/gtktexthandle.c | 2 +-
gtk/gtkwindow.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++-
gtk/gtkwindowprivate.h | 8 ++++++-
4 files changed, 62 insertions(+), 5 deletions(-)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index da4e1c1..e2e7942 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -1699,7 +1699,7 @@ _gtk_popover_parent_hierarchy_changed (GtkWidget *widget,
_gtk_window_remove_popover (priv->window, GTK_WIDGET (popover));
if (new_window)
- _gtk_window_add_popover (new_window, GTK_WIDGET (popover));
+ _gtk_window_add_popover (new_window, GTK_WIDGET (popover), priv->widget);
priv->window = new_window;
@@ -1970,7 +1970,7 @@ gtk_popover_update_relative_to (GtkPopover *popover,
}
if (priv->window)
- _gtk_window_add_popover (priv->window, GTK_WIDGET (popover));
+ _gtk_window_add_popover (priv->window, GTK_WIDGET (popover), priv->widget);
if (relative_to)
scrollable = GTK_SCROLLABLE (gtk_widget_get_ancestor (priv->widget, GTK_TYPE_SCROLLABLE));
diff --git a/gtk/gtktexthandle.c b/gtk/gtktexthandle.c
index 977de04..47de7ef 100644
--- a/gtk/gtktexthandle.c
+++ b/gtk/gtktexthandle.c
@@ -309,7 +309,7 @@ _gtk_text_handle_ensure_widget (GtkTextHandle *handle,
priv->windows[pos].widget = g_object_ref_sink (widget);
window = gtk_widget_get_ancestor (priv->parent, GTK_TYPE_WINDOW);
- _gtk_window_add_popover (GTK_WINDOW (window), widget);
+ _gtk_window_add_popover (GTK_WINDOW (window), widget, priv->parent);
gtk_style_context_set_parent (gtk_widget_get_style_context (widget),
gtk_widget_get_style_context (priv->parent));
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 7f6f3e3..555d9d7 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -132,6 +132,7 @@ typedef struct _GtkWindowPopover GtkWindowPopover;
struct _GtkWindowPopover
{
GtkWidget *widget;
+ GtkWidget *parent;
GdkWindow *window;
GtkPositionType pos;
cairo_rectangle_int_t rect;
@@ -11810,7 +11811,8 @@ _gtk_window_get_shadow_width (GtkWindow *window,
void
_gtk_window_add_popover (GtkWindow *window,
- GtkWidget *popover)
+ GtkWidget *popover,
+ GtkWidget *parent)
{
GtkWindowPrivate *priv;
GtkWindowPopover *data;
@@ -11818,7 +11820,9 @@ _gtk_window_add_popover (GtkWindow *window,
g_return_if_fail (GTK_IS_WINDOW (window));
g_return_if_fail (GTK_IS_WIDGET (popover));
+ g_return_if_fail (GTK_IS_WIDGET (parent));
g_return_if_fail (gtk_widget_get_parent (popover) == NULL);
+ g_return_if_fail (gtk_widget_is_ancestor (parent, GTK_WIDGET (window)));
priv = window->priv;
@@ -11827,6 +11831,7 @@ _gtk_window_add_popover (GtkWindow *window,
data = g_new0 (GtkWindowPopover, 1);
data->widget = popover;
+ data->parent = parent;
priv->popovers = g_list_prepend (priv->popovers, data);
if (gtk_widget_get_realized (GTK_WIDGET (window)))
@@ -11943,6 +11948,52 @@ _gtk_window_get_popover_position (GtkWindow *window,
*rect = data->rect;
}
+/*<private>
+ * _gtk_window_get_popover_parent:
+ * @window: A #GtkWindow
+ * @popover: A popover #GtkWidget
+ *
+ * Returns the conceptual parent of this popover, the real
+ * parent will always be @window.
+ *
+ * Returns: The conceptual parent widget, or %NULL.
+ **/
+GtkWidget *
+_gtk_window_get_popover_parent (GtkWindow *window,
+ GtkWidget *popover)
+{
+ GtkWindowPopover *data;
+
+ g_return_if_fail (GTK_IS_WINDOW (window));
+ g_return_if_fail (GTK_IS_WIDGET (popover));
+
+ data = _gtk_window_has_popover (window, popover);
+
+ if (data && data->parent)
+ return data->parent;
+
+ return NULL;
+}
+
+/*<private>
+ * _gtk_window_is_popover_widget:
+ * @window: A #GtkWindow
+ * @possible_popover: A possible popover of @window
+ *
+ * Returns #TRUE if @possible_popover is a popover of @window.
+ *
+ * Returns: Whether the widget is a popover of @window
+ **/
+gboolean
+_gtk_window_is_popover_widget (GtkWindow *window,
+ GtkWidget *possible_popover)
+{
+ g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+ g_return_val_if_fail (GTK_IS_WIDGET (possible_popover), FALSE);
+
+ return _gtk_window_has_popover (window, possible_popover) != NULL;
+}
+
static GtkWidget *inspector_window = NULL;
static void set_warn_again (gboolean warn);
diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h
index f6b3747..a8236b0 100644
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -104,7 +104,8 @@ void _gtk_window_set_window_group (GtkWindow *window,
/* Popovers */
void _gtk_window_add_popover (GtkWindow *window,
- GtkWidget *popover);
+ GtkWidget *popover,
+ GtkWidget *popover_parent);
void _gtk_window_remove_popover (GtkWindow *window,
GtkWidget *popover);
void _gtk_window_set_popover_position (GtkWindow *window,
@@ -116,6 +117,11 @@ void _gtk_window_get_popover_position (GtkWindow *window,
GtkPositionType *pos,
cairo_rectangle_int_t *rect);
+GtkWidget * _gtk_window_get_popover_parent (GtkWindow *window,
+ GtkWidget *popover);
+gboolean _gtk_window_is_popover_widget (GtkWindow *window,
+ GtkWidget *popover);
+
GdkPixbuf *gtk_window_get_icon_for_size (GtkWindow *window,
gint size);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]