summaryrefslogtreecommitdiff
path: root/gtk/gtkwidget.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-11-07 17:59:04 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-11-07 17:59:04 +0000
commit100286ac57ce0011ed99ababcd311c99d7ca6343 (patch)
treede89edc4287c66956e2d363af1520061cd2cbd48 /gtk/gtkwidget.c
parent74bab1cc425d780c5508d32a772a7b28216f2d74 (diff)
downloadgtk+-100286ac57ce0011ed99ababcd311c99d7ca6343.tar.gz
Add ::screen-changed signal.
Thu Nov 7 12:53:08 2002 Owen Taylor <otaylor@redhat.com> * gtk/gtkwidget.[ch] gtk/gtkwindow.c gtk/gtkinvisible.c: Add ::screen-changed signal. * gtk/gtkfontsel.c gtk/gtktoolbar.c: Use ::screen-changed signal to simplify logic.
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r--gtk/gtkwidget.c97
1 files changed, 92 insertions, 5 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 8fe9579e20..0b58339f08 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -116,6 +116,7 @@ enum {
POPUP_MENU,
SHOW_HELP,
ACCEL_CLOSURES_CHANGED,
+ SCREEN_CHANGED,
LAST_SIGNAL
};
@@ -379,6 +380,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
klass->drag_motion = NULL;
klass->drag_drop = NULL;
klass->drag_data_received = NULL;
+ klass->screen_changed = NULL;
klass->show_help = gtk_widget_real_show_help;
@@ -1053,6 +1055,15 @@ gtk_widget_class_init (GtkWidgetClass *klass)
NULL, NULL,
_gtk_marshal_NONE__NONE,
G_TYPE_NONE, 0);
+ widget_signals[SCREEN_CHANGED] =
+ g_signal_new ("screen_changed",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GtkWidgetClass, hierarchy_changed),
+ NULL, NULL,
+ _gtk_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ GDK_TYPE_SCREEN);
binding_set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (binding_set, GDK_F10, GDK_SHIFT_MASK,
@@ -4289,11 +4300,27 @@ gtk_widget_set_style_internal (GtkWidget *widget,
g_object_unref (widget);
}
+typedef struct {
+ GtkWidget *previous_toplevel;
+ GdkScreen *previous_screen;
+ GdkScreen *new_screen;
+} HierarchyChangedInfo;
+
+static void
+do_screen_change (GtkWidget *widget,
+ GdkScreen *old_screen,
+ GdkScreen *new_screen)
+{
+ if (old_screen != new_screen)
+ g_signal_emit (widget, widget_signals[SCREEN_CHANGED], 0, old_screen);
+}
+
static void
gtk_widget_propagate_hierarchy_changed_recurse (GtkWidget *widget,
gpointer client_data)
{
gboolean new_anchored;
+ HierarchyChangedInfo *info = client_data;
new_anchored = GTK_WIDGET_TOPLEVEL (widget) ||
(widget->parent && GTK_WIDGET_ANCHORED (widget->parent));
@@ -4307,8 +4334,9 @@ gtk_widget_propagate_hierarchy_changed_recurse (GtkWidget *widget,
else
GTK_PRIVATE_UNSET_FLAG (widget, GTK_ANCHORED);
- g_signal_emit (widget, widget_signals[HIERARCHY_CHANGED], 0, client_data);
-
+ g_signal_emit (widget, widget_signals[HIERARCHY_CHANGED], 0, info->previous_toplevel);
+ do_screen_change (widget, info->previous_screen, info->new_screen);
+
if (GTK_IS_CONTAINER (widget))
gtk_container_forall (GTK_CONTAINER (widget),
gtk_widget_propagate_hierarchy_changed_recurse,
@@ -4331,13 +4359,72 @@ void
_gtk_widget_propagate_hierarchy_changed (GtkWidget *widget,
GtkWidget *previous_toplevel)
{
+ HierarchyChangedInfo info;
+
+ info.previous_toplevel = previous_toplevel;
+ info.previous_screen = previous_toplevel ? gtk_widget_get_screen (previous_toplevel) : NULL;
+
+ if (GTK_WIDGET_TOPLEVEL (widget) ||
+ (widget->parent && GTK_WIDGET_ANCHORED (widget->parent)))
+ info.new_screen = gtk_widget_get_screen (widget);
+ else
+ info.new_screen = NULL;
+
+ if (info.previous_screen)
+ g_object_ref (info.previous_screen);
if (previous_toplevel)
g_object_ref (previous_toplevel);
- gtk_widget_propagate_hierarchy_changed_recurse (widget, previous_toplevel);
-
+ gtk_widget_propagate_hierarchy_changed_recurse (widget, &info);
+
if (previous_toplevel)
g_object_unref (previous_toplevel);
+ if (info.previous_screen)
+ g_object_unref (info.previous_screen);
+}
+
+static void
+gtk_widget_propagate_screen_changed_recurse (GtkWidget *widget,
+ gpointer client_data)
+{
+ HierarchyChangedInfo *info = client_data;
+
+ g_object_ref (widget);
+
+ do_screen_change (widget, info->previous_screen, info->new_screen);
+
+ if (GTK_IS_CONTAINER (widget))
+ gtk_container_forall (GTK_CONTAINER (widget),
+ gtk_widget_propagate_hierarchy_changed_recurse,
+ client_data);
+
+ g_object_unref (widget);
+}
+
+/**
+ * _gtk_widget_propagate_screen_changed:
+ * @widget: a #GtkWidget
+ * @previous_screen: Previous screen
+ *
+ * Propagates changes in the screen for a widget to all
+ * children, emitting ::screen_changed.
+ **/
+void
+_gtk_widget_propagate_screen_changed (GtkWidget *widget,
+ GdkScreen *previous_screen)
+{
+ HierarchyChangedInfo info;
+
+ info.previous_screen = previous_screen;
+ info.new_screen = gtk_widget_get_screen (widget);
+
+ if (previous_screen)
+ g_object_ref (previous_screen);
+
+ gtk_widget_propagate_screen_changed_recurse (widget, &info);
+
+ if (previous_screen)
+ g_object_unref (previous_screen);
}
static void
@@ -4666,7 +4753,7 @@ gtk_widget_get_screen_unchecked (GtkWidget *widget)
*
* Get the #GdkScreen from the toplevel window associated with
* this widget. This function can only be called after the widget
- * has been added to a widget heirarchy with a #GtkWindow
+ * has been added to a widget hierarchy with a #GtkWindow
* at the top.
*
* In general, you should only create screen specific