summaryrefslogtreecommitdiff
path: root/kde-base/kdm/files/kdebase-workspace-4.4.92-kdm_plymouth081.patch
blob: 2c49ccd48098717885a09c1829997b6728a162ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
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);
 }