mirror of
https://abf.rosa.ru/djam/kdebase4-workspace.git
synced 2025-02-24 10:12:50 +00:00
165 lines
5.5 KiB
Diff
165 lines
5.5 KiB
Diff
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);
|
|
}
|