summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/applets/vtapplet/vt.cpp41
-rw-r--r--core/applets/vtapplet/vt.h1
2 files changed, 31 insertions, 11 deletions
diff --git a/core/applets/vtapplet/vt.cpp b/core/applets/vtapplet/vt.cpp
index 6200447..4cc2d60 100644
--- a/core/applets/vtapplet/vt.cpp
+++ b/core/applets/vtapplet/vt.cpp
@@ -20,32 +20,24 @@
#include <qiconset.h>
#include <qpopupmenu.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#include "vt.h"
-class VTPopupMenu : public QPopupMenu
-{
- public:
- VTPopupMenu( QWidget * parent=0, const char * name=0 ) : QPopupMenu( parent, name ) {};
-
- virtual void activated() { qDebug( "VTPopupMenu::activated()" ); }
-};
-
VTApplet::VTApplet ( )
: QObject ( 0, "VTApplet" ), ref ( 0 )
{
}
VTApplet::~VTApplet ( )
{
}
int VTApplet::position ( ) const
{
return 2;
@@ -79,52 +71,79 @@ QIconSet VTApplet::icon ( ) const
QImage img = Resource::loadImage ( "terminal" );
if ( !img. isNull ( ))
pix. convertFromImage ( img. smoothScale ( 14, 14 ));
return pix;
}
QPopupMenu *VTApplet::popup ( QWidget* parent ) const
{
qDebug( "VTApplet::popup" );
struct vt_stat vtstat;
- int fd = ::open("/dev/tty0", O_RDWR);
+ int fd = ::open( "/dev/tty0", O_RDWR );
if ( fd == -1 ) return 0;
if ( ioctl( fd, VT_GETSTATE, &vtstat ) == -1 ) return 0;
- submenu = new VTPopupMenu( parent );
+ submenu = new QPopupMenu( parent );
submenu->setCheckable( true );
for ( int i = 1; i < 10; ++i )
{
int id = submenu->insertItem( QString::number( i ), 500+i );
submenu->setItemChecked( id, id-500 == vtstat.v_active );
}
::close( fd );
connect( submenu, SIGNAL( activated(int) ), this, SLOT( changeVT(int) ) );
+ connect( submenu, SIGNAL( aboutToShow() ), this, SLOT( updateMenu() ) );
return submenu;
}
void VTApplet::changeVT( int index )
{
- qDebug( "VTApplet::changeVT( %d )", index-500 );
+ //qDebug( "VTApplet::changeVT( %d )", index-500 );
+
int fd = ::open("/dev/tty0", O_RDWR);
if ( fd == -1 ) return;
ioctl( fd, VT_ACTIVATE, index-500 );
}
+void VTApplet::updateMenu()
+{
+ //qDebug( "VTApplet::updateMenu()" );
+
+ int fd = ::open( "/dev/console", O_RDONLY );
+ if ( fd == -1 ) return;
+
+ for ( int i = 1; i < 10; ++i )
+ {
+ int result = ioctl( fd, VT_DISALLOCATE, i );
+
+ /*
+ if ( result == -1 )
+ qDebug( "VT %d disallocated == free", i );
+ else
+ qDebug( "VT %d _not_ disallocated == busy", i );
+ */
+
+ submenu->setItemEnabled( 500+i, result == -1 );
+ }
+
+ ::close( fd );
+}
+
+
void VTApplet::activated()
{
qDebug( "VTApplet::activated()" );
}
QRESULT VTApplet::queryInterface ( const QUuid &uuid, QUnknownInterface **iface )
{
*iface = 0;
if ( uuid == IID_QUnknown )
*iface = this;
else if ( uuid == IID_MenuApplet )
diff --git a/core/applets/vtapplet/vt.h b/core/applets/vtapplet/vt.h
index 2df9791..6bdb9e0 100644
--- a/core/applets/vtapplet/vt.h
+++ b/core/applets/vtapplet/vt.h
@@ -34,20 +34,21 @@ public:
virtual QString name ( ) const;
virtual QIconSet icon ( ) const;
virtual QString text ( ) const;
//virtual QString tr( const char* ) const;
//virtual QString tr( const char*, const char* ) const;
virtual QPopupMenu *popup ( QWidget *parent ) const;
virtual void activated ();
public slots:
virtual void changeVT( int index );
+ virtual void updateMenu();
private:
ulong ref;
};
static QPopupMenu* submenu;
#endif