Skip to content

Commit 386f1c5

Browse files
authored
Fix crash on desktop switch (#18)
Fix crash on desktop switch Close #15.
1 parent 0ee2c71 commit 386f1c5

File tree

7 files changed

+86
-14
lines changed

7 files changed

+86
-14
lines changed

samples/VirtualDesktop.Showcase/MainWindow.xaml.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ private void MoveLeft(object sender, RoutedEventArgs e)
232232
{
233233
Debug.WriteLine($"Moved: {it.Index} -> {it.Index - 1}");
234234
VirtualDesktop.Current.Move(it.Index - 1);
235+
return;
235236
}
236237
}
237238
}
@@ -244,6 +245,7 @@ private void MoveRight(object sender, RoutedEventArgs e)
244245
{
245246
Debug.WriteLine($"Moved: {it.Index} -> {it.Index + 1}");
246247
VirtualDesktop.Current.Move(it.Index + 1);
248+
return;
247249
}
248250
}
249251
}

src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopNotificationService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected void ViewChangedCore(object view)
6565

6666
protected void CurrentChangedCore(object pDesktopOld, object pDesktopNew)
6767
=> this.Notification.CurrentVirtualDesktopChanged(this.Wrap(pDesktopOld), this.Wrap(pDesktopNew));
68-
68+
6969
private IVirtualDesktop Wrap(object desktop)
7070
=> this.Factory.VirtualDesktop(desktop).Interface;
7171
}

src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotification.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ public interface IVirtualDesktopNotification
2626
void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew);
2727

2828
void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, HString chPath);
29-
30-
IVirtualDesktop VirtualDesktopSwitched();
31-
32-
IVirtualDesktop RemoteVirtualDesktopConnected();
29+
30+
void VirtualDesktopSwitched(IVirtualDesktop pDesktop);
31+
32+
void RemoteVirtualDesktopConnected(IVirtualDesktop pDesktop);
3333
}
3434

3535
internal class VirtualDesktopNotification : VirtualDesktopNotificationService.EventListenerBase, IVirtualDesktopNotification
@@ -78,16 +78,16 @@ public void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, HString chP
7878
{
7979
this.WallpaperChangedCore(pDesktop, chPath);
8080
}
81-
82-
public IVirtualDesktop VirtualDesktopSwitched()
81+
82+
public void VirtualDesktopSwitched(IVirtualDesktop pDesktop)
8383
{
84-
return this.VirtualDesktopSwitched();
84+
this.SwitchedCore(pDesktop);
8585
}
8686

87-
public IVirtualDesktop RemoteVirtualDesktopConnected()
87+
public void RemoteVirtualDesktopConnected(IVirtualDesktop pDesktop)
8888
{
89-
return this.RemoteVirtualDesktopConnected();
89+
this.RemoteConnectedCore(pDesktop);
9090
}
91-
91+
9292
}
9393
}

src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopNotificationService.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ protected void DestroyedCore(object pDesktopDestroyed, object pDesktopFallback)
6262

6363
protected void MovedCore(object pDesktop, int nIndexFrom, int nIndexTo)
6464
=> this.Notification.VirtualDesktopMoved(this.Wrap(pDesktop), nIndexFrom, nIndexTo);
65-
65+
6666
protected void RenamedCore(object pDesktop, HString chName)
6767
=> this.Notification.VirtualDesktopRenamed(this.Wrap(pDesktop), chName);
6868

@@ -75,6 +75,12 @@ protected void CurrentChangedCore(object pDesktopOld, object pDesktopNew)
7575
protected void WallpaperChangedCore(object pDesktop, HString chPath)
7676
=> this.Notification.VirtualDesktopWallpaperChanged(this.Wrap(pDesktop), chPath);
7777

78+
protected void SwitchedCore(object pDesktop)
79+
=> this.Notification.VirtualDesktopSwitched(this.Wrap(pDesktop));
80+
81+
protected void RemoteConnectedCore(object pDesktop)
82+
=> this.Notification.RemoteVirtualDesktopConnected(this.Wrap(pDesktop));
83+
7884
private IVirtualDesktop Wrap(object desktop)
7985
=> this.Factory.VirtualDesktop(desktop).Interface;
8086
}

src/VirtualDesktop/Interop/Proxy/IVirtualDesktopNotification.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace WindowsDesktop.Interop.Proxy;
1+
namespace WindowsDesktop.Interop.Proxy;
22

33
[ComInterface]
44
public interface IVirtualDesktopNotification
@@ -22,4 +22,8 @@ public interface IVirtualDesktopNotification
2222
void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew);
2323

2424
void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, string chPath);
25+
26+
void VirtualDesktopSwitched(IVirtualDesktop pDesktop);
27+
28+
void RemoteVirtualDesktopConnected(IVirtualDesktop pDesktop);
2529
}

src/VirtualDesktop/VirtualDesktop.notification.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,22 @@ partial class VirtualDesktop
6969
/// </remarks>
7070
public static event EventHandler<VirtualDesktopWallpaperChangedEventArgs>? WallpaperChanged;
7171

72+
/// <summary>
73+
/// Occurs when a virtual desktop is switched. Seems duplicate to ViewVirtualDesktopChanged, the difference is not yet known. Both are fired when swtiching.
74+
/// </summary>
75+
/// <remarks>
76+
/// See <see cref="CurrentChanged"/> for details.
77+
/// </remarks>
78+
public static event EventHandler<VirtualDesktopSwitchedEventArgs>? Switched;
79+
80+
/// <summary>
81+
/// Occurs when a remote desktop is connected. Should be related to Windows 365 Cloud PC: https://www.microsoft.com/store/productId/9N1F85V9T8BN.
82+
/// </summary>
83+
/// <remarks>
84+
/// See <see cref="CurrentChanged"/> for details.
85+
/// </remarks>
86+
public static event EventHandler<RemoteVirtualDesktopConnectedEventArgs>? RemoteConnected;
87+
7288
/// <summary>
7389
/// Register a listener to receive changes in the application view.
7490
/// </summary>
@@ -101,7 +117,7 @@ public void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualD
101117

102118
public void VirtualDesktopIsPerMonitorChanged(int i)
103119
{
104-
120+
105121
}
106122

107123

@@ -132,6 +148,12 @@ public void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, string chPa
132148

133149
WallpaperChanged?.Invoke(this, new VirtualDesktopWallpaperChangedEventArgs(desktop, chPath));
134150
}
151+
152+
public void VirtualDesktopSwitched(IVirtualDesktop pDesktop) =>
153+
Switched?.Invoke(this, new VirtualDesktopSwitchedEventArgs(pDesktop));
154+
155+
public void RemoteVirtualDesktopConnected(IVirtualDesktop pDesktop) =>
156+
RemoteConnected?.Invoke(this, new RemoteVirtualDesktopConnectedEventArgs(pDesktop));
135157
}
136158

137159
private class ViewChangedListener

src/VirtualDesktop/VirtualDesktopEventArgs.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,41 @@ internal VirtualDesktopDestroyEventArgs(IVirtualDesktop destroyed, IVirtualDeskt
106106
{
107107
}
108108
}
109+
110+
/// <summary>
111+
/// Provides data for the <see cref="VirtualDesktop.Switched" /> event.
112+
/// </summary>
113+
public class VirtualDesktopSwitchedEventArgs: EventArgs
114+
{
115+
public VirtualDesktop Desktop { get; }
116+
117+
118+
public VirtualDesktopSwitchedEventArgs(VirtualDesktop desktop)
119+
{
120+
this.Desktop = desktop;
121+
}
122+
123+
internal VirtualDesktopSwitchedEventArgs(IVirtualDesktop desktop)
124+
: this(desktop.ToVirtualDesktop())
125+
{
126+
}
127+
}
128+
129+
/// <summary>
130+
/// Provides data for the <see cref="VirtualDesktop.RemoteConnected" /> event.
131+
/// </summary>
132+
public class RemoteVirtualDesktopConnectedEventArgs: EventArgs
133+
{
134+
public VirtualDesktop Desktop { get; }
135+
136+
137+
public RemoteVirtualDesktopConnectedEventArgs(VirtualDesktop desktop)
138+
{
139+
this.Desktop = desktop;
140+
}
141+
142+
internal RemoteVirtualDesktopConnectedEventArgs(IVirtualDesktop desktop)
143+
: this(desktop.ToVirtualDesktop())
144+
{
145+
}
146+
}

0 commit comments

Comments
 (0)