author | mickeyl <mickeyl> | 2005-06-20 15:48:41 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2005-06-20 15:48:41 (UTC) |
commit | 53e05ad30759aefd977e301c84b8b60a78819c76 (patch) (unidiff) | |
tree | 0a98e76e6d37c958dae43537dd371de320a6510f | |
parent | 3b02e2a868535628090567ed612d9fdb5b247f61 (diff) | |
download | opie-53e05ad30759aefd977e301c84b8b60a78819c76.zip opie-53e05ad30759aefd977e301c84b8b60a78819c76.tar.gz opie-53e05ad30759aefd977e301c84b8b60a78819c76.tar.bz2 |
an attempt to fix #1377
-rw-r--r-- | core/applets/vtapplet/vt.cpp | 25 | ||||
-rw-r--r-- | core/applets/vtapplet/vt.h | 1 |
2 files changed, 17 insertions, 9 deletions
diff --git a/core/applets/vtapplet/vt.cpp b/core/applets/vtapplet/vt.cpp index 0d4e657..7885f83 100644 --- a/core/applets/vtapplet/vt.cpp +++ b/core/applets/vtapplet/vt.cpp | |||
@@ -11,161 +11,168 @@ | |||
11 | ** | 11 | ** |
12 | **********************************************************************/ | 12 | **********************************************************************/ |
13 | 13 | ||
14 | #include "vt.h" | 14 | #include "vt.h" |
15 | 15 | ||
16 | /* OPIE */ | 16 | /* OPIE */ |
17 | #include <opie2/odebug.h> | 17 | #include <opie2/odebug.h> |
18 | #include <opie2/oresource.h> | 18 | #include <opie2/oresource.h> |
19 | 19 | ||
20 | #include <qpe/applnk.h> | 20 | #include <qpe/applnk.h> |
21 | 21 | ||
22 | using namespace Opie::Core; | 22 | using namespace Opie::Core; |
23 | 23 | ||
24 | /* QT */ | 24 | /* QT */ |
25 | #include <qpopupmenu.h> | 25 | #include <qpopupmenu.h> |
26 | 26 | ||
27 | /* STD */ | 27 | /* STD */ |
28 | #include <fcntl.h> | 28 | #include <fcntl.h> |
29 | #include <unistd.h> | 29 | #include <unistd.h> |
30 | #include <sys/types.h> | 30 | #include <sys/types.h> |
31 | #include <sys/stat.h> | 31 | #include <sys/stat.h> |
32 | #include <sys/ioctl.h> | 32 | #include <sys/ioctl.h> |
33 | #include <linux/vt.h> | 33 | #include <linux/vt.h> |
34 | 34 | ||
35 | VTApplet::VTApplet ( ) | 35 | VTApplet::VTApplet() |
36 | : QObject ( 0, "VTApplet" ) | 36 | :QObject( 0, "VTApplet" ), m_ourVT( 0 ) |
37 | { | 37 | { |
38 | } | 38 | } |
39 | 39 | ||
40 | VTApplet::~VTApplet ( ) | 40 | VTApplet::~VTApplet() |
41 | { | 41 | { |
42 | } | 42 | } |
43 | 43 | ||
44 | int VTApplet::position ( ) const | 44 | int VTApplet::position() const |
45 | { | 45 | { |
46 | return 2; | 46 | return 2; |
47 | } | 47 | } |
48 | 48 | ||
49 | QString VTApplet::name ( ) const | 49 | QString VTApplet::name() const |
50 | { | 50 | { |
51 | return tr( "VT shortcut" ); | 51 | return tr( "VT shortcut" ); |
52 | } | 52 | } |
53 | 53 | ||
54 | QString VTApplet::text ( ) const | 54 | QString VTApplet::text() const |
55 | { | 55 | { |
56 | return tr( "Terminal" ); | 56 | return tr( "Terminal" ); |
57 | } | 57 | } |
58 | 58 | ||
59 | /* | 59 | /* |
60 | QString VTApplet::tr( const char* s ) const | 60 | QString VTApplet::tr( const char* s ) const |
61 | { | 61 | { |
62 | return qApp->translate( "VTApplet", s, 0 ); | 62 | return qApp->translate( "VTApplet", s, 0 ); |
63 | } | 63 | } |
64 | 64 | ||
65 | QString VTApplet::tr( const char* s, const char* p ) const | 65 | QString VTApplet::tr( const char* s, const char* p ) const |
66 | { | 66 | { |
67 | return qApp->translate( "VTApplet", s, p ); | 67 | return qApp->translate( "VTApplet", s, p ); |
68 | } | 68 | } |
69 | */ | 69 | */ |
70 | 70 | ||
71 | QIconSet VTApplet::icon ( ) const | 71 | QIconSet VTApplet::icon() const |
72 | { | 72 | { |
73 | QPixmap pix = Opie::Core::OResource::loadPixmap( "terminal", Opie::Core::OResource::SmallIcon ); | 73 | QPixmap pix = Opie::Core::OResource::loadPixmap( "terminal", Opie::Core::OResource::SmallIcon ); |
74 | return pix; | 74 | return pix; |
75 | } | 75 | } |
76 | 76 | ||
77 | QPopupMenu *VTApplet::popup ( QWidget* parent ) const | 77 | QPopupMenu *VTApplet::popup( QWidget* parent ) const |
78 | { | 78 | { |
79 | odebug << "VTApplet::popup" << oendl; | 79 | odebug << "VTApplet::popup" << oendl; |
80 | 80 | ||
81 | struct vt_stat vtstat; | 81 | struct vt_stat vtstat; |
82 | #ifdef QT_QWS_DEVFS | 82 | #ifdef QT_QWS_DEVFS |
83 | int fd = ::open( "/dev/vc/0", O_RDWR ); | 83 | int fd = ::open( "/dev/vc/0", O_RDWR ); |
84 | #else | 84 | #else |
85 | int fd = ::open( "/dev/tty0", O_RDWR ); | 85 | int fd = ::open( "/dev/tty0", O_RDWR ); |
86 | #endif | 86 | #endif |
87 | if ( fd == -1 ) return 0; | 87 | if ( fd == -1 ) return 0; |
88 | if ( ioctl( fd, VT_GETSTATE, &vtstat ) == -1 ) return 0; | 88 | if ( ioctl( fd, VT_GETSTATE, &vtstat ) == -1 ) return 0; |
89 | 89 | ||
90 | m_subMenu = new QPopupMenu( parent ); | 90 | m_subMenu = new QPopupMenu( parent ); |
91 | m_subMenu->setCheckable( true ); | 91 | m_subMenu->setCheckable( true ); |
92 | for ( int i = 1; i < 10; ++i ) | 92 | for ( int i = 1; i < 10; ++i ) |
93 | { | 93 | { |
94 | int id = m_subMenu->insertItem( QString::number( i ), 500+i ); | 94 | int id = m_subMenu->insertItem( QString::number( i ), 500+i ); |
95 | m_subMenu->setItemChecked( id, id-500 == vtstat.v_active ); | 95 | m_subMenu->setItemChecked( id, id-500 == vtstat.v_active ); |
96 | } | 96 | } |
97 | ::close( fd ); | 97 | ::close( fd ); |
98 | 98 | ||
99 | m_ourVT = vtstat.v_active; | ||
100 | |||
99 | connect( m_subMenu, SIGNAL( activated(int) ), this, SLOT( changeVT(int) ) ); | 101 | connect( m_subMenu, SIGNAL( activated(int) ), this, SLOT( changeVT(int) ) ); |
100 | connect( m_subMenu, SIGNAL( aboutToShow() ), this, SLOT( updateMenu() ) ); | 102 | connect( m_subMenu, SIGNAL( aboutToShow() ), this, SLOT( updateMenu() ) ); |
101 | 103 | ||
102 | return m_subMenu; | 104 | return m_subMenu; |
103 | } | 105 | } |
104 | 106 | ||
105 | 107 | ||
106 | void VTApplet::changeVT( int index ) | 108 | void VTApplet::changeVT( int index ) |
107 | { | 109 | { |
108 | //odebug << "VTApplet::changeVT( " << index-500 << " )" << oendl; | 110 | //odebug << "VTApplet::changeVT( " << index-500 << " )" << oendl; |
109 | 111 | ||
110 | #ifdef QT_QWS_DEVFS | 112 | #ifdef QT_QWS_DEVFS |
111 | int fd = ::open("/dev/vc/0", O_RDWR); | 113 | int fd = ::open("/dev/vc/0", O_RDWR); |
112 | #else | 114 | #else |
113 | int fd = ::open("/dev/tty0", O_RDWR); | 115 | int fd = ::open("/dev/tty0", O_RDWR); |
114 | #endif | 116 | #endif |
115 | if ( fd == -1 ) return; | 117 | if ( fd == -1 ) return; |
116 | ioctl( fd, VT_ACTIVATE, index-500 ); | 118 | ioctl( fd, VT_ACTIVATE, index-500 ); |
119 | if ( m_ourVT ) | ||
120 | { | ||
121 | odebug << "VTApplet::waiting for user to return to VT " << m_ourVT << oendl; | ||
122 | ioctl( fd, VT_WAITACTIVE, m_ourVT ); | ||
123 | } | ||
117 | } | 124 | } |
118 | 125 | ||
119 | 126 | ||
120 | void VTApplet::updateMenu() | 127 | void VTApplet::updateMenu() |
121 | { | 128 | { |
122 | //odebug << "VTApplet::updateMenu()" << oendl; | 129 | //odebug << "VTApplet::updateMenu()" << oendl; |
123 | 130 | ||
124 | int fd = ::open( "/dev/console", O_RDONLY ); | 131 | int fd = ::open( "/dev/console", O_RDONLY ); |
125 | if ( fd == -1 ) return; | 132 | if ( fd == -1 ) return; |
126 | 133 | ||
127 | for ( int i = 1; i < 10; ++i ) | 134 | for ( int i = 1; i < 10; ++i ) |
128 | { | 135 | { |
129 | int result = ioctl( fd, VT_DISALLOCATE, i ); | 136 | int result = ioctl( fd, VT_DISALLOCATE, i ); |
130 | 137 | ||
131 | /* | 138 | /* |
132 | if ( result == -1 ) | 139 | if ( result == -1 ) |
133 | odebug << "VT " << i << " disallocated == free" << oendl; | 140 | odebug << "VT " << i << " disallocated == free" << oendl; |
134 | else | 141 | else |
135 | odebug << "VT " << i << " _not_ disallocated == busy" << oendl; | 142 | odebug << "VT " << i << " _not_ disallocated == busy" << oendl; |
136 | */ | 143 | */ |
137 | 144 | ||
138 | m_subMenu->setItemEnabled( 500+i, result == -1 ); | 145 | m_subMenu->setItemEnabled( 500+i, result == -1 ); |
139 | } | 146 | } |
140 | 147 | ||
141 | ::close( fd ); | 148 | ::close( fd ); |
142 | } | 149 | } |
143 | 150 | ||
144 | 151 | ||
145 | void VTApplet::activated() | 152 | void VTApplet::activated() |
146 | { | 153 | { |
147 | odebug << "VTApplet::activated()" << oendl; | 154 | odebug << "VTApplet::activated()" << oendl; |
148 | } | 155 | } |
149 | 156 | ||
150 | 157 | ||
151 | QRESULT VTApplet::queryInterface ( const QUuid &uuid, QUnknownInterface **iface ) | 158 | QRESULT VTApplet::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) |
152 | { | 159 | { |
153 | *iface = 0; | 160 | *iface = 0; |
154 | if ( uuid == IID_QUnknown ) | 161 | if ( uuid == IID_QUnknown ) |
155 | *iface = this; | 162 | *iface = this; |
156 | else if ( uuid == IID_MenuApplet ) | 163 | else if ( uuid == IID_MenuApplet ) |
157 | *iface = this; | 164 | *iface = this; |
158 | else | 165 | else |
159 | return QS_FALSE; | 166 | return QS_FALSE; |
160 | 167 | ||
161 | if ( *iface ) | 168 | if ( *iface ) |
162 | (*iface)-> addRef ( ); | 169 | (*iface)-> addRef ( ); |
163 | return QS_OK; | 170 | return QS_OK; |
164 | } | 171 | } |
165 | 172 | ||
166 | Q_EXPORT_INTERFACE( ) | 173 | Q_EXPORT_INTERFACE( ) |
167 | { | 174 | { |
168 | Q_CREATE_INSTANCE( VTApplet ) | 175 | Q_CREATE_INSTANCE( VTApplet ) |
169 | } | 176 | } |
170 | 177 | ||
171 | 178 | ||
diff --git a/core/applets/vtapplet/vt.h b/core/applets/vtapplet/vt.h index 4c92ddd..4fa73e5 100644 --- a/core/applets/vtapplet/vt.h +++ b/core/applets/vtapplet/vt.h | |||
@@ -25,28 +25,29 @@ class VTApplet : public QObject, public MenuAppletInterface | |||
25 | 25 | ||
26 | public: | 26 | public: |
27 | VTApplet ( ); | 27 | VTApplet ( ); |
28 | virtual ~VTApplet ( ); | 28 | virtual ~VTApplet ( ); |
29 | 29 | ||
30 | QRESULT queryInterface( const QUuid&, QUnknownInterface** ); | 30 | QRESULT queryInterface( const QUuid&, QUnknownInterface** ); |
31 | Q_REFCOUNT | 31 | Q_REFCOUNT |
32 | 32 | ||
33 | virtual int position() const; | 33 | virtual int position() const; |
34 | 34 | ||
35 | virtual QString name ( ) const; | 35 | virtual QString name ( ) const; |
36 | virtual QIconSet icon ( ) const; | 36 | virtual QIconSet icon ( ) const; |
37 | virtual QString text ( ) const; | 37 | virtual QString text ( ) const; |
38 | //virtual QString tr( const char* ) const; | 38 | //virtual QString tr( const char* ) const; |
39 | //virtual QString tr( const char*, const char* ) const; | 39 | //virtual QString tr( const char*, const char* ) const; |
40 | virtual QPopupMenu *popup ( QWidget *parent ) const; | 40 | virtual QPopupMenu *popup ( QWidget *parent ) const; |
41 | 41 | ||
42 | virtual void activated (); | 42 | virtual void activated (); |
43 | 43 | ||
44 | public slots: | 44 | public slots: |
45 | virtual void changeVT( int index ); | 45 | virtual void changeVT( int index ); |
46 | virtual void updateMenu(); | 46 | virtual void updateMenu(); |
47 | private: | 47 | private: |
48 | mutable QPopupMenu* m_subMenu; | 48 | mutable QPopupMenu* m_subMenu; |
49 | mutable int m_ourVT; | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | 52 | ||
52 | #endif | 53 | #endif |