mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-08 20:27:36 +02:00
Hide Video Conferencing when muted (#19175)
This commit is contained in:
@@ -154,18 +154,27 @@ LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARA
|
|||||||
static bool previousShow = false;
|
static bool previousShow = false;
|
||||||
bool show = false;
|
bool show = false;
|
||||||
|
|
||||||
if (toolbar->cameraInUse)
|
if (toolbar->ToolbarHide == L"Never")
|
||||||
{
|
{
|
||||||
show = toolbar->HideToolbarWhenUnmuted ? toolbar->microphoneMuted || toolbar->cameraMuted : true;
|
show = true;
|
||||||
}
|
}
|
||||||
else if (toolbar->previouscameraInUse)
|
else if (toolbar->ToolbarHide == L"When both camera and microphone are muted")
|
||||||
{
|
{
|
||||||
VideoConferenceModule::unmuteAll();
|
if(!toolbar->previouscameraInUse && toolbar->cameraInUse && !toolbar->moduleSettingsUpdateScheduled)
|
||||||
|
{
|
||||||
|
VideoConferenceModule::muteAll();
|
||||||
|
}
|
||||||
|
show = !(toolbar->microphoneMuted && (toolbar->cameraMuted || !toolbar->cameraInUse));
|
||||||
}
|
}
|
||||||
else
|
else if (toolbar->ToolbarHide == L"When both camera and microphone are unmuted")
|
||||||
{
|
{
|
||||||
show = toolbar->microphoneMuted;
|
if(!toolbar->previouscameraInUse && toolbar->cameraInUse && !toolbar->moduleSettingsUpdateScheduled)
|
||||||
|
{
|
||||||
|
VideoConferenceModule::unmuteAll();
|
||||||
|
}
|
||||||
|
show = toolbar->microphoneMuted || toolbar->cameraMuted;
|
||||||
}
|
}
|
||||||
|
|
||||||
show = show || !showOverlayTimeout;
|
show = show || !showOverlayTimeout;
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
@@ -332,9 +341,9 @@ void Toolbar::setMicrophoneMute(bool mute)
|
|||||||
microphoneMuted = mute;
|
microphoneMuted = mute;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Toolbar::setHideToolbarWhenUnmuted(bool hide)
|
void Toolbar::setToolbarHide(std::wstring hide)
|
||||||
{
|
{
|
||||||
HideToolbarWhenUnmuted = hide;
|
ToolbarHide = hide;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Toolbar::setTheme(std::wstring theme)
|
void Toolbar::setTheme(std::wstring theme)
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public:
|
|||||||
void setMicrophoneMute(bool mute);
|
void setMicrophoneMute(bool mute);
|
||||||
|
|
||||||
void setTheme(std::wstring theme);
|
void setTheme(std::wstring theme);
|
||||||
void setHideToolbarWhenUnmuted(bool hide);
|
void setToolbarHide(std::wstring hide);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
static LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||||
@@ -54,7 +54,7 @@ private:
|
|||||||
|
|
||||||
std::wstring theme = L"system";
|
std::wstring theme = L"system";
|
||||||
|
|
||||||
bool HideToolbarWhenUnmuted = true;
|
std::wstring ToolbarHide = L"Never";
|
||||||
|
|
||||||
uint64_t lastTimeCamOrMicMuteStateChanged{};
|
uint64_t lastTimeCamOrMicMuteStateChanged{};
|
||||||
|
|
||||||
|
|||||||
@@ -250,9 +250,9 @@ void VideoConferenceModule::onModuleSettingsChanged()
|
|||||||
settings.imageOverlayPath = val.value();
|
settings.imageOverlayPath = val.value();
|
||||||
sendOverlayImageUpdate();
|
sendOverlayImageUpdate();
|
||||||
}
|
}
|
||||||
if (const auto val = values.get_bool_value(L"hide_toolbar_when_unmuted"))
|
if (const auto val = values.get_string_value(L"toolbar_hide"))
|
||||||
{
|
{
|
||||||
toolbar.setHideToolbarWhenUnmuted(val.value());
|
toolbar.setToolbarHide(val.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto selectedMic = values.get_string_value(L"selected_mic");
|
const auto selectedMic = values.get_string_value(L"selected_mic");
|
||||||
@@ -397,9 +397,9 @@ void VideoConferenceModule::init_settings()
|
|||||||
{
|
{
|
||||||
settings.imageOverlayPath = val.value();
|
settings.imageOverlayPath = val.value();
|
||||||
}
|
}
|
||||||
if (const auto val = powerToysSettings.get_bool_value(L"hide_toolbar_when_unmuted"))
|
if (const auto val = powerToysSettings.get_string_value(L"toolbar_hide"))
|
||||||
{
|
{
|
||||||
toolbar.setHideToolbarWhenUnmuted(val.value());
|
toolbar.setToolbarHide(val.value());
|
||||||
}
|
}
|
||||||
if (const auto val = powerToysSettings.get_string_value(L"selected_mic"); val && *val != settings.selectedMicrophone)
|
if (const auto val = powerToysSettings.get_string_value(L"selected_mic"); val && *val != settings.selectedMicrophone)
|
||||||
{
|
{
|
||||||
@@ -549,6 +549,19 @@ void VideoConferenceModule::unmuteAll()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VideoConferenceModule::muteAll()
|
||||||
|
{
|
||||||
|
if (!getVirtualCameraMuteState())
|
||||||
|
{
|
||||||
|
reverseVirtualCameraMuteState();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getMicrophoneMuteState())
|
||||||
|
{
|
||||||
|
reverseMicrophoneMute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VideoConferenceModule::disable()
|
void VideoConferenceModule::disable()
|
||||||
{
|
{
|
||||||
if (_enabled)
|
if (_enabled)
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public:
|
|||||||
void sendOverlayImageUpdate();
|
void sendOverlayImageUpdate();
|
||||||
|
|
||||||
static void unmuteAll();
|
static void unmuteAll();
|
||||||
|
static void muteAll();
|
||||||
static void reverseMicrophoneMute();
|
static void reverseMicrophoneMute();
|
||||||
static bool getMicrophoneMuteState();
|
static bool getMicrophoneMuteState();
|
||||||
static void reverseVirtualCameraMuteState();
|
static void reverseVirtualCameraMuteState();
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
Key = "O",
|
Key = "O",
|
||||||
Code = 79,
|
Code = 79,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.HideToolbarWhenUnmuted = new BoolProperty(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonPropertyName("mute_camera_and_microphone_hotkey")]
|
[JsonPropertyName("mute_camera_and_microphone_hotkey")]
|
||||||
@@ -74,8 +72,8 @@ namespace Microsoft.PowerToys.Settings.UI.Library
|
|||||||
[JsonPropertyName("theme")]
|
[JsonPropertyName("theme")]
|
||||||
public StringProperty Theme { get; set; }
|
public StringProperty Theme { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("hide_toolbar_when_unmuted")]
|
[JsonPropertyName("toolbar_hide")]
|
||||||
public BoolProperty HideToolbarWhenUnmuted { get; set; }
|
public StringProperty ToolbarHide { get; set; } = "Never";
|
||||||
|
|
||||||
// converts the current to a json string.
|
// converts the current to a json string.
|
||||||
public string ToJsonString()
|
public string ToJsonString()
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ using System.Threading.Tasks;
|
|||||||
using Microsoft.PowerToys.Settings.UI.Library;
|
using Microsoft.PowerToys.Settings.UI.Library;
|
||||||
using Microsoft.PowerToys.Settings.UI.Library.Helpers;
|
using Microsoft.PowerToys.Settings.UI.Library.Helpers;
|
||||||
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
|
using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
|
||||||
|
using Microsoft.PowerToys.Settings.UI.Library.Utilities;
|
||||||
using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands;
|
using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands;
|
||||||
|
|
||||||
namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
||||||
@@ -98,8 +99,6 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
SelectOverlayImage = new ButtonClickCommand(SelectOverlayImageAction);
|
SelectOverlayImage = new ButtonClickCommand(SelectOverlayImageAction);
|
||||||
ClearOverlayImage = new ButtonClickCommand(ClearOverlayImageAction);
|
ClearOverlayImage = new ButtonClickCommand(ClearOverlayImageAction);
|
||||||
|
|
||||||
_hideToolbarWhenUnmuted = Settings.Properties.HideToolbarWhenUnmuted.Value;
|
|
||||||
|
|
||||||
switch (Settings.Properties.ToolbarPosition.Value)
|
switch (Settings.Properties.ToolbarPosition.Value)
|
||||||
{
|
{
|
||||||
case "Top left corner":
|
case "Top left corner":
|
||||||
@@ -133,6 +132,19 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (Settings.Properties.ToolbarHide.Value)
|
||||||
|
{
|
||||||
|
case "Never":
|
||||||
|
_toolbarHideIndex = 0;
|
||||||
|
break;
|
||||||
|
case "When both camera and microphone are unmuted":
|
||||||
|
_toolbarHideIndex = 1;
|
||||||
|
break;
|
||||||
|
case "When both camera and microphone are muted":
|
||||||
|
_toolbarHideIndex = 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (shouldSaveSettings)
|
if (shouldSaveSettings)
|
||||||
{
|
{
|
||||||
_settingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName);
|
_settingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName);
|
||||||
@@ -142,12 +154,12 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
private bool _isEnabled;
|
private bool _isEnabled;
|
||||||
private int _toolbarPositionIndex;
|
private int _toolbarPositionIndex;
|
||||||
private int _toolbarMonitorIndex;
|
private int _toolbarMonitorIndex;
|
||||||
|
private int _toolbarHideIndex;
|
||||||
private HotkeySettings _cameraAndMicrophoneMuteHotkey;
|
private HotkeySettings _cameraAndMicrophoneMuteHotkey;
|
||||||
private HotkeySettings _microphoneMuteHotkey;
|
private HotkeySettings _microphoneMuteHotkey;
|
||||||
private HotkeySettings _cameraMuteHotkey;
|
private HotkeySettings _cameraMuteHotkey;
|
||||||
private int _selectedCameraIndex = -1;
|
private int _selectedCameraIndex = -1;
|
||||||
private int _selectedMicrophoneIndex;
|
private int _selectedMicrophoneIndex;
|
||||||
private bool _hideToolbarWhenUnmuted;
|
|
||||||
|
|
||||||
public List<string> CameraNames { get; }
|
public List<string> CameraNames { get; }
|
||||||
|
|
||||||
@@ -380,20 +392,32 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool HideToolbarWhenUnmuted
|
public int ToolbarHideIndex
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return _hideToolbarWhenUnmuted;
|
return _toolbarHideIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (value != _hideToolbarWhenUnmuted)
|
if (value != _toolbarHideIndex)
|
||||||
{
|
{
|
||||||
_hideToolbarWhenUnmuted = value;
|
_toolbarHideIndex = value;
|
||||||
Settings.Properties.HideToolbarWhenUnmuted.Value = value;
|
switch (_toolbarHideIndex)
|
||||||
RaisePropertyChanged(nameof(HideToolbarWhenUnmuted));
|
{
|
||||||
|
case 0:
|
||||||
|
Settings.Properties.ToolbarHide.Value = "Never";
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
Settings.Properties.ToolbarHide.Value = "When both camera and microphone are unmuted";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Settings.Properties.ToolbarHide.Value = "When both camera and microphone are muted";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
RaisePropertyChanged(nameof(ToolbarHideIndex));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,42 @@
|
|||||||
{"version":"1.0","name":"Video Conference","properties":{"mute_camera_and_microphone_hotkey":{"value":{"win":false,"ctrl":false,"alt":false,"shift":true,"code":73,"key":""}},"mute_microphone_hotkey":{"value":{"win":false,"ctrl":false,"alt":false,"shift":true,"code":68,"key":""}},"mute_camera_hotkey":{"value":{"win":false,"ctrl":false,"alt":false,"shift":true,"code":86,"key":""}},"selected_camera":{"value":"USB Video Device"},"toolbar_position":{"value":"Bottom center"},"toolbar_monitor":{"value":"All monitors"},"camera_overlay_image_path":{"value":""},"theme":{"value":"light"},"hide_toolbar_when_unmuted":{"value":false}}}
|
{
|
||||||
|
"version": "1.0",
|
||||||
|
"name": "Video Conference",
|
||||||
|
"properties": {
|
||||||
|
"camera_overlay_image_path": { "value": "" },
|
||||||
|
"toolbar_hide": { "value": "Never" },
|
||||||
|
"mute_camera_and_microphone_hotkey": {
|
||||||
|
"value": {
|
||||||
|
"win": false,
|
||||||
|
"ctrl": false,
|
||||||
|
"alt": false,
|
||||||
|
"shift": true,
|
||||||
|
"code": 73,
|
||||||
|
"key": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mute_camera_hotkey": {
|
||||||
|
"value": {
|
||||||
|
"win": false,
|
||||||
|
"ctrl": false,
|
||||||
|
"alt": false,
|
||||||
|
"shift": true,
|
||||||
|
"code": 86,
|
||||||
|
"key": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mute_microphone_hotkey": {
|
||||||
|
"value": {
|
||||||
|
"win": false,
|
||||||
|
"ctrl": false,
|
||||||
|
"alt": false,
|
||||||
|
"shift": true,
|
||||||
|
"code": 68,
|
||||||
|
"key": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"selected_camera": { "value": "USB Video Device" },
|
||||||
|
"theme": { "value": "light" },
|
||||||
|
"toolbar_monitor": { "value": "All monitors" },
|
||||||
|
"toolbar_position": { "value": "Bottom center" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -255,8 +255,17 @@
|
|||||||
<data name="VideoConference_ToolbarMonitor_All.Content" xml:space="preserve">
|
<data name="VideoConference_ToolbarMonitor_All.Content" xml:space="preserve">
|
||||||
<value>All monitors</value>
|
<value>All monitors</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VideoConference_HideToolbarWhenUnmuted.Content" xml:space="preserve">
|
<data name="VideoConference_ToolbarHide.Header" xml:space="preserve">
|
||||||
<value>Hide toolbar when both camera and microphone are unmuted</value>
|
<value>Hide toolbar</value>
|
||||||
|
</data>
|
||||||
|
<data name="VideoConference_ToolbarHideMuted.Content" xml:space="preserve">
|
||||||
|
<value>When both camera and microphone are muted</value>
|
||||||
|
</data>
|
||||||
|
<data name="VideoConference_ToolbarHideNever.Content" xml:space="preserve">
|
||||||
|
<value>Never</value>
|
||||||
|
</data>
|
||||||
|
<data name="VideoConference_ToolbarHideUnmuted.Content" xml:space="preserve">
|
||||||
|
<value>When both camera and microphone are unmuted</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="VideoConference.ModuleTitle" xml:space="preserve">
|
<data name="VideoConference.ModuleTitle" xml:space="preserve">
|
||||||
<value>Video Conference Mute</value>
|
<value>Video Conference Mute</value>
|
||||||
|
|||||||
@@ -145,8 +145,15 @@
|
|||||||
</controls:Setting.ActionContent>
|
</controls:Setting.ActionContent>
|
||||||
</controls:Setting>
|
</controls:Setting>
|
||||||
<Rectangle Style="{StaticResource ExpanderSeparatorStyle}" />
|
<Rectangle Style="{StaticResource ExpanderSeparatorStyle}" />
|
||||||
|
<controls:Setting x:Uid="VideoConference_ToolbarHide" Style="{StaticResource ExpanderContentSettingStyle}">
|
||||||
<CheckBox x:Uid="VideoConference_HideToolbarWhenUnmuted" IsChecked="{x:Bind Mode=TwoWay, Path=ViewModel.HideToolbarWhenUnmuted}" Margin="{StaticResource ExpanderSettingMargin}" />
|
<controls:Setting.ActionContent>
|
||||||
|
<ComboBox MinWidth="{StaticResource SettingActionControlMinWidth}" SelectedIndex="{ Binding Mode=TwoWay, Path=ToolbarHideIndex}">
|
||||||
|
<ComboBoxItem x:Uid="VideoConference_ToolbarHideNever"/>
|
||||||
|
<ComboBoxItem x:Uid="VideoConference_ToolbarHideUnmuted"/>
|
||||||
|
<ComboBoxItem x:Uid="VideoConference_ToolbarHideMuted"/>
|
||||||
|
</ComboBox>
|
||||||
|
</controls:Setting.ActionContent>
|
||||||
|
</controls:Setting>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</controls:SettingExpander.Content>
|
</controls:SettingExpander.Content>
|
||||||
</controls:SettingExpander>
|
</controls:SettingExpander>
|
||||||
|
|||||||
Reference in New Issue
Block a user