File mate-screensaver-gtk-3.20.patch of Package mate-screensaver
--- a/configure.ac
+++ b/configure.ac
@@ -44,8 +44,8 @@ GLIB_GSETTINGS
# Dependencies
DBUS_REQUIRED_VERSION=0.30
-GLIB_REQUIRED_VERSION=2.50.0
-GTK_REQUIRED_VERSION=3.22.0
+GLIB_REQUIRED_VERSION=2.48.0
+GTK_REQUIRED_VERSION=3.20.0
X11_REQUIRED_VERSION=1.0
LIBMATE_MENU_REQUIRED_VERSION=1.10.0
MATE_DESKTOP_REQUIRED_VERSION=1.17.0
--- a/src/gs-manager.c
+++ b/src/gs-manager.c
@@ -1103,7 +1103,12 @@ find_window_at_pointer (GSManager *manag
{
GdkDisplay *display;
GdkDevice *device;
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor;
+#else
+ GdkScreen *screen;
+ int monitor;
+#endif
int x, y;
GSWindow *window;
GSList *l;
@@ -1111,8 +1116,13 @@ find_window_at_pointer (GSManager *manag
display = gdk_display_get_default ();
device = gdk_seat_get_pointer (gdk_display_get_default_seat (display));
+#if GTK_CHECK_VERSION (3, 22, 0)
gdk_device_get_position (device, NULL, &x, &y);
monitor = gdk_display_get_monitor_at_point (display, x, y);
+#else
+ gdk_device_get_position (device, &screen, &x, &y);
+ monitor = gdk_screen_get_monitor_at_point (screen, x, y);
+#endif
/* Find the gs-window that is on that monitor */
window = NULL;
@@ -1165,14 +1175,24 @@ manager_maybe_grab_window (GSManager *ma
{
GdkDisplay *display;
GdkDevice *device;
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor;
+#else
+ GdkScreen *screen;
+ int monitor;
+#endif
int x, y;
gboolean grabbed;
display = gdk_display_get_default ();
device = gdk_seat_get_pointer (gdk_display_get_default_seat (display));
+#if GTK_CHECK_VERSION (3, 22, 0)
gdk_device_get_position (device, NULL, &x, &y);
monitor = gdk_display_get_monitor_at_point (display, x, y);
+#else
+ gdk_device_get_position (device, &screen, &x, &y);
+ monitor = gdk_screen_get_monitor_at_point (screen, x, y);
+#endif
gdk_flush ();
grabbed = FALSE;
@@ -1524,14 +1544,26 @@ connect_window_signals (GSManager *manag
static void
gs_manager_create_window_for_monitor (GSManager *manager,
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor)
+#else
+ GdkDisplay *display,
+ int monitor)
+#endif
{
GSWindow *window;
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkDisplay *display;
+#endif
GdkRectangle rect;
+#if GTK_CHECK_VERSION (3, 22, 0)
display = gdk_monitor_get_display (monitor);
gdk_monitor_get_geometry (monitor, &rect);
+#else
+ gdk_screen_get_monitor_geometry (gdk_display_get_default_screen (display),
+ monitor, &rect);
+#endif
gs_debug ("Creating a window for the monitor [%d,%d] (%dx%d)",
monitor, rect.x, rect.y, rect.width, rect.height);
@@ -1556,6 +1588,7 @@ gs_manager_create_window_for_monitor (GS
}
}
+#if GTK_CHECK_VERSION (3, 22, 0)
static void
on_display_monitor_added (GdkDisplay *display,
GdkMonitor *monitor,
@@ -1625,6 +1658,85 @@ on_display_monitor_removed (GdkDisplay *
gdk_display_flush (display);
gdk_x11_ungrab_server ();
}
+#else
+static void
+on_screen_monitors_changed (GdkScreen *screen,
+ GSManager *manager)
+{
+ GSList *l;
+ GdkDisplay *display;
+ int n_monitors;
+ int n_windows;
+ int i;
+
+ display = gdk_screen_get_display (screen);
+ n_monitors = gdk_screen_get_n_monitors (screen);
+ n_windows = g_slist_length (manager->priv->windows);
+
+ gs_debug ("Monitors changed for display %s: num=%d",
+ gdk_display_get_name (display),
+ n_monitors);
+
+ if (n_monitors > n_windows)
+ {
+ /* Tear down unlock dialog in case we want to move it
+ * to a new monitor
+ */
+ l = manager->priv->windows;
+ while (l != NULL)
+ {
+ gs_window_cancel_unlock_request (GS_WINDOW (l->data));
+ l = l->next;
+ }
+
+ /* Add more windows */
+ for (i = n_windows; i < n_monitors; ++i)
+ {
+ gs_manager_create_window_for_monitor (manager,
+ display, i);
+ }
+
+ /* And put unlock dialog up where ever it's supposed to be */
+ gs_manager_request_unlock (manager);
+ }
+ else
+ {
+ gdk_x11_grab_server ();
+
+ /* Remove the extra windows */
+ l = manager->priv->windows;
+ while (l != NULL)
+ {
+ GdkDisplay *this_display;
+ int this_monitor;
+ GSList *next = l->next;
+
+ this_display = gs_window_get_display (GS_WINDOW (l->data));
+ this_monitor = gs_window_get_monitor (GS_WINDOW (l->data));
+ if (this_display == display && this_monitor >= n_monitors)
+ {
+ manager_maybe_stop_job_for_window (manager, GS_WINDOW (l->data));
+ g_hash_table_remove (manager->priv->jobs, l->data);
+ gs_window_destroy (GS_WINDOW (l->data));
+ manager->priv->windows = g_slist_delete_link (manager->priv->windows, l);
+ }
+ l = next;
+ }
+
+ /* Make sure there is a lock dialog on a connected monitor,
+ * and that the keyboard is still properly grabbed after all
+ * the windows above got destroyed
+ */
+ if (n_windows > n_monitors)
+ {
+ gs_manager_request_unlock (manager);
+ }
+
+ gdk_display_flush (display);
+ gdk_x11_ungrab_server ();
+ }
+}
+#endif
static void
gs_manager_destroy_windows (GSManager *manager)
@@ -1642,12 +1756,18 @@ gs_manager_destroy_windows (GSManager *m
display = gdk_display_get_default ();
+#if GTK_CHECK_VERSION (3, 22, 0)
g_signal_handlers_disconnect_by_func (display,
on_display_monitor_removed,
manager);
g_signal_handlers_disconnect_by_func (display,
on_display_monitor_added,
manager);
+#else
+ g_signal_handlers_disconnect_by_func (gdk_display_get_default_screen (display),
+ on_screen_monitors_changed,
+ manager);
+#endif
for (l = manager->priv->windows; l; l = l->next)
{
@@ -1703,6 +1823,9 @@ static void
gs_manager_create_windows_for_display (GSManager *manager,
GdkDisplay *display)
{
+#if !GTK_CHECK_VERSION (3, 22, 0)
+ GdkScreen *screen;
+#endif
int n_monitors;
int i;
@@ -1713,15 +1836,25 @@ gs_manager_create_windows_for_display (G
g_object_ref (manager);
g_object_ref (display);
+#if GTK_CHECK_VERSION (3, 22, 0)
n_monitors = gdk_display_get_n_monitors (display);
+#else
+ screen = gdk_display_get_default_screen (display);
+ n_monitors = gdk_screen_get_n_monitors (screen);
+#endif
gs_debug ("Creating %d windows for display %s",
n_monitors, gdk_display_get_name (display));
for (i = 0; i < n_monitors; i++)
{
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *mon = gdk_display_get_monitor (display, i);
gs_manager_create_window_for_monitor (manager, mon);
+#else
+ gs_manager_create_window_for_monitor (manager,
+ display, i);
+#endif
}
g_object_unref (display);
@@ -1739,12 +1872,19 @@ gs_manager_create_windows (GSManager *ma
g_assert (manager->priv->windows == NULL);
display = gdk_display_get_default ();
+#if GTK_CHECK_VERSION (3, 22, 0)
g_signal_connect (display, "monitor-added",
G_CALLBACK (on_display_monitor_added),
manager);
g_signal_connect (display, "monitor-removed",
G_CALLBACK (on_display_monitor_removed),
manager);
+#else
+ g_signal_connect (gdk_display_get_default_screen (display),
+ "monitors-changed",
+ G_CALLBACK (on_screen_monitors_changed),
+ manager);
+#endif
gs_manager_create_windows_for_display (manager, display);
}
--- a/src/gs-window.h
+++ b/src/gs-window.h
@@ -62,8 +62,13 @@ gboolean gs_window_is_dialog_up
GdkDisplay * gs_window_get_display (GSWindow *window);
void gs_window_set_monitor (GSWindow *window,
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor);
GdkMonitor * gs_window_get_monitor (GSWindow *window);
+#else
+ int monitor);
+int gs_window_get_monitor (GSWindow *window);
+#endif
void gs_window_set_background_surface (GSWindow *window,
cairo_surface_t *surface);
@@ -92,7 +97,11 @@ void gs_window_request_unlock
void gs_window_cancel_unlock_request (GSWindow *window);
GSWindow * gs_window_new (GdkDisplay *display,
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor,
+#else
+ int monitor,
+#endif
gboolean lock_enabled);
void gs_window_show (GSWindow *window);
void gs_window_destroy (GSWindow *window);
--- a/src/gs-window-x11.c
+++ b/src/gs-window-x11.c
@@ -62,7 +62,11 @@ enum
struct GSWindowPrivate
{
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor;
+#else
+ int monitor;
+#endif
GdkRectangle geometry;
guint obscured : 1;
@@ -292,35 +296,56 @@ static cairo_region_t *
get_outside_region (GSWindow *window)
{
GdkDisplay *display;
+#if GTK_CHECK_VERSION (3, 22, 0)
int i;
int num_monitors;
+#else
+ GdkScreen *screen;
+ int mon;
+#endif
cairo_region_t *region;
display = gtk_widget_get_display (GTK_WIDGET (window));
+#if !GTK_CHECK_VERSION (3, 22, 0)
+ screen = gdk_display_get_default_screen (display);
+#endif
region = cairo_region_create ();
+#if GTK_CHECK_VERSION (3, 22, 0)
num_monitors = gdk_display_get_n_monitors (display);
for (i = 0; i < num_monitors; i++)
+#else
+ for (mon = 0; mon < window->priv->monitor; mon++)
+#endif
{
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *mon = gdk_display_get_monitor (display, i);
if (mon != window->priv->monitor)
{
+#endif
GdkRectangle geometry;
cairo_rectangle_int_t rectangle;
+#if GTK_CHECK_VERSION (3, 22, 0)
gdk_monitor_get_geometry (mon, &geometry);
+#else
+ gdk_screen_get_monitor_geometry (screen, mon,
+ &geometry);
+#endif
rectangle.x = geometry.x;
rectangle.y = geometry.y;
rectangle.width = geometry.width;
rectangle.height = geometry.height;
cairo_region_union_rectangle (region, &rectangle);
+#if GTK_CHECK_VERSION (3, 22, 0)
}
else
{
break;
}
+#endif
}
return region;
@@ -335,7 +360,13 @@ update_geometry (GSWindow *window)
outside_region = get_outside_region (window);
+#if GTK_CHECK_VERSION (3, 22, 0)
gdk_monitor_get_geometry (window->priv->monitor, &geometry);
+#else
+ gdk_screen_get_monitor_geometry (gtk_widget_get_screen (GTK_WIDGET (window)),
+ window->priv->monitor,
+ &geometry);
+#endif
gs_debug ("got geometry for monitor: x=%d y=%d w=%d h=%d",
geometry.x,
geometry.y,
@@ -1911,7 +1942,11 @@ gs_window_set_status_message (GSWindow
void
gs_window_set_monitor (GSWindow *window,
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor)
+#else
+ int monitor)
+#endif
{
g_return_if_fail (GS_IS_WINDOW (window));
@@ -1927,10 +1962,18 @@ gs_window_set_monitor (GSWindow *windo
g_object_notify (G_OBJECT (window), "monitor");
}
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *
+#else
+int
+#endif
gs_window_get_monitor (GSWindow *window)
{
+#if GTK_CHECK_VERSION (3, 22, 0)
g_return_val_if_fail (GS_IS_WINDOW (window), NULL);
+#else
+ g_return_val_if_fail (GS_IS_WINDOW (window), -1);
+#endif
return window->priv->monitor;
}
@@ -1969,7 +2012,11 @@ gs_window_set_property (GObject
gs_window_set_logout_timeout (self, g_value_get_long (value));
break;
case PROP_MONITOR:
+#if GTK_CHECK_VERSION (3, 22, 0)
gs_window_set_monitor (self, g_value_get_pointer (value));
+#else
+ gs_window_set_monitor (self, g_value_get_int (value));
+#endif
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -2011,7 +2058,11 @@ gs_window_get_property (GObject *obje
g_value_set_long (value, self->priv->logout_timeout);
break;
case PROP_MONITOR:
+#if GTK_CHECK_VERSION (3, 22, 0)
g_value_set_pointer (value, (gpointer) self->priv->monitor);
+#else
+ g_value_set_int (value, self->priv->monitor);
+#endif
break;
case PROP_OBSCURED:
g_value_set_boolean (value, self->priv->obscured);
@@ -2412,10 +2463,19 @@ gs_window_class_init (GSWindowClass *kla
g_object_class_install_property (object_class,
PROP_MONITOR,
+#if GTK_CHECK_VERSION (3, 22, 0)
g_param_spec_pointer ("monitor",
"Gdk monitor",
"The monitor (in terms of Gdk) which the window is on",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+#else
+ g_param_spec_int ("monitor",
+ "RandR monitor",
+ "The monitor (in terms of RandR) which the window is on",
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+#endif
+
}
static void
@@ -2548,7 +2608,11 @@ gs_window_finalize (GObject *object)
GSWindow *
gs_window_new (GdkDisplay *display,
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor,
+#else
+ int monitor,
+#endif
gboolean lock_enabled)
{
GObject *result;
--- a/src/mate-screensaver-preferences.c
+++ b/src/mate-screensaver-preferences.c
@@ -387,10 +387,17 @@ help_display (void)
GError *error;
error = NULL;
+#if GTK_CHECK_VERSION (3, 22, 0)
gtk_show_uri_on_window (NULL,
"help:mate-user-guide/prefs-screensaver",
GDK_CURRENT_TIME,
&error);
+#else
+ gtk_show_uri (NULL,
+ "help:mate-user-guide/prefs-screensaver",
+ GDK_CURRENT_TIME,
+ &error);
+#endif
if (error != NULL)
{
--- a/src/test-window.c
+++ b/src/test-window.c
@@ -123,12 +123,22 @@ test_window (void)
gboolean lock_active;
gboolean user_switch_enabled;
GdkDisplay *display;
+#if GTK_CHECK_VERSION (3, 22, 0)
GdkMonitor *monitor;
+#else
+ GdkScreen *screen;
+ int monitor;
+#endif
lock_active = TRUE;
user_switch_enabled = TRUE;
display = gdk_display_get_default ();
+#if GTK_CHECK_VERSION (3, 22, 0)
monitor = gdk_display_get_primary_monitor (display);
+#else
+ screen = gdk_display_get_default_screen (display);
+ monitor = gdk_screen_get_primary_monitor (screen);
+#endif
window = gs_window_new (display, monitor, lock_active);