fix modal auto-close
This commit is contained in:
		
							parent
							
								
									5c5a70ad73
								
							
						
					
					
						commit
						094ff4765b
					
				
					 16 changed files with 237 additions and 70 deletions
				
			
		|  | @ -49,13 +49,39 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter | ||||||
| 
 | 
 | ||||||
| 			audio.VolumeChanged += Audio_VolumeChanged; | 			audio.VolumeChanged += Audio_VolumeChanged; | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = Popup.IsMouseOver)); | 			var lastOpenedBySpacePress = false; | ||||||
|  | 			Button.PreviewKeyDown += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
|  | 				{ | ||||||
|  | 					lastOpenedBySpacePress = true; | ||||||
|  | 				} | ||||||
|  | 			}; | ||||||
|  | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			MuteButton.Click += MuteButton_Click; | 			MuteButton.Click += MuteButton_Click; | ||||||
| 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_Muted.xaml") }; | 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_Muted.xaml") }; | ||||||
| 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_Light_NoDevice.xaml") }; | 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_Light_NoDevice.xaml") }; | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 			Volume.ValueChanged += Volume_ValueChanged; | 			Volume.ValueChanged += Volume_ValueChanged; | ||||||
| 
 | 
 | ||||||
| 			if (audio.HasOutputDevice) | 			if (audio.HasOutputDevice) | ||||||
|  |  | ||||||
|  | @ -51,25 +51,36 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter | ||||||
| 					LayoutsStackPanel.Children[0].Focus(); | 					LayoutsStackPanel.Children[0].Focus(); | ||||||
| 				})); | 				})); | ||||||
| 			}; | 			}; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private void Keyboard_LayoutChanged(IKeyboardLayout layout) | 		private void Keyboard_LayoutChanged(IKeyboardLayout layout) | ||||||
|  |  | ||||||
|  | @ -45,23 +45,30 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter | ||||||
| 
 | 
 | ||||||
| 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				Grid.Background = Brushes.Gray; | 				Grid.Background = Brushes.Gray; | ||||||
|  | @ -74,7 +81,11 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter | ||||||
| 					} | 					} | ||||||
| 				})); | 				})); | ||||||
| 			}; | 			}; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 			WirelessIcon.Child = GetWirelessIcon(0); | 			WirelessIcon.Child = GetWirelessIcon(0); | ||||||
| 
 | 
 | ||||||
| 			Update(); | 			Update(); | ||||||
|  |  | ||||||
|  | @ -55,17 +55,17 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter | ||||||
| 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | ||||||
| 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | ||||||
| 
 | 
 | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			NotificationButton.PreviewKeyDown += (o, args) => | 			NotificationButton.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -76,9 +76,20 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.ActionCenter | ||||||
| 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | ||||||
| 
 | 
 | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 
 | 
 | ||||||
| 			Text.Text = text.Get(TextKey.Notification_ProctoringHandLowered); | 			Text.Text = text.Get(TextKey.Notification_ProctoringHandLowered); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -48,17 +48,17 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 
 | 
 | ||||||
| 			audio.VolumeChanged += Audio_VolumeChanged; | 			audio.VolumeChanged += Audio_VolumeChanged; | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -68,7 +68,14 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_Muted.xaml") }; | 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_Muted.xaml") }; | ||||||
| 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_NoDevice.xaml") }; | 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Audio_NoDevice.xaml") }; | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Volume.ValueChanged += Volume_ValueChanged; | 			Volume.ValueChanged += Volume_ValueChanged; | ||||||
| 
 | 
 | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
|  | @ -82,6 +89,7 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				Button.Background = originalBrush; | 				Button.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			if (audio.HasOutputDevice) | 			if (audio.HasOutputDevice) | ||||||
|  |  | ||||||
|  | @ -54,24 +54,31 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 					((LayoutsStackPanel.Children[0] as ContentControl).Content as UIElement).Focus(); | 					((LayoutsStackPanel.Children[0] as ContentControl).Content as UIElement).Focus(); | ||||||
| 				}))); | 				}))); | ||||||
| 			}; | 			}; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 
 | 
 | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
| 			{ | 			{ | ||||||
|  | @ -83,6 +90,7 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				Button.Background = originalBrush; | 				Button.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -45,25 +45,32 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			var originalBrush = Button.Background; | 			var originalBrush = Button.Background; | ||||||
| 
 | 
 | ||||||
| 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)					// for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)					// for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			WirelessIcon.Child = GetWirelessIcon(0); | 			WirelessIcon.Child = GetWirelessIcon(0); | ||||||
| 
 | 
 | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
|  | @ -84,6 +91,7 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				Button.Background = originalBrush; | 				Button.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			Update(); | 			Update(); | ||||||
|  |  | ||||||
|  | @ -55,17 +55,17 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | ||||||
| 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | ||||||
| 
 | 
 | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			NotificationButton.PreviewKeyDown += (o, args) => | 			NotificationButton.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -76,7 +76,14 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | ||||||
| 
 | 
 | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				Background = Brushes.LightGray; | 				Background = Brushes.LightGray; | ||||||
|  | @ -86,6 +93,7 @@ namespace SafeExamBrowser.UserInterface.Desktop.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				NotificationButton.Background = originalBrush; | 				NotificationButton.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -49,17 +49,17 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 
 | 
 | ||||||
| 			audio.VolumeChanged += Audio_VolumeChanged; | 			audio.VolumeChanged += Audio_VolumeChanged; | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -68,9 +68,20 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 			MuteButton.Click += MuteButton_Click; | 			MuteButton.Click += MuteButton_Click; | ||||||
| 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_Muted.xaml") }; | 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_Muted.xaml") }; | ||||||
| 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_Light_NoDevice.xaml") }; | 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_Light_NoDevice.xaml") }; | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 			Volume.ValueChanged += Volume_ValueChanged; | 			Volume.ValueChanged += Volume_ValueChanged; | ||||||
| 
 | 
 | ||||||
| 			if (audio.HasOutputDevice) | 			if (audio.HasOutputDevice) | ||||||
|  |  | ||||||
|  | @ -51,25 +51,36 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 					LayoutsStackPanel.Children[0].Focus(); | 					LayoutsStackPanel.Children[0].Focus(); | ||||||
| 				})); | 				})); | ||||||
| 			}; | 			}; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private void Keyboard_LayoutChanged(IKeyboardLayout layout) | 		private void Keyboard_LayoutChanged(IKeyboardLayout layout) | ||||||
|  |  | ||||||
|  | @ -45,23 +45,30 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 
 | 
 | ||||||
| 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				Grid.Background = Brushes.Gray; | 				Grid.Background = Brushes.Gray; | ||||||
|  | @ -74,7 +81,11 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 					} | 					} | ||||||
| 				})); | 				})); | ||||||
| 			}; | 			}; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 			WirelessIcon.Child = GetWirelessIcon(0); | 			WirelessIcon.Child = GetWirelessIcon(0); | ||||||
| 
 | 
 | ||||||
| 			Update(); | 			Update(); | ||||||
|  |  | ||||||
|  | @ -55,17 +55,17 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | ||||||
| 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | ||||||
| 
 | 
 | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			NotificationButton.PreviewKeyDown += (o, args) => | 			NotificationButton.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -76,9 +76,20 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.ActionCenter | ||||||
| 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | ||||||
| 
 | 
 | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | 			Popup.Opened += (o, args) => Grid.Background = Brushes.Gray; | ||||||
| 			Popup.Closed += (o, args) => Grid.Background = originalBrush; | 			Popup.Closed += (o, args) => | ||||||
|  | 			{ | ||||||
|  | 				Grid.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
|  | 			}; | ||||||
| 
 | 
 | ||||||
| 			Text.Text = text.Get(TextKey.Notification_ProctoringHandLowered); | 			Text.Text = text.Get(TextKey.Notification_ProctoringHandLowered); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -48,17 +48,17 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 
 | 
 | ||||||
| 			audio.VolumeChanged += Audio_VolumeChanged; | 			audio.VolumeChanged += Audio_VolumeChanged; | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -68,7 +68,14 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_Muted.xaml") }; | 			MutedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_Muted.xaml") }; | ||||||
| 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_NoDevice.xaml") }; | 			NoDeviceIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Mobile;component/Images/Audio_NoDevice.xaml") }; | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Volume.ValueChanged += Volume_ValueChanged; | 			Volume.ValueChanged += Volume_ValueChanged; | ||||||
| 
 | 
 | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
|  | @ -82,6 +89,7 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				Button.Background = originalBrush; | 				Button.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			if (audio.HasOutputDevice) | 			if (audio.HasOutputDevice) | ||||||
|  |  | ||||||
|  | @ -54,24 +54,31 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 					((LayoutsStackPanel.Children[0] as ContentControl).Content as UIElement).Focus(); | 					((LayoutsStackPanel.Children[0] as ContentControl).Content as UIElement).Focus(); | ||||||
| 				}))); | 				}))); | ||||||
| 			}; | 			}; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 
 | 
 | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
| 			{ | 			{ | ||||||
|  | @ -83,6 +90,7 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				Button.Background = originalBrush; | 				Button.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -46,24 +46,31 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 
 | 
 | ||||||
| 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | 			adapter.Changed += () => Dispatcher.InvokeAsync(Update); | ||||||
| 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | 			Button.Click += (o, args) => Popup.IsOpen = !Popup.IsOpen; | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			Button.PreviewKeyDown += (o, args) => | 			Button.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			Button.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
| 				Popup.IsOpen = Popup.IsMouseOver; | 				Popup.IsOpen = Popup.IsMouseOver; | ||||||
| 			})); | 			})); | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			WirelessIcon.Child = GetWirelessIcon(0); | 			WirelessIcon.Child = GetWirelessIcon(0); | ||||||
| 
 | 
 | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
|  | @ -84,6 +91,7 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				Button.Background = originalBrush; | 				Button.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			Update(); | 			Update(); | ||||||
|  |  | ||||||
|  | @ -55,17 +55,17 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | 			RaisedIcon = new XamlIconResource { Uri = new Uri("pack://application:,,,/SafeExamBrowser.UserInterface.Desktop;component/Images/Hand_Raised.xaml") }; | ||||||
| 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | 			Icon.Content = IconResourceLoader.Load(LoweredIcon); | ||||||
| 
 | 
 | ||||||
| 			var lastOpenedBySpacePress = DateTime.MinValue; | 			var lastOpenedBySpacePress = false; | ||||||
| 			NotificationButton.PreviewKeyDown += (o, args) => | 			NotificationButton.PreviewKeyDown += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | 				if (args.Key == System.Windows.Input.Key.Space)                 // for some reason, the popup immediately closes again if opened by a Space Bar key event - as a mitigation, we record the space bar event and leave the popup open for at least 3 seconds | ||||||
| 				{ | 				{ | ||||||
| 					lastOpenedBySpacePress = DateTime.Now; | 					lastOpenedBySpacePress = true; | ||||||
| 				} | 				} | ||||||
| 			}; | 			}; | ||||||
| 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | 			NotificationButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (Popup.IsOpen && (DateTime.Now - lastOpenedBySpacePress).TotalSeconds < 3) | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
| 				{ | 				{ | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -76,7 +76,14 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | 			NotificationButton.ToolTip = text.Get(TextKey.Notification_ProctoringHandLowered); | ||||||
| 
 | 
 | ||||||
| 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | 			Popup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(Popup_PlacementCallback); | ||||||
| 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => Popup.IsOpen = IsMouseOver)); | 			Popup.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => | ||||||
|  | 			{ | ||||||
|  | 				if (Popup.IsOpen && lastOpenedBySpacePress) | ||||||
|  | 				{ | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  | 				Popup.IsOpen = IsMouseOver; | ||||||
|  | 			})); | ||||||
| 			Popup.Opened += (o, args) => | 			Popup.Opened += (o, args) => | ||||||
| 			{ | 			{ | ||||||
| 				Background = Brushes.LightGray; | 				Background = Brushes.LightGray; | ||||||
|  | @ -87,6 +94,7 @@ namespace SafeExamBrowser.UserInterface.Mobile.Controls.Taskbar | ||||||
| 			{ | 			{ | ||||||
| 				Background = originalBrush; | 				Background = originalBrush; | ||||||
| 				NotificationButton.Background = originalBrush; | 				NotificationButton.Background = originalBrush; | ||||||
|  | 				lastOpenedBySpacePress = false; | ||||||
| 			}; | 			}; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Jonas Sourlier
						Jonas Sourlier