feat(ui): implement heartbeat on Windows
This commit is contained in:
parent
36400afab4
commit
f494d46fee
|
@ -21,4 +21,5 @@
|
|||
pub enum UIEvent {
|
||||
TrayIconClick,
|
||||
ContextMenuClick(u32),
|
||||
Heartbeat,
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ const MAX_ICON_COUNT: usize = 3;
|
|||
|
||||
const UI_EVENT_TYPE_ICON_CLICK: i32 = 1;
|
||||
const UI_EVENT_TYPE_CONTEXT_MENU_CLICK: i32 = 2;
|
||||
const UI_EVENT_TYPE_HEARTBEAT: i32 = 3;
|
||||
|
||||
// Take a look at the native.h header file for an explanation of the fields
|
||||
#[repr(C)]
|
||||
|
@ -342,6 +343,9 @@ impl From<RawUIEvent> for Option<UIEvent> {
|
|||
UI_EVENT_TYPE_CONTEXT_MENU_CLICK => {
|
||||
return Some(UIEvent::ContextMenuClick(raw.context_menu_id));
|
||||
}
|
||||
UI_EVENT_TYPE_HEARTBEAT => {
|
||||
return Some(UIEvent::Heartbeat);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,8 @@ using json = nlohmann::json;
|
|||
#define APPWM_SHOW_CONTEXT_MENU (WM_APP + 2)
|
||||
#define APPWM_UPDATE_TRAY_ICON (WM_APP + 3)
|
||||
|
||||
#define HEARTBEAT_TIMER_ID 10001
|
||||
|
||||
const wchar_t *const ui_winclass = L"EspansoUI";
|
||||
|
||||
typedef struct
|
||||
|
@ -78,7 +80,7 @@ LRESULT CALLBACK ui_window_procedure(HWND window, unsigned int msg, WPARAM wp, L
|
|||
{
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
|
||||
|
||||
// Remove tray icon
|
||||
if (variables->options.show_icon)
|
||||
{
|
||||
|
@ -104,7 +106,7 @@ LRESULT CALLBACK ui_window_procedure(HWND window, unsigned int msg, WPARAM wp, L
|
|||
if (flags == 0)
|
||||
{
|
||||
event.event_type = UI_EVENT_TYPE_CONTEXT_MENU_CLICK;
|
||||
event.context_menu_id = (uint32_t) idItem;
|
||||
event.context_menu_id = (uint32_t)idItem;
|
||||
if (variables->event_callback && variables->rust_instance)
|
||||
{
|
||||
variables->event_callback(variables->rust_instance, event);
|
||||
|
@ -153,6 +155,18 @@ LRESULT CALLBACK ui_window_procedure(HWND window, unsigned int msg, WPARAM wp, L
|
|||
break;
|
||||
}
|
||||
}
|
||||
case WM_TIMER: // Regular timer check event
|
||||
{
|
||||
if (wp == HEARTBEAT_TIMER_ID)
|
||||
{
|
||||
event.event_type = UI_EVENT_TYPE_HEARTBEAT;
|
||||
if (variables->event_callback && variables->rust_instance)
|
||||
{
|
||||
variables->event_callback(variables->rust_instance, event);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
if (msg == WM_TASKBARCREATED)
|
||||
{ // Explorer crashed, recreate the icon
|
||||
|
@ -227,7 +241,7 @@ void *ui_initialize(void *_self, UIOptions _options, int32_t *error_code)
|
|||
SendMessage(window, WM_SETICON, ICON_BIG, (LPARAM)variables->g_icons[0]);
|
||||
SendMessage(window, WM_SETICON, ICON_SMALL, (LPARAM)variables->g_icons[0]);
|
||||
|
||||
// Tray icon
|
||||
// Tray icon
|
||||
variables->nid.cbSize = sizeof(variables->nid);
|
||||
variables->nid.hWnd = window;
|
||||
variables->nid.uID = 1;
|
||||
|
@ -241,6 +255,9 @@ void *ui_initialize(void *_self, UIOptions _options, int32_t *error_code)
|
|||
{
|
||||
Shell_NotifyIcon(NIM_ADD, &variables->nid);
|
||||
}
|
||||
|
||||
// Setup heartbeat timer
|
||||
SetTimer(window, HEARTBEAT_TIMER_ID, 1000, (TIMERPROC)NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
|
||||
#define UI_EVENT_TYPE_ICON_CLICK 1
|
||||
#define UI_EVENT_TYPE_CONTEXT_MENU_CLICK 2
|
||||
#define UI_EVENT_TYPE_HEARTBEAT 3
|
||||
|
||||
typedef struct {
|
||||
int32_t show_icon;
|
||||
|
|
Loading…
Reference in New Issue
Block a user