From 85641efa081fa2c7f5dd792ef6512e9302b6df02 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Tue, 12 Aug 2008 16:01:38 -0400 Subject: [PATCH] make GtkWindow track the monitor number --- docs/reference/gtk/gtk-sections.txt | 2 + gtk/gtk.symbols | 2 + gtk/gtkwidget.c | 33 +++++++++++++ gtk/gtkwidget.h | 2 + gtk/gtkwindow.c | 76 +++++++++++++++++++++++++++++ gtk/gtkwindow.h | 2 + 6 files changed, 117 insertions(+) diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt index 72051c28fc..5392b756f0 100644 --- a/docs/reference/gtk/gtk-sections.txt +++ b/docs/reference/gtk/gtk-sections.txt @@ -5493,6 +5493,7 @@ gtk_widget_set_has_tooltip gtk_widget_trigger_tooltip_query gtk_widget_get_snapshot gtk_widget_get_window +gtk_widget_get_monitor_num gtk_requisition_copy gtk_requisition_free @@ -5614,6 +5615,7 @@ gtk_window_set_icon_name gtk_window_set_auto_startup_notification gtk_window_get_opacity gtk_window_set_opacity +gtk_window_get_monitor_num GTK_WINDOW GTK_IS_WINDOW diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 9e99266f7c..7d2ddc1954 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -5018,6 +5018,7 @@ gtk_widget_unmap gtk_widget_unparent gtk_widget_unrealize gtk_widget_get_window +gtk_widget_get_monitor_num #endif #endif @@ -5142,6 +5143,7 @@ gtk_window_stick gtk_window_unfullscreen gtk_window_unmaximize gtk_window_unstick +gtk_window_get_monitor_num #endif #endif diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index c15da47d9f..9a45e42da7 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -10337,5 +10337,38 @@ gtk_widget_get_window (GtkWidget *widget) return widget->window; } +/** + * gtk_widget_get_monitor_num: + * @widget: a #GtkWidget + * + * Gets the monitor number for the widget. Returns -1 if the widget is + * not part of a top-level. + * + * Returns: the monitor number + * + * Since: 2.14 + **/ +gint +gtk_widget_get_monitor_num (GtkWidget *widget) +{ + int monitor_num; + GtkWidget *toplevel; + + g_return_val_if_fail (GTK_IS_WIDGET (widget), -1); + + monitor_num = -1; + + toplevel = gtk_widget_get_toplevel (widget); + if (toplevel != NULL) + { + if (GTK_WIDGET_TOPLEVEL (toplevel) && GTK_IS_WINDOW (toplevel)) + { + monitor_num = gtk_window_get_monitor_num (GTK_WINDOW (toplevel)); + } + } + + return monitor_num; +} + #define __GTK_WIDGET_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index c73e52bba0..0fb6c9aab9 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -743,6 +743,8 @@ void gtk_widget_style_get (GtkWidget *widget, ...) G_GNUC_NULL_TERMINATED; +gint gtk_widget_get_monitor_num (GtkWidget *widget); + /* Set certain default values to be used at widget creation time. */ void gtk_widget_set_default_colormap (GdkColormap *colormap); diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 1238c2295c..3ecf507218 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -97,6 +97,7 @@ enum { /* Readonly properties */ PROP_IS_ACTIVE, PROP_HAS_TOPLEVEL_FOCUS, + PROP_MONITOR_NUM, /* Writeonly properties */ PROP_STARTUP_ID, @@ -190,6 +191,8 @@ struct _GtkWindowPrivate gdouble opacity; gchar *startup_id; + + gint monitor_num; }; static void gtk_window_dispose (GObject *object); @@ -297,6 +300,8 @@ static GtkKeyHash *gtk_window_get_key_hash (GtkWindow *window); static void gtk_window_free_key_hash (GtkWindow *window); static void gtk_window_on_composited_changed (GdkScreen *screen, GtkWindow *window); +static void gtk_window_update_monitor_num (GtkWindow *window); + static GSList *toplevel_list = NULL; static guint window_signals[LAST_SIGNAL] = { 0 }; @@ -778,6 +783,24 @@ gtk_window_class_init (GtkWindowClass *klass) 1.0, GTK_PARAM_READWRITE)); + /** + * GtkWindow:monitor-num: + * + * The monitor number for which the largest area of the window + * resides. -1 if window is not realized. + * + * Since: 2.14 + */ + g_object_class_install_property (gobject_class, + PROP_MONITOR_NUM, + g_param_spec_int ("monitor-num", + P_("Monitor Number"), + P_("The monitor number for which the largest area of the window resides"), + -1, + G_MAXINT, + -1, + GTK_PARAM_READABLE)); + window_signals[SET_FOCUS] = g_signal_new (I_("set-focus"), G_TYPE_FROM_CLASS (gobject_class), @@ -929,6 +952,7 @@ gtk_window_init (GtkWindow *window) priv->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL; priv->opacity = 1.0; priv->startup_id = NULL; + priv->monitor_num = -1; colormap = _gtk_widget_peek_colormap (); if (colormap) @@ -1165,6 +1189,9 @@ gtk_window_get_property (GObject *object, case PROP_OPACITY: g_value_set_double (value, gtk_window_get_opacity (window)); break; + case PROP_MONITOR_NUM: + g_value_set_int (value, priv->monitor_num); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -4666,6 +4693,7 @@ gtk_window_unmap (GtkWidget *widget) window->stick_initially = (state & GDK_WINDOW_STATE_STICKY) != 0; priv->above_initially = (state & GDK_WINDOW_STATE_ABOVE) != 0; priv->below_initially = (state & GDK_WINDOW_STATE_BELOW) != 0; + priv->monitor_num = -1; } static void @@ -5006,6 +5034,29 @@ gtk_window_frame_event (GtkWindow *window, GdkEvent *event) return FALSE; } +static void +gtk_window_update_monitor_num (GtkWindow *window) +{ + GdkWindow *gdk_window; + GtkWindowPrivate *priv = GTK_WINDOW_GET_PRIVATE (window); + gint prev_monitor_num; + + prev_monitor_num = priv->monitor_num; + + gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); + if (gdk_window == NULL) + priv->monitor_num = -1; + else + priv->monitor_num = gdk_screen_get_monitor_at_window (window->screen, gdk_window); + + if (priv->monitor_num != prev_monitor_num && + priv->monitor_num != -1) + { + /*g_debug ("monitor num changed from %d to %d for top-level %p (screen %p)", prev_monitor_num, priv->monitor_num, window, window->screen);*/ + g_object_notify (G_OBJECT (window), "monitor-num"); + } +} + static gint gtk_window_configure_event (GtkWidget *widget, GdkEventConfigure *event) @@ -5030,6 +5081,8 @@ gtk_window_configure_event (GtkWidget *widget, window->configure_request_count -= 1; gdk_window_thaw_toplevel_updates_libgtk_only (widget->window); } + + gtk_window_update_monitor_num (window); /* As an optimization, we avoid a resize when possible. * @@ -8443,5 +8496,28 @@ gtk_window_set_default_icon_from_file (const gchar *filename, #endif +/** + * gtk_window_get_monitor_num: + * @window: a #GtkWindow + * + * Gets the monitor number for which the largest area of the window + * resides. If the window is not realized, -1 is returned. + * + * Returns: the monitor number + * + * Since: 2.14 + **/ +gint +gtk_window_get_monitor_num (GtkWindow *window) +{ + GtkWindowPrivate *priv; + + g_return_val_if_fail (GTK_IS_WINDOW (window), -1); + + priv = GTK_WINDOW_GET_PRIVATE (window); + + return priv->monitor_num; +} + #define __GTK_WINDOW_C__ #include "gtkaliasdef.c" diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h index 69189714fd..06d1553076 100644 --- a/gtk/gtkwindow.h +++ b/gtk/gtkwindow.h @@ -382,6 +382,8 @@ gboolean gtk_window_parse_geometry (GtkWindow *window, const gchar *geometry); GtkWindowGroup *gtk_window_get_group (GtkWindow *window); +gint gtk_window_get_monitor_num (GtkWindow *window); + /* Ignore this unless you are writing a GUI builder */ void gtk_window_reshow_with_initial_size (GtkWindow *window);