-/*
+ /*
* gdkscreen-x11.c
*
* Copyright 2001 Sun Microsystems Inc.
}
static void
-deinit_multihead (GdkScreen *screen)
+free_monitors (GdkX11Monitor *monitors,
+ gint n_monitors)
{
- GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
int i;
- for (i = 0; i < screen_x11->n_monitors; ++i)
+ for (i = 0; i < n_monitors; ++i)
{
- GdkX11Monitor *monitor = get_monitor (screen, i);
-
- g_free (monitor->output_name);
- g_free (monitor->manufacturer);
+ g_free (monitors[i].output_name);
+ g_free (monitors[i].manufacturer);
}
- g_free (screen_x11->monitors);
+ g_free (monitors);
+}
+
+static void
+deinit_multihead (GdkScreen *screen)
+{
+ GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
+
+ free_monitors (screen_x11->monitors, screen_x11->n_monitors);
screen_x11->n_monitors = 0;
screen_x11->monitors = NULL;
}
+static gboolean
+compare_monitor (GdkX11Monitor *m1,
+ GdkX11Monitor *m2)
+{
+ if (m1->geometry.x != m2->geometry.x ||
+ m1->geometry.y != m2->geometry.y ||
+ m1->geometry.width != m2->geometry.width ||
+ m1->geometry.height != m2->geometry.height)
+ return FALSE;
+
+ if (m1->width_mm != m2->width_mm ||
+ m1->height_mm != m2->height_mm)
+ return FALSE;
+
+ if (g_strcmp0 (m1->output_name, m2->output_name) != 0)
+ return FALSE;
+
+ if (g_strcmp0 (m1->manufacturer, m2->manufacturer) != 0)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+compare_monitors (GdkX11Monitor *monitors1, gint n_monitors1,
+ GdkX11Monitor *monitors2, gint n_monitors2)
+{
+ gint i;
+
+ if (n_monitors1 != n_monitors2)
+ return FALSE;
+
+ for (i = 0; i < n_monitors1; i++)
+ {
+ if (!compare_monitor (monitors1 + i, monitors2 + i))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
init_multihead (GdkScreen *screen)
{
GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
int opcode, firstevent, firsterror;
- deinit_multihead (screen);
-
/* There are four different implementations of multihead support:
*
* 1. Fake Xinerama for debugging purposes
#endif
}
+static void
+process_monitors_change (GdkScreen *screen)
+{
+ GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
+ gint n_monitors;
+ GdkX11Monitor *monitors;
+ gboolean changed;
+
+ n_monitors = screen_x11->n_monitors;
+ monitors = screen_x11->monitors;
+
+ screen_x11->n_monitors = 0;
+ screen_x11->monitors = NULL;
+
+ init_multihead (screen);
+
+ changed = !compare_monitors (monitors, n_monitors,
+ screen_x11->monitors, screen_x11->n_monitors);
+
+ free_monitors (monitors, n_monitors);
+
+ if (changed)
+ g_signal_emit_by_name (screen, "monitors-changed");
+}
+
void
_gdk_x11_screen_size_changed (GdkScreen *screen,
XEvent *event)
{
gint width, height;
+ GdkDisplayX11 *display_x11;
+ gboolean monitors_changed;
width = gdk_screen_get_width (screen);
height = gdk_screen_get_height (screen);
#ifdef HAVE_RANDR
- if (!XRRUpdateConfiguration (event))
+ display_x11 = GDK_DISPLAY_X11 (gdk_screen_get_display (screen));
+
+ if (display_x11->have_randr13 && event->type == ConfigureNotify)
return;
+
+ XRRUpdateConfiguration (event);
#else
if (event->type == ConfigureNotify)
{
return;
#endif
- if (width == gdk_screen_get_width (screen) &&
- height == gdk_screen_get_height (screen))
- return;
-
- _gdk_x11_screen_process_monitors_change (screen);
-
- g_signal_emit_by_name (screen, "size-changed");
-}
-
-void
-_gdk_x11_screen_process_monitors_change (GdkScreen *screen)
-{
- init_multihead (screen);
+ process_monitors_change (screen);
- g_signal_emit_by_name (screen, "monitors-changed");
+ if (width != gdk_screen_get_width (screen) ||
+ height != gdk_screen_get_height (screen))
+ g_signal_emit_by_name (screen, "size-changed");
}
void
{
screen_x11->is_composited = composited;
- g_signal_emit_by_name (screen, "composited_changed");
+ g_signal_emit_by_name (screen, "composited-changed");
}
}
#endif