Skip to content
This repository was archived by the owner on Oct 4, 2021. It is now read-only.

Commit d02f67c

Browse files
authored
Merge pull request #9576 from mono/fix/1050400-update-popover-a11y
Fix information popover flickering
2 parents 5f1452d + fd4f6e1 commit d02f67c

File tree

2 files changed

+45
-17
lines changed

2 files changed

+45
-17
lines changed

main/src/core/MonoDevelop.Ide/MonoDevelop.Components/InformationPopoverWidget.cs

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2525
// THE SOFTWARE.
2626
using System;
27+
using System.Timers;
2728
using MonoDevelop.Core;
2829
using MonoDevelop.Ide;
2930
using MonoDevelop.Ide.Tasks;
@@ -158,9 +159,10 @@ bool WorkaroundNestedDialogFlickering ()
158159

159160
void ShowPopover ()
160161
{
161-
if (popover != null)
162-
popover.Destroy ();
163-
popover = TooltipPopoverWindow.Create (!WorkaroundNestedDialogFlickering ());
162+
if (hideTooltipTimer?.Enabled == true)
163+
hideTooltipTimer.Stop ();
164+
if (popover == null)
165+
popover = TooltipPopoverWindow.Create (!WorkaroundNestedDialogFlickering ());
164166
popover.ShowArrow = true;
165167
if (markup)
166168
popover.Markup = message;
@@ -172,41 +174,65 @@ void ShowPopover ()
172174

173175
void UpdatePopover ()
174176
{
175-
if (popover != null)
177+
if (popover?.Visible == true)
176178
ShowPopover ();
177179
}
178180

179181
protected override void OnLostFocus (EventArgs args)
180182
{
181183
base.OnLostFocus (args);
182-
DestroyPopover ();
184+
HidePopover ();
183185
}
184186

185187
protected override void OnMouseExited (EventArgs args)
186188
{
187189
base.OnMouseExited (args);
188-
DestroyPopover ();
190+
HidePopover (true);
189191
}
190192

191193
protected override void OnPreferredSizeChanged ()
192194
{
193195
base.OnPreferredSizeChanged ();
194196
if (!Visible)
195-
DestroyPopover ();
197+
HidePopover ();
196198
}
197199

198-
void DestroyPopover ()
200+
Timer hideTooltipTimer;
201+
202+
void HidePopover (bool delayed = false)
199203
{
200-
if (popover != null) {
201-
popover.Destroy ();
202-
popover = null;
204+
if (delayed) {
205+
// we delay hiding using a timer to avoid tooltip flickering in case of focus stealing
206+
// due to weird toolkit behaviour.
207+
if (hideTooltipTimer == null) {
208+
hideTooltipTimer = new Timer (50) {
209+
AutoReset = false,
210+
SynchronizingObject = this,
211+
};
212+
hideTooltipTimer.Elapsed += (sender, e) => {
213+
if (popover?.Visible == true)
214+
popover.Hide ();
215+
};
216+
}
217+
hideTooltipTimer.Start ();
218+
} else {
219+
if (hideTooltipTimer?.Enabled == true)
220+
hideTooltipTimer.Stop ();
221+
if (popover?.Visible == true)
222+
popover.Hide ();
203223
}
204224
}
205225

206226
protected override void Dispose (bool disposing)
207227
{
208-
if (disposing)
209-
DestroyPopover ();
228+
if (disposing) {
229+
hideTooltipTimer?.Dispose ();
230+
if (popover?.Visible == true)
231+
popover.Hide ();
232+
popover?.Dispose ();
233+
}
234+
hideTooltipTimer = null;
235+
popover = null;
210236
base.Dispose (disposing);
211237
}
212238
}

main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Wizard/WizardDialogController.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,16 @@ public async Task GoBack (CancellationToken token)
125125

126126
public bool RunWizard ()
127127
{
128-
var dialog = new WizardDialog (this);
129-
return dialog.Run (Xwt.MessageDialog.RootWindow);
128+
using (var dialog = new WizardDialog (this)) {
129+
return dialog.Run (Xwt.MessageDialog.RootWindow);
130+
}
130131
}
131132

132133
public bool RunWizard (Xwt.WindowFrame parentWindow)
133134
{
134-
var dialog = new WizardDialog (this);
135-
return dialog.Run (parentWindow);
135+
using (var dialog = new WizardDialog (this)) {
136+
return dialog.Run (parentWindow);
137+
}
136138
}
137139

138140
public event EventHandler Completed;

0 commit comments

Comments
 (0)