# # 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 +#include +#include +#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 + * Added a new command line option which only is relevant if the application is created as a GuiServer. + * The option is -terminal , where 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; --- 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;