Bring mail window to front after keyresolution
authorAndre Heinecke <aheinecke@intevation.de>
Wed, 14 Feb 2018 07:09:41 +0000 (08:09 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Wed, 14 Feb 2018 07:09:41 +0000 (08:09 +0100)
* src/common.c, src/common.h (bring_to_front): New.
* src/cryptcontroller.cpp (CryptController::resolve_keys): Use it.

--
Somehow when the Qt modal window is closed it brings the wrong
window back. This fix does not prevent that but at least returns
the previous active window to the front.

GnuPG-Bug-Id: T3732

src/common.c
src/common.h
src/cryptcontroller.cpp

index f2bfc86..5d4c6fb 100644 (file)
@@ -242,6 +242,23 @@ get_save_filename (HWND root, const char *srcname)
   return NULL;
 }
 
+void
+bring_to_front (HWND wid)
+{
+  if (wid)
+    {
+      if (!SetForegroundWindow (wid))
+        {
+          log_debug ("%s:%s: SetForegroundWindow failed", SRCNAME, __func__);
+          /* Yet another fallback which will not work on some
+           * versions and is not recommended by msdn */
+          if (!ShowWindow (wid, SW_SHOWNORMAL))
+            {
+              log_debug ("%s:%s: ShowWindow failed.", SRCNAME, __func__);
+            }
+        }
+    }
+}
 
 void
 fatal_error (const char *format, ...)
index 09c6072..d306d16 100644 (file)
@@ -140,6 +140,7 @@ extern int g_ol_version_major;
 void log_window_hierarchy (HWND window, const char *fmt,
                            ...) __attribute__ ((format (printf,2,3)));
 
+void bring_to_front (HWND wid);
 #ifdef __cplusplus
 }
 #endif
index 9f6cdbf..389d307 100644 (file)
@@ -329,10 +329,14 @@ CryptController::resolve_keys ()
   // We want debug output as OutputDebugString
   args.push_back (std::string ("--debug"));
 
-  // Pass the handle of the active window for raise / overlay.
-  args.push_back (std::string ("--hwnd"));
   // Yes passing it as int is ok.
-  args.push_back (std::to_string ((int) m_mail->get_window ()));
+  auto wnd = m_mail->get_window ();
+  if (wnd)
+    {
+      // Pass the handle of the active window for raise / overlay.
+      args.push_back (std::string ("--hwnd"));
+      args.push_back (std::to_string ((int) wnd));
+    }
 
   // Set the overlay caption
   args.push_back (std::string ("--overlayText"));
@@ -416,6 +420,9 @@ CryptController::resolve_keys ()
                                  (GpgME::Context::SpawnFlags) (
                                   GpgME::Context::SpawnAllowSetFg |
                                   GpgME::Context::SpawnShowWindow));
+  // Somehow Qt messes up which window to bring back to front.
+  // So we do it manually.
+  bring_to_front (wnd);
 
 #ifdef DEBUG_RESOLVER
   log_debug ("Resolver stdout:\n'%s'", mystdout.toString ().c_str ());