Add recent pinentry-qt commits as patches
[gpg4win.git] / patches / pinentry-0.8.4-beta8 / 0003-Add-fallbacks-for-SetForegroundWindow.patch
1 #! /bin/sh
2 patch -p1 -l -f $* < $0
3 exit $?
4
5 From f4d14ffcf2e04b1938c00a0ef1504e0e932631fd Mon Sep 17 00:00:00 2001
6 From: Andre Heinecke <aheinecke@intevation.de>
7 Date: Wed, 6 Aug 2014 15:05:25 +0200
8 Subject: [PATCH 3/3] Add fallbacks for SetForegroundWindow
9
10     If that foreground window fails pinentry-qt now tries to
11     attach to the current foreground process and then tries
12     to set the foreground window again. If that fails it also
13     calls ShowWindow as a last resort.
14
15     * qt4/pinentrydialog.cpp (raiseWindow): Add fallbacks in
16     case SetForegroundWindow fails.
17 ---
18  NEWS                   |  3 +++
19  qt4/pinentrydialog.cpp | 59 +++++++++++++++++++++++++++++++++-----------------
20  2 files changed, 42 insertions(+), 20 deletions(-)
21
22 diff --git a/NEWS b/NEWS
23 index 2741f5c..5bd874f 100644
24 --- a/NEWS
25 +++ b/NEWS
26 @@ -7,6 +7,9 @@ Noteworthy changes in version 0.8.4 (unreleased)
27
28   * Qt4: Raise confirm message windows into foreground
29
30 + * Qt4 (Windows): Improve the way pinentry-qt raises itself in
31 + the foreground.
32 +
33  Noteworthy changes in version 0.8.3 (2013-04-26)
34  ------------------------------------------------
35
36 diff --git a/qt4/pinentrydialog.cpp b/qt4/pinentrydialog.cpp
37 index b16a74f..3a6dacc 100644
38 --- a/qt4/pinentrydialog.cpp
39 +++ b/qt4/pinentrydialog.cpp
40 @@ -45,31 +45,50 @@
41     versions.  This is the reason why gpg-agent employs its
42     AllowSetForegroundWindow callback machinery to ask the supposed to
43     be be calling process to allow a pinentry to go into the
44 -   foreground.  */
45 -// #ifdef Q_WS_WIN
46 -// void SetForegroundWindowEx( HWND hWnd )
47 -// {
48 -//    //Attach foreground window thread to our thread
49 -//    const DWORD ForeGroundID = GetWindowThreadProcessId(::GetForegroundWindow(),NULL);
50 -//    const DWORD CurrentID   = GetCurrentThreadId();
51 -
52 -//    AttachThreadInput ( ForeGroundID, CurrentID, TRUE );
53 -//    //Do our stuff here
54 -//    HWND hLastActivePopupWnd = GetLastActivePopup( hWnd );
55 -//    SetForegroundWindow( hLastActivePopupWnd );
56 -
57 -//    //Detach the attached thread
58 -//    AttachThreadInput ( ForeGroundID, CurrentID, FALSE );
59 -// }// End SetForegroundWindowEx
60 -// #endif
61 +   foreground.
62
63 -void raiseWindow( QWidget* w )
64 -{
65 +   [ah] This is a Hack to workaround the fact that Foregrounding
66 +   a Window is so restricted that it AllowSetForegroundWindow
67 +   does not always work (e.g. when the ForegroundWindow timeout
68 +   has not expired.
69 +   */
70  #ifdef Q_WS_WIN
71 -    SetForegroundWindow( w->winId() );
72 +WINBOOL SetForegroundWindowEx( HWND hWnd )
73 +{
74 +   //Attach foreground window thread to our thread
75 +   const DWORD ForeGroundID = GetWindowThreadProcessId(::GetForegroundWindow(),NULL);
76 +   const DWORD CurrentID   = GetCurrentThreadId();
77 +   WINBOOL retval;
78 +
79 +   AttachThreadInput ( ForeGroundID, CurrentID, TRUE );
80 +   //Do our stuff here
81 +   HWND hLastActivePopupWnd = GetLastActivePopup( hWnd );
82 +   retval = SetForegroundWindow( hLastActivePopupWnd );
83 +
84 +   //Detach the attached thread
85 +   AttachThreadInput ( ForeGroundID, CurrentID, FALSE );
86 +   return retval;
87 +}// End SetForegroundWindowEx
88  #endif
89 +
90 +void raiseWindow( QWidget* w )
91 +{
92 +    /* Maybe Qt will become agressive enough one day that
93 +     * this is enough on windows too*/
94      w->raise();
95      w->activateWindow();
96 +#ifdef Q_WS_WIN
97 +    /* In the meantime we do our own attention grabbing */
98 +    if (!SetForegroundWindow (w->winId()) &&
99 +            !SetForegroundWindowEx (w->winId()))  {
100 +        OutputDebugString("SetForegroundWindow (ex) failed");
101 +        /* Yet another fallback which will not work on some
102 +         * versions and is not recommended by msdn */
103 +        if (!ShowWindow (w->winId(), SW_SHOWNORMAL)) {
104 +            OutputDebugString ("ShowWindow failed.");
105 +        }
106 +    }
107 +#endif
108  }
109
110  QPixmap icon( QStyle::StandardPixmap which )
111 --
112 1.9.1