Add fallbacks for SetForegroundWindow
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 6 Aug 2014 13:05:25 +0000 (15:05 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 6 Aug 2014 13:07:19 +0000 (15:07 +0200)
    If that foreground window fails pinentry-qt now tries to
    attach to the current foreground process and then tries
    to set the foreground window again. If that fails it also
    calls ShowWindow as a last resort.

    * qt4/pinentrydialog.cpp (raiseWindow): Add fallbacks in
    case SetForegroundWindow fails.

NEWS
qt4/pinentrydialog.cpp

diff --git a/NEWS b/NEWS
index 2741f5c..5bd874f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,9 @@ Noteworthy changes in version 0.8.4 (unreleased)
 
  * Qt4: Raise confirm message windows into foreground
 
+ * Qt4 (Windows): Improve the way pinentry-qt raises itself in
+ the foreground.
+
 Noteworthy changes in version 0.8.3 (2013-04-26)
 ------------------------------------------------
 
index b16a74f..3a6dacc 100644 (file)
    versions.  This is the reason why gpg-agent employs its
    AllowSetForegroundWindow callback machinery to ask the supposed to
    be be calling process to allow a pinentry to go into the
-   foreground.  */
-// #ifdef Q_WS_WIN
-// void SetForegroundWindowEx( HWND hWnd )
-// {
-//    //Attach foreground window thread to our thread
-//    const DWORD ForeGroundID = GetWindowThreadProcessId(::GetForegroundWindow(),NULL);
-//    const DWORD CurrentID   = GetCurrentThreadId();
-//    AttachThreadInput ( ForeGroundID, CurrentID, TRUE );
-//    //Do our stuff here
-//    HWND hLastActivePopupWnd = GetLastActivePopup( hWnd );
-//    SetForegroundWindow( hLastActivePopupWnd );
-//    //Detach the attached thread
-//    AttachThreadInput ( ForeGroundID, CurrentID, FALSE );
-// }// End SetForegroundWindowEx
-// #endif
+   foreground.
 
-void raiseWindow( QWidget* w )
-{
+   [ah] This is a Hack to workaround the fact that Foregrounding
+   a Window is so restricted that it AllowSetForegroundWindow
+   does not always work (e.g. when the ForegroundWindow timeout
+   has not expired.
+   */
 #ifdef Q_WS_WIN
-    SetForegroundWindow( w->winId() );
+WINBOOL SetForegroundWindowEx( HWND hWnd )
+{
+   //Attach foreground window thread to our thread
+   const DWORD ForeGroundID = GetWindowThreadProcessId(::GetForegroundWindow(),NULL);
+   const DWORD CurrentID   = GetCurrentThreadId();
+   WINBOOL retval;
+
+   AttachThreadInput ( ForeGroundID, CurrentID, TRUE );
+   //Do our stuff here
+   HWND hLastActivePopupWnd = GetLastActivePopup( hWnd );
+   retval = SetForegroundWindow( hLastActivePopupWnd );
+
+   //Detach the attached thread
+   AttachThreadInput ( ForeGroundID, CurrentID, FALSE );
+   return retval;
+}// End SetForegroundWindowEx
 #endif
+
+void raiseWindow( QWidget* w )
+{
+    /* Maybe Qt will become agressive enough one day that
+     * this is enough on windows too*/
     w->raise();
     w->activateWindow();
+#ifdef Q_WS_WIN
+    /* In the meantime we do our own attention grabbing */
+    if (!SetForegroundWindow (w->winId()) &&
+            !SetForegroundWindowEx (w->winId()))  {
+        OutputDebugString("SetForegroundWindow (ex) failed");
+        /* Yet another fallback which will not work on some
+         * versions and is not recommended by msdn */
+        if (!ShowWindow (w->winId(), SW_SHOWNORMAL)) {
+            OutputDebugString ("ShowWindow failed.");
+        }
+    }
+#endif
 }
 
 QPixmap icon( QStyle::StandardPixmap which )