2002-04-06 Marcus Brinkmann <marcus@g10code.de>
[pinentry.git] / kde / pinentrydialog.cpp
1 /* pinentrydialog.cpp - A secure KDE dialog for PIN entry.
2    Copyright (C) 2002 Klarälvdalens Datakonsult AB
3    Written by Steffen Hansen <steffen@klaralvdalens-datakonsult.se>.
4    
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9  
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14  
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18    02111-1307, USA  */
19
20 #include <qlayout.h>
21 #include "pinentrydialog.h"
22
23 #include <X11/Xlib.h>
24
25 PinEntryDialog::PinEntryDialog( QWidget* parent, const char* name, bool modal )
26   : QDialog( parent, name, modal ), _grabbed( false )
27 {
28   QBoxLayout* top = new QVBoxLayout( this, 6 );
29   _error = new QLabel( this );
30   top->addWidget( _error );
31
32   _desc = new QLabel( this );
33   top->addWidget( _desc );
34
35   QBoxLayout* l = new QHBoxLayout( top );
36   _prompt = new QLabel( this );
37   l->addWidget( _prompt );
38   _edit  = new QLineEdit( this );
39   _edit->setMaxLength( 256 );
40   _edit->setEchoMode( QLineEdit::Password );
41   l->addWidget( _edit );
42
43   l = new QHBoxLayout( top );
44   
45   QPushButton* okB = new QPushButton( tr("OK"), this );
46   QPushButton* cancelB = new QPushButton( tr("Cancel"), this );
47
48   l->addWidget( okB );
49   l->addStretch();
50   l->addWidget( cancelB );
51
52   okB->setDefault(true);
53
54   connect( okB, SIGNAL( clicked() ),
55            this, SIGNAL( accepted() ) );
56   connect( cancelB, SIGNAL( clicked() ),
57            this, SIGNAL( rejected() ) );
58   _edit->setFocus();
59 }
60
61 void PinEntryDialog::paintEvent( QPaintEvent* ev )
62 {
63   // Grab keyboard when widget is mapped to screen
64   // It might be a little weird to do it here, but it works!
65   if( !_grabbed ) {
66     XGrabKeyboard( x11Display(), winId(), 
67                    TRUE, GrabModeAsync, GrabModeAsync, CurrentTime );
68     _grabbed = true;
69   }
70   QDialog::paintEvent( ev );
71 }
72
73 void PinEntryDialog::hideEvent( QHideEvent* ev )
74 {
75   XUngrabKeyboard( x11Display(), CurrentTime );
76   _grabbed = false;
77   QDialog::hideEvent( ev );
78 }
79
80 void PinEntryDialog::keyPressEvent( QKeyEvent* e ) 
81 {
82   if ( e->state() == 0 && e->key() == Key_Escape ) {
83     emit rejected();
84     return;
85   }
86   QDialog::keyPressEvent( e );
87 }
88
89 void PinEntryDialog::setDescription( const QString& txt ) 
90 {
91   _desc->setText( txt );
92   setError( QString::null );
93 }
94
95 QString PinEntryDialog::description() const 
96 {
97   return _desc->text();
98 }
99
100 void PinEntryDialog::setError( const QString& txt ) 
101 {
102   _error->setText( txt );
103 }
104
105 QString PinEntryDialog::error() const 
106 {
107   return _error->text();
108 }
109
110 void PinEntryDialog::setText( const QString& txt ) 
111 {
112   _edit->setText( txt );
113 }
114
115 QString PinEntryDialog::text() const 
116 {
117   return _edit->text();
118 }
119
120 void PinEntryDialog::setPrompt( const QString& txt ) 
121 {
122   _prompt->setText( txt );
123 }
124
125 QString PinEntryDialog::prompt() const 
126 {
127   return _prompt->text();
128 }