summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2009-11-27 18:27:53 -0500
committerRay Strode <rstrode@redhat.com>2012-05-05 21:41:54 -0400
commitc93d98b646a9a4fce3052260a1f08808d62d7155 (patch)
tree3af9762bcbabc764442611f176b672de6897ff99
parentf2d4f94df5f3e4a3cb5d53721785527a576c26ce (diff)
downloadgdm-c93d98b646a9a4fce3052260a1f08808d62d7155.tar.gz
daemon: save root window to pixmap at _XROOTPMAP_ID
This combined with starting the X server with -background none will give distros using plymouth (or potentially other boot splashes) a a nice fade transition when g-s-d starts. https://bugzilla.gnome.org/show_bug.cgi?id=572173
-rw-r--r--daemon/gdm-simple-slave.c8
-rw-r--r--daemon/gdm-slave.c72
-rw-r--r--daemon/gdm-slave.h1
3 files changed, 81 insertions, 0 deletions
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 9d1347ad..fc8649c5 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -1215,6 +1215,14 @@ setup_server (GdmSimpleSlave *slave)
/* Set the initial keyboard layout to something reasonable */
gdm_slave_set_initial_keyboard_layout (GDM_SLAVE (slave));
+ /* The root window has a background that may be useful
+ * to cross fade or transition from when setting the
+ * login screen background. We read it here, and stuff
+ * it into the standard _XROOTPMAP_ID root window property,
+ * so gnome-settings-daemon can get at it.
+ */
+ gdm_slave_save_root_windows (GDM_SLAVE (slave));
+
}
static void
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index a5ce62f4..53633c0d 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -43,6 +43,7 @@
#include <dbus/dbus-glib-lowlevel.h>
#include <X11/Xlib.h> /* for Display */
+#include <X11/Xatom.h> /* for XA_PIXMAP */
#include <X11/cursorfont.h> /* for watch cursor */
#include <X11/extensions/Xrandr.h>
#include <X11/Xatom.h>
@@ -364,6 +365,77 @@ gdm_slave_run_script (GdmSlave *slave,
return ret;
}
+static void
+gdm_slave_save_root_window_of_screen (GdmSlave *slave,
+ Atom id_atom,
+ int screen_number)
+{
+ Window root_window;
+ GC gc;
+ XGCValues values;
+ Pixmap pixmap;
+ int width, height, depth;
+
+ root_window = RootWindow (slave->priv->server_display,
+ screen_number);
+
+ width = DisplayWidth (slave->priv->server_display, screen_number);
+ height = DisplayHeight (slave->priv->server_display, screen_number);
+ depth = DefaultDepth (slave->priv->server_display, screen_number);
+ pixmap = XCreatePixmap (slave->priv->server_display,
+ root_window,
+ width, height, depth);
+
+ values.function = GXcopy;
+ values.plane_mask = AllPlanes;
+ values.fill_style = FillSolid;
+ values.subwindow_mode = IncludeInferiors;
+
+ gc = XCreateGC (slave->priv->server_display,
+ root_window,
+ GCFunction | GCPlaneMask | GCFillStyle | GCSubwindowMode,
+ &values);
+
+ if (XCopyArea (slave->priv->server_display,
+ root_window, pixmap, gc, 0, 0,
+ width, height, 0, 0)) {
+
+ long pixmap_as_long;
+
+ pixmap_as_long = (long) pixmap;
+
+ XChangeProperty (slave->priv->server_display,
+ root_window, id_atom, XA_PIXMAP,
+ 32, PropModeReplace, (guchar *) &pixmap_as_long,
+ 1);
+
+ }
+
+ XFreeGC (slave->priv->server_display, gc);
+}
+
+void
+gdm_slave_save_root_windows (GdmSlave *slave)
+{
+ int i, number_of_screens;
+ Atom atom;
+
+ number_of_screens = ScreenCount (slave->priv->server_display);
+
+ atom = XInternAtom (slave->priv->server_display,
+ "_XROOTPMAP_ID", False);
+
+ if (atom == 0) {
+ return;
+ }
+
+ for (i = 0; i < number_of_screens; i++) {
+ gdm_slave_save_root_window_of_screen (slave, atom, i);
+ }
+
+ XSync (slave->priv->server_display, False);
+}
+
void
gdm_slave_set_initial_keyboard_layout (GdmSlave *slave)
{
diff --git a/daemon/gdm-slave.h b/daemon/gdm-slave.h
index 7af20edf..aaaa8f23 100644
--- a/daemon/gdm-slave.h
+++ b/daemon/gdm-slave.h
@@ -78,6 +78,7 @@ void gdm_slave_set_initial_keyboard_layout (GdmSlave *slave);
void gdm_slave_set_initial_cursor_position (GdmSlave *slave);
void gdm_slave_set_busy_cursor (GdmSlave *slave);
+void gdm_slave_save_root_windows (GdmSlave *slave);
gboolean gdm_slave_run_script (GdmSlave *slave,
const char *dir,
const char *username);