new option --parent-wid=<win-id> (also available via the assuan OPTION command) for...
authorSteffen Hansen <hansen@kde.org>
Fri, 14 Jun 2002 23:26:45 +0000 (23:26 +0000)
committerSteffen Hansen <hansen@kde.org>
Fri, 14 Jun 2002 23:26:45 +0000 (23:26 +0000)
qt/main.cpp
qt/pinentrycontroller.cpp
qt/pinentrycontroller.h

index 39ef2a8..6fa9320 100644 (file)
@@ -89,6 +89,18 @@ static KCmdLineOptions options[] =
   { 0, 0, 0 }
   // INSERT YOUR COMMANDLINE OPTIONS HERE
 };
+#else
+static void 
+usage( const char* appname )
+{
+  fprintf (stderr, "Usage: %s [OPTION]...\n\
+Ask securely for a secret and print it to stdout.\n\
+\n\
+      --display DISPLAY Set the X display\n\
+      --parent-wid      Set the window id the dialogs should appear over\n\
+      --help, -h        Display this help and exit\n", appname);
+
+}
 #endif // USE_KDE
 
 void my_new_handler()
@@ -110,14 +122,30 @@ int qt_main( int argc, char *argv[] )
                            "(c) 2001, Steffen Hansen, Klarälvdalens Datakonsult AB", 0, 0, "klaralvdalens-datakonsult.se");
       aboutData.addAuthor("Steffen Hansen, Klarälvdalens Datakonsult AB",0, "steffen@klaralvdalens-datakonsult.se");
       KCmdLineArgs::init( argc, argv, &aboutData );
-      KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
+      KCmdLineArgs::addCmdLineOptions( options ); // TODO(steffen): Add KDE option handling
       KApplication app;
 #else
       QApplication app( argc, argv );
+      WId parentwid = 0;
+      for( int i = 0; i < argc; ++i ) {
+       if( !strncmp( argv[i], "--parent-wid", 12 ) ) {
+         int len =  strlen( argv[i] );
+         if( len > 12 && argv[i][12] == '=' ) {
+           parentwid = strtol( argv[i]+13, 0, 0 );
+         } else if( len == 12 && i+1 < argc ) {
+           parentwid = strtol( argv[i+1], 0, 0 );
+         }
+       } else if( !strcmp( argv[i], "--help" ) || !strcmp( argv[i], "-h" ) ) { 
+         usage( argv[0] );
+         exit(0);
+       }
+      }
 #endif // USE_KDE
       is_secure = true;
+
+      qDebug("parentwid is %p", parentwid);
       
-      PinEntryController ctrl;
+      PinEntryController ctrl( parentwid );
       ctrl.exec();
       return 0;
     } catch( std::bad_alloc& ex ) {
index 561beaa..21fb6e6 100644 (file)
@@ -48,7 +48,7 @@ static void strcpy_escaped (char *d, const char *s)
   *d = 0;
 }
 
-PinEntryController::PinEntryController() : _pinentry( 0 )
+PinEntryController::PinEntryController( WId parentwid ) : _pinentry( 0 ), _parent(0)
 {
   int fds[2];
   fds[0] = 0;
@@ -62,12 +62,15 @@ PinEntryController::PinEntryController() : _pinentry( 0 )
   }
   rc = registerCommands();
 
+  if( parentwid ) createParentWidget( parentwid );
+
   assuan_set_pointer( _ctx, this );
 }
 
 PinEntryController::~PinEntryController()
 {
   assuan_deinit_server( _ctx );
+  delete _parent;
 }
 
 void PinEntryController::exec()
@@ -114,9 +117,45 @@ int PinEntryController::registerCommands()
                                  table[i].name, table[i].handler);
     if (rc) return rc;
   }
+  assuan_register_option_handler(_ctx, PinEntryController::optionHandler);
+
   return 0;
 }
 
+/* Hack for creating a QWidget with a "foreign" window ID */
+class ForeignWidget : public QWidget
+{
+public:
+  ForeignWidget( WId wid ) : QWidget( 0 ) 
+  {
+    QWidget::destroy();
+    create( wid, false, false );
+  }
+
+  ~ForeignWidget()
+  {
+    destroy( false, false );
+  }
+};
+
+void
+PinEntryController::createParentWidget( WId parentwid )
+{
+  if( _parent ) delete _parent;
+  _parent = new ForeignWidget( parentwid );  
+}
+
+int
+PinEntryController::optionHandler( ASSUAN_CONTEXT ctx, const char* key, const char* value )
+{
+  PinEntryController* that =   static_cast<PinEntryController*>(assuan_get_pointer(ctx));
+  if( !strcmp( key, "parent-wid" ) ) {
+    WId id = strtol( value, 0, 0 );
+    that->createParentWidget( id );
+    return 0;
+  }
+}
+
 int PinEntryController::assuanDesc( ASSUAN_CONTEXT ctx, char* line )
 {
   //qDebug("PinEntryController::assuanDesc( %s )", line );
@@ -198,7 +237,7 @@ int PinEntryController::assuanGetpin( ASSUAN_CONTEXT ctx, char* line )
 
 int PinEntryController::getPin( char* line ) {
   if( _pinentry == 0 ) {
-    _pinentry = new PinEntryDialog(0,0,true);
+    _pinentry = new PinEntryDialog(_parent,0,true);
   }
   _pinentry->setPrompt( _prompt );
   _pinentry->setDescription( _desc );
@@ -233,17 +272,17 @@ int PinEntryController::confirm( char* line )
   int ret;
 #ifdef USE_KDE
   if( !_error.isNull() ) {
-    ret = KMessageBox::questionYesNo( 0, _error );
+    ret = KMessageBox::questionYesNo( _parent, _error );
   } else {
-    ret = KMessageBox::questionYesNo( 0, _desc );    
+    ret = KMessageBox::questionYesNo( _parent, _desc );    
   }
   FILE* fp = assuan_get_data_fp( _ctx );
   if( ret == KMessageBox::Yes ) {
 #else
   if( !_error.isNull() ) {
-    ret = QMessageBox::critical( 0, "", _error, QMessageBox::Yes, QMessageBox::No );
+    ret = QMessageBox::critical( _parent, "", _error, QMessageBox::Yes, QMessageBox::No );
   } else {
-    ret = QMessageBox::information( 0, "", _desc, QMessageBox::Yes, QMessageBox::No );
+    ret = QMessageBox::information( _parent, "", _desc, QMessageBox::Yes, QMessageBox::No );
   }    
   FILE* fp = assuan_get_data_fp( _ctx );
   if( ret == 0 ) {
index b95605b..0799995 100644 (file)
@@ -30,9 +30,11 @@ class PinEntryDialog;
 class PinEntryController : public QObject {
   Q_OBJECT
 public:
-  PinEntryController();
+  PinEntryController( WId parent );
   virtual ~PinEntryController();
 
+  static int optionHandler( ASSUAN_CONTEXT, const char* key, const char* value );
+
   static int assuanDesc( ASSUAN_CONTEXT, char* );
   static int assuanPrompt( ASSUAN_CONTEXT, char* );
   static int assuanError( ASSUAN_CONTEXT, char* );
@@ -52,9 +54,12 @@ private:
 
   int registerCommands();
 
+  void createParentWidget( WId parentwid );
+
   ASSUAN_CONTEXT _ctx;
 
   PinEntryDialog* _pinentry;
+  QWidget* _parent;
   QString _desc;
   QString _prompt;
   QString _error;