diff -up kdebase-workspace-4.4.92/kdm/backend/dm.c.kdm_plymouth kdebase-workspace-4.4.92/kdm/backend/dm.c --- kdebase-workspace-4.4.92/kdm/backend/dm.c.kdm_plymouth 2010-07-06 01:54:30.000000000 -0500 +++ kdebase-workspace-4.4.92/kdm/backend/dm.c 2010-07-07 13:55:48.425171749 -0500 @@ -1329,6 +1329,81 @@ getBusyVTs(void) return activeVTs; } +static int +get_active_vt (void) +{ + int console_fd; + struct vt_stat console_state = { 0 }; + console_fd = open ("/dev/tty0", O_RDONLY | O_NOCTTY); + if (console_fd < 0) { + goto out; + } + if (ioctl (console_fd, VT_GETSTATE, &console_state) < 0) { + goto out; + } +out: + if (console_fd >= 0) { + close (console_fd); + } + return console_state.v_active; +} + +static int +plymouth_is_running (void) +{ + int status; + status = system ("/bin/plymouth --ping"); + + return WIFEXITED (status) && WEXITSTATUS (status) == 0; +} + +static int +plymouth_has_active_vt (void) +{ + int status; + status = system ("/bin/plymouth --has-active-vt"); + + return WIFEXITED (status) && WEXITSTATUS (status) == 0; +} + +static int +plymouth_prepare_for_transition (void) +{ + int status; + status = system ("/bin/plymouth deactivate"); + + return WIFEXITED (status) && WEXITSTATUS (status) == 0; +} + +int +plymouth_quit_with_transition (void) +{ + int status; + status = system ("/bin/plymouth quit --retain-splash"); + + return WIFEXITED (status) && WEXITSTATUS (status) == 0; +} + +static int +plymouth_quit_without_transition (void) +{ + int status; + status = system ("/bin/plymouth quit"); + + return WIFEXITED (status) && WEXITSTATUS (status) == 0; +} + +static int +triggered_to_force_display_on_active_vt (void) +{ + int should_force_display_on_active_vt; + should_force_display_on_active_vt=open("/var/spool/gdm/force-display-on-active-vt", O_RDONLY); + if ( should_force_display_on_active_vt >= 0 ) + close(should_force_display_on_active_vt); + unlink("/var/spool/gdm/force-display-on-active-vt"); + return should_force_display_on_active_vt; +} + static void allocateVT(struct display *d) { @@ -1338,6 +1413,43 @@ allocateVT(struct display *d) if ((d->displayType & d_location) == dLocal && d->status == notRunning && !d->serverVT && d->reqSrvVT >= 0) { + /* check for plymouth using newer methods */ + d->plymouth_is_running = plymouth_is_running (); + if (d->plymouth_is_running) { + /* call plymouth deactivate */ + plymouth_prepare_for_transition (); + if (plymouth_has_active_vt ()) { + /* plymouth was displaying a splash screen and has + * terminated leaving it on screen + */ + int vt; + vt = get_active_vt (); + if (vt > 0) { + /* start the X server on the active vt */ + d->serverVT = vt; + return; + } + } + else { + /* plymouth might have been running but did not display + * a splash screen. + */ + + /* call plymouth quit and start the X server as usual */ + d->plymouth_is_running = !plymouth_quit_without_transition (); + } + + /* fallback to old/deprecated method */ + } else if ( triggered_to_force_display_on_active_vt() >= 0 ) { + int vt; + vt = get_active_vt(); + if (vt > 0) { + d->serverVT = vt; + return; + } + } + + if (d->reqSrvVT && d->reqSrvVT < 16) { d->serverVT = d->reqSrvVT; } else { diff -up kdebase-workspace-4.4.92/kdm/backend/dm.h.kdm_plymouth kdebase-workspace-4.4.92/kdm/backend/dm.h --- kdebase-workspace-4.4.92/kdm/backend/dm.h.kdm_plymouth 2010-07-06 01:54:30.000000000 -0500 +++ kdebase-workspace-4.4.92/kdm/backend/dm.h 2010-07-07 13:48:11.874921158 -0500 @@ -292,6 +292,8 @@ struct display { int authNum; /* number of authorizations */ char *authFile; /* file to store authorization in */ char *greeterAuthFile; /* file to store authorization for greeter in */ + + int plymouth_is_running; /* Plymouth's status */ }; #define d_location 1 @@ -404,6 +406,8 @@ int anyDisplaysLeft(void); void forEachDisplay(void (*f)(struct display *)); #ifdef HAVE_VTS void forEachDisplayRev(void (*f)(struct display *)); +/* function for plymouth */ +int plymouth_quit_with_transition (void); #endif void removeDisplay(struct display *old); struct display diff -up kdebase-workspace-4.4.92/kdm/backend/server.c.kdm_plymouth kdebase-workspace-4.4.92/kdm/backend/server.c --- kdebase-workspace-4.4.92/kdm/backend/server.c.kdm_plymouth 2010-07-06 01:54:30.000000000 -0500 +++ kdebase-workspace-4.4.92/kdm/backend/server.c 2010-07-07 13:56:46.960921366 -0500 @@ -137,6 +137,11 @@ startServerSuccess() struct display *d = startingServer; d->serverStatus = ignore; serverTimeout = TO_INF; + if (d->plymouth_is_running) { + debug( "Quitting Plymouth with transition\n" ); + d->plymouth_is_running = !plymouth_quit_with_transition (); + debug ("Is Plymouth still running? %s\n", d->plymouth_is_running ? "yes" : "no"); + } debug("X server ready, starting session\n"); startDisplayP2(d); }