Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/EasyWindowsApplication/Core/SystemTray/SystemTrayBroker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ internal sealed class SystemTrayBroker
private bool _disposed;

private int _lastHoverTick;
private int _lastMainTapUpTick; // tick del último WM_LBUTTONUP consumido como MainTap
private bool _holding;
private readonly TapChainCounter _counter = new();

Expand Down Expand Up @@ -135,7 +136,13 @@ private nint OnCallback(nint wParam, nint lParam)
case WM_RBUTTONUP: if (IsCursorOverIcon()) Fire(typeof(AlternativeTap1)); break;
case WM_MBUTTONUP: if (IsCursorOverIcon()) Fire(typeof(AlternativeTap2)); break;
case WM.CONTEXTMENU: OnContextMenuKey(); break;
case var m when m == NIN.SELECT || m == NIN.KEYSELECT: Fire(typeof(MainTap)); break;
// NIN.SELECT/KEYSELECT: en VERSION_4 Explorer lo envía junto a WM_LBUTTONUP
// en cada click de ratón. Deduplicar (issue #58): si hay un MainTap de ratón
// reciente dentro del tiempo de doble click, este mensaje es su eco.
case var m when m == NIN.SELECT || m == NIN.KEYSELECT:
if (unchecked(Environment.TickCount - _lastMainTapUpTick) > (int)Win32.GetDoubleClickTime())
Fire(typeof(MainTap));
break;
case var m when m == NIN.POPUPOPEN: OnHover(); break;
}
return 0;
Expand Down Expand Up @@ -213,6 +220,7 @@ private void OnButtonUp()
}
else
{
_lastMainTapUpTick = Environment.TickCount;
Fire(typeof(MainTap));
}
}
Expand Down
2 changes: 0 additions & 2 deletions src/EasyWindowsApplication/Share/IMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ namespace EasyWindowsApplication.Share;
public interface IMenu : IViewSurface
{
void Show();
void ShowAtCursor();
void ShowAtIcon();
void Hide();
void Close();
}
44 changes: 6 additions & 38 deletions src/Sample/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,15 @@
{
ly.Window(iw => iw
.Name("MainWindow")
.Title("EWA - TrayMenu Demo")
.Dimensions(420, 200)
.SystemTray(st => st.Tooltip("EWA Demo"))
.Content(c => c
.Spacing(8)
.Padding(8)
.Children(ch =>
{
ch.View<ILabel>(lb => lb.Name("LbResult").Text("Boton muestra el mismo menu del tray."));
ch.View<IButton>(b => b.Name("BtnCursor").Text("Menu en cursor (testigo)"));
ch.View<IButton>(b => b.Name("BtnMenu").Text("Mostrar menu (Show inteligente)"));
})
)
.Title("EWA - Demo")
.Dimensions(525, 494)
.SystemTray(st => st.Tooltip("EWA - Demo"))
);
ly.AlternativeWindow<IMenu>(m => m
.Name("TrayMenu")
.Content(c => c.Children(ch =>
{
ch.View<IMenuItem>(mi => mi.Name("MiShow").Text("Mostrar ventana"));
ch.View<IMenuItem>(mi => mi.Name("MiShowMainWin").Text("Go to main window"));
ch.View<IMenuItemSeparator>();
ch.View<IMenuItem>(mi => mi.Name("MiExit").Text("Salir"));
}))
Expand All @@ -45,34 +35,12 @@
bh.SystemTray.Visibility(true);
});

// Click derecho en icono del tray -> menu anclado al icono (iconAnchor).
bh.SystemTray.OnInputWithSpatialPosition<AlternativeTap1, OneTap>(() => bh.TrayMenu.Show());


// Doble click izquierdo en icono del tray -> mostrar ventana principal.
bh.SystemTray.OnInputWithSpatialPosition<MainTap, TwoTap>(() => bh.MainWindow.Show());
//bh.SystemTray.OnInputWithSpatialPosition<MainTap, TwoTap>(() =>
//{
// bh.WindowsApplication.TaskbarButtonVisibility(true);
// bh.MainWindow.Visibility(true);
// bh.SystemTray.Visibility(false);
//});

// Boton de la ventana principal -> Show() inteligente (issue #53):
// con click real ancla al rect del boton; sin contexto cae a icono/cursor.
bh.BtnMenu.OnInputWithSpatialPosition(() => bh.TrayMenu.Show());

// Testigo explicito: siempre en cursor, no lee el contexto del disparador.
bh.BtnCursor.OnInputWithSpatialPosition(() => bh.TrayMenu.ShowAtCursor());
bh.SystemTray.OnInputWithSpatialPosition<AlternativeTap1>(() => bh.GalleryMenu.Show());

bh.MiShow.OnInputWithSpatialPosition(() => bh.MainWindow.Show());
//bh.MiShow.OnInputWithSpatialPosition(() =>
//{
// bh.WindowsApplication.TaskbarButtonVisibility(true);
// bh.MainWindow.Visibility(true);
// bh.SystemTray.Visibility(false);
//});
bh.MiExit.OnInputWithSpatialPosition(() => bh.WindowsApplication.Terminate());

bh.MiShowMainWin.OnInputWithSpatialPosition(() => bh.MainWindow.Show());
})
.Initialize();
Loading