summaryrefslogtreecommitdiff
path: root/qte/qte-2.3.7/vt-switch.patch
blob: be2745c9869f64a9822ee02b5b4fbb7bbb6549be (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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205

#
# Patch managed by http://www.holgerschurig.de/patcher.html
#

--- qt-2.3.7/src/kernel/qapplication_qws.cpp~vt-switch.patch
+++ qt-2.3.7/src/kernel/qapplication_qws.cpp
@@ -123,6 +123,12 @@
 static int qt_thread_pipe[2];
 #endif
 
+#if defined(_OS_LINUX_)
+#include <sys/ioctl.h>
+#include <linux/vt.h>
+#include <linux/kd.h>
+#endif
+
 const int qwsSharedRamSize = 32 * 1024;	//Small amount to fit on small devices.
 
 // These are in qapplication.cpp in qt/main
@@ -163,6 +169,8 @@
 bool qws_accel = TRUE;	    // ### never set
 const char *qws_display_spec = ":0";
 int qws_display_id = 0;
+int qws_terminal_id = 0;
+int qws_terminal_old = 0;
 int qws_client_id = 0;
 QWidget *qt_pressGrab = 0;
 QWidget *qt_mouseGrb = 0;
@@ -1628,6 +1636,15 @@
 	    type = QApplication::GuiServer;
 	} else if ( arg == "-interlaced" ) {
 	    qws_screen_is_interlaced = TRUE;
+    } else if ( arg == "-terminal" ) {
+    if ( ++i < argc )
+        {
+            if ( ( qws_terminal_id = atoi( argv[i] ) ) < 1 )
+            {
+                qWarning( "Ignoring Invalid Terminal Specification." );
+                qws_terminal_id = 0;
+            }
+        }
 	} else if ( arg == "-display" ) {
 	    if ( ++i < argc )
 		qws_display_spec = argv[i];
@@ -1652,6 +1669,53 @@
     if ( type == QApplication::GuiServer ) {
 	qt_appType = type;
 	qws_single_process = TRUE;
+
+    /* Allocate a dedicated virtual terminal -- (C) Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de>
+     * Added a new command line option which only is relevant if the application is created as a GuiServer.
+     * The option is -terminal <num>, where <num> specifies the virtual terminal to be occupied by the server.
+     * As default in Linux, 0 means the current virtual terminal.
+     */
+    #if defined(_OS_LINUX_)
+    if ( qws_terminal_id )
+    {
+        qDebug( "qt_init() - terminal specification is '%d'.", qws_terminal_id );
+        struct vt_stat console_stat;
+        int console_fd = ::open( QString().sprintf( "/dev/tty%d", qws_terminal_id ).latin1(), O_RDWR );
+        if ( console_fd == -1)
+        {
+            qWarning( "qt_init() - can't open tty: %s", strerror( errno ) );
+            exit( -1 );
+        }
+        if ( ioctl( console_fd, VT_GETSTATE, &console_stat ) == -1 )
+        {
+            qWarning( "qt_init() - can't ioctl(VT_GETSTATE): %s", strerror( errno ) );
+            exit( -1 );
+        }
+        qws_terminal_old = console_stat.v_active;
+        qDebug( "qt_init() - active vt is #%d, switching to #%d as requested...", qws_terminal_old, qws_terminal_id );
+
+        if ( ioctl( console_fd, VT_ACTIVATE, qws_terminal_id ) == -1 )
+        {
+            qWarning( "qt_init() - can't ioctl(VT_ACTIVATE): %s", strerror( errno ) );
+            exit( -1 );
+        }
+        if ( ioctl( console_fd, VT_WAITACTIVE, qws_terminal_id ) == -1 )
+        {
+            qWarning( "qt_init() - can't ioctl(VT_WAITACTIVE): %s", strerror( errno ) );
+            exit( -1 );
+        }
+        if ( ioctl( console_fd, KDSETMODE, KD_GRAPHICS ) == -1 )
+        {
+            qWarning( "qt_init() - can't ioctl(KDSETMODE:KD_GRAPHICS): %s", strerror( errno ) );
+            exit( -1 );
+        }
+        ::close( console_fd );
+    }
+    else
+    {
+        qDebug( "QWSApplication::qt_init() - current terminal specified." );
+    }
+    #endif
 	QWSServer::startup(flags);
 	setenv("QWS_DISPLAY", qws_display_spec, 0);
     }
@@ -1702,7 +1766,36 @@
     QFontManager::cleanup();
 
     if ( qws_single_process ) {
-	QWSServer::closedown();
+        qDebug( "qt_cleanup() - shutting down QWSServer..." );
+#ifndef QT_NO_QWS_KEYBOARD
+        if ( qwsServer )
+            qwsServer->closeKeyboard();
+#endif
+        QWSServer::closedown();
+#if defined(_OS_LINUX_)
+        if ( qws_terminal_old > 0 )
+        {
+            qDebug( "qt_cleanup() - switching back to virtual terminal #%d", qws_terminal_old );
+
+            int console_fd = ::open( "/dev/tty0", O_RDWR );
+            if ( console_fd == -1)
+            {
+                qWarning( "qt_init() - can't open tty: %s", strerror( errno ) );
+            }
+            else
+            {
+                if ( ioctl( console_fd, KDSETMODE, KD_TEXT ) == -1 )
+                {
+                    qWarning( "qt_init() - can't ioctl(KDSETMODE:KD_TEXT): %s", strerror( errno ) );
+                }
+                if ( ioctl( console_fd, VT_ACTIVATE, qws_terminal_old ) == -1 )
+                {
+                    qWarning( "qt_init() - can't ioctl(VT_ACTIVATE): %s", strerror( errno ) );
+                }
+                ::close( console_fd );
+            }
+        }
+#endif
     }
     if ( qt_is_gui_used ) {
 	delete qt_fbdpy;
@@ -2584,7 +2677,7 @@
     if ( !widget ) {				// don't know this window
 	if ( !QWidget::mouseGrabber()
 #ifndef QT_NO_QWS_MANAGER
-	    && !QWSManager::grabbedMouse() 
+	    && !QWSManager::grabbedMouse()
 #endif
 	    ) {
 	    qt_last_cursor = 0xffffffff; // cursor can be changed by another application
@@ -3394,7 +3487,7 @@
 #ifndef QT_NO_QWS_IM
 			    if ( mouse.state&button && w != QInputContext::microFocusWidget() ) //button press
 				QInputContext::reset( oldFocus );
-#endif	
+#endif
 			    QFocusEvent::setReason( QFocusEvent::Mouse);
 			    w->setFocus();
 			    QFocusEvent::resetReason();
@@ -3540,7 +3633,7 @@
 		    QApplication::sendEvent( widget, &enter );
 		    (*mouseInWidget) = widget;
 #ifndef QT_NO_QWS_IM
-		    if ( e.type() == QEvent::MouseButtonPress && 
+		    if ( e.type() == QEvent::MouseButtonPress &&
 			 !widget->testWFlags( Qt::WStyle_Tool ) &&
 			 !widget->topLevelWidget()->testWFlags( Qt::WStyle_Tool ) )
 			QInputContext::reset( oldFocus );
--- qt-2.3.7/src/kernel/qkeyboard_qws.cpp~vt-switch.patch
+++ qt-2.3.7/src/kernel/qkeyboard_qws.cpp
@@ -1068,6 +1068,24 @@
 {
     if (kbdFD >= 0)
     {
+
+#if !defined(_OS_FREEBSD_) && !defined(_OS_SOLARIS_)
+        struct vt_mode vtMode;
+        ioctl(kbdFD, VT_GETMODE, &vtMode);
+
+        /* Mickey says: "Better give up control of VT switching.
+         *               Hey, I really hate that OS-will-reacquire-resources on process-death
+         *               kind of thinking!
+         */
+        vtMode.mode = VT_AUTO;
+        vtMode.relsig = 0;
+        vtMode.acqsig = 0;
+        ioctl(kbdFD, VT_SETMODE, &vtMode);
+
+        signal(VTSWITCHSIG, 0);
+        qDebug( "~QWSTtyKeyboardHandler() - released VT." );
+#endif
+
 #if !defined(_OS_FREEBSD_) && !defined(_OS_SOLARIS_)
 	ioctl(kbdFD, KDSKBMODE, K_XLATE);
 #endif
--- qt-2.3.7/src/kernel/qgfxlinuxfb_qws.cpp~vt-switch.patch
+++ qt-2.3.7/src/kernel/qgfxlinuxfb_qws.cpp
@@ -251,9 +251,9 @@
 
 bool QLinuxFbScreen::initDevice()
 {
-    // No blankin' screen, no blinkin' cursor!, no cursor!
+    /* Setting up the VT parameters is done in qapplication_qws.cpp
     const char termctl[]="\033[9;0]\033[?33l\033[?25l";
-    writeTerm(termctl,sizeof(termctl));
+    writeTerm(termctl,sizeof(termctl)); */
 
     // Grab current mode so we can reset it
     fb_var_screeninfo vinfo;