From 4d46676ff6e59a7ff140055d50bc741b221ac122 Mon Sep 17 00:00:00 2001 From: Oscar Lesta Date: Thu, 1 Jan 2026 08:33:37 -0300 Subject: [PATCH] vmware_tray: add a time sync option, obey VMware settings. This also adds a GetGuiSetting() method to VMWBackdoor, and uses it to only enable mouse/clipboard sharing, and time sync with host, if those settings are actually enabled on VMware. Also added a SetGuiSetting(), but left it commented out, as I ended up not making use of it. --- shared_sources/VMWBackdoor.cpp | 33 +++++++++++++++ shared_sources/VMWBackdoor.h | 12 ++++++ shared_sources/VMWCoreBackdoor.h | 8 ++-- vmware_tray/VMWAddOns.h | 1 + vmware_tray/VMWAddOnsTray.cpp | 73 ++++++++++++++++++++++++++------ vmware_tray/VMWAddOnsTray.h | 3 +- 6 files changed, 113 insertions(+), 17 deletions(-) diff --git a/shared_sources/VMWBackdoor.cpp b/shared_sources/VMWBackdoor.cpp index 8e9daee..aaf47bf 100644 --- a/shared_sources/VMWBackdoor.cpp +++ b/shared_sources/VMWBackdoor.cpp @@ -178,6 +178,39 @@ VMWBackdoor::SetHostClipboard(char* text, size_t text_length) } +bool +VMWBackdoor::GetGUISetting(gui_setting setting) +{ + if (!InVMware()) + return 0; + + regs_t regs; + BackdoorCall(®s, VMW_BACK_GET_GUI_SETTING); + return (regs.eax & setting) != 0; +} + +/* +void +VMWBackdoor::SetGUISetting(gui_setting setting, bool enabled) +{ + if (!InVMware()) + return; + + regs_t regs; + // Get current settings: + BackdoorCall(®s, VMW_BACK_GET_GUI_SETTING); + ulong settings = regs.eax; + + // Set the one requested: + if (enabled) + settings |= setting; + else + settings &= (settings ^ setting); + + BackdoorCall(®s, VMW_BACK_SET_GUI_SETTING, setting); +} +*/ + ulong VMWBackdoor::GetHostClock() { diff --git a/shared_sources/VMWBackdoor.h b/shared_sources/VMWBackdoor.h index f9b1bfb..67ce097 100644 --- a/shared_sources/VMWBackdoor.h +++ b/shared_sources/VMWBackdoor.h @@ -12,6 +12,16 @@ class VMWBackdoor : public VMWCoreBackdoor { public: + // Only listing values still seen on VMware WS 17.x + enum gui_setting { + POINTER_GRAB_UNGRAB = 0x0003, // Grab (0x1)/Ungrab(0x2) are combined on newer versions. + // VMware-wide preference. + CLIP_BOARD_SHARING = 0x0010, // per-VM setting. + UNKOWN_SETTING_1 = 0x0200, + TIME_SYNC = 0x0400, // per-VM setting. Only one still used on open_vmware_tools code. + UNKOWN_SETTING_2 = 0x0800, + }; + VMWBackdoor(); virtual ~VMWBackdoor(); @@ -21,6 +31,8 @@ class VMWBackdoor : public VMWCoreBackdoor { void GetCursorStatus(uint16& status, uint16& to_read); status_t GetHostClipboard(char** text, size_t *text_length); status_t SetHostClipboard(char* text, size_t length); + bool GetGUISetting(gui_setting setting); + // void SetGUISetting(gui_setting setting, bool enabled); ulong GetHostClock(); }; diff --git a/shared_sources/VMWCoreBackdoor.h b/shared_sources/VMWCoreBackdoor.h index 8bcd359..2f71179 100644 --- a/shared_sources/VMWCoreBackdoor.h +++ b/shared_sources/VMWCoreBackdoor.h @@ -10,14 +10,12 @@ #include -#define VMW_BACK_MAGIC 0x564D5868UL // https://web.archive.org/web/20100610223425/http://chitchat.at.infoseek.co.jp/vmware/backdoor.html +#define VMW_BACK_MAGIC 0x564D5868UL #define VMW_BACK_PORT 0x00005658UL #define VMWARE_ERROR 0xFFFF -#define VMW_BACK_GET_VERSION 0x0A - #define VMW_BACK_RPC_MAGIC 0x49435052UL #define VMW_BACK_RPC_PORT 0x5658 #define VMW_BACK_RPC_PORT2 0x5659 @@ -29,11 +27,15 @@ #define VMW_BACK_RPC_OK 0x00010000UL #define VMW_BACK_RPC_SEND_L_OK 0x00810000UL #define VMW_BACK_RPC_GET_L_OK 0x00830000UL + #define VMW_BACK_GET_CURSOR 0x04 #define VMW_BACK_GET_CLIP_LENGTH 0x06 #define VMW_BACK_GET_CLIP_DATA 0x07 #define VMW_BACK_SET_CLIP_LENGTH 0x08 #define VMW_BACK_SET_CLIP_DATA 0x09 +#define VMW_BACK_GET_VERSION 0x0A +#define VMW_BACK_GET_GUI_SETTING 0x0D +#define VMW_BACK_SET_GUI_SETTING 0x0E #define VMW_BACK_GET_HOST_TIME 0x17 #define VMW_BACK_MOUSE_DATA 0x27 #define VMW_BACK_MOUSE_STATUS 0x28 diff --git a/vmware_tray/VMWAddOns.h b/vmware_tray/VMWAddOns.h index 6744307..d4c1a0f 100644 --- a/vmware_tray/VMWAddOns.h +++ b/vmware_tray/VMWAddOns.h @@ -16,6 +16,7 @@ #define RELOAD_SETTINGS 'reSg' #define MOUSE_SHARING 'moSh' #define CLIPBOARD_SHARING 'clSh' +#define TIMESYNC_HOST 'TsyH' #define REMOVE_FROM_DESKBAR 'rmDe' #define CLIPBOARD_POLL 'clPo' #define CLOCK_POLL 'ckPo' diff --git a/vmware_tray/VMWAddOnsTray.cpp b/vmware_tray/VMWAddOnsTray.cpp index 06b2f37..0ba4a64 100644 --- a/vmware_tray/VMWAddOnsTray.cpp +++ b/vmware_tray/VMWAddOnsTray.cpp @@ -126,7 +126,7 @@ void VMWAddOnsTray::MouseDown(BPoint where) { ConvertToScreen(&where); - VMWAddOnsMenu* menu = new VMWAddOnsMenu(this, backdoor.InVMware()); + VMWAddOnsMenu* menu = new VMWAddOnsMenu(this, backdoor); menu->Go(where, true, true, ConvertToScreen(Bounds()), true); } @@ -136,21 +136,43 @@ VMWAddOnsTray::MessageReceived(BMessage* message) switch(message->what) { case MOUSE_SHARING: { - bool sharing_enabled = settings.GetBool("mouse_enabled", true); - settings.SetBool("mouse_enabled", !sharing_enabled); + bool value = settings.GetBool("mouse_enabled", true); + value = !value; + // Only enable mouse sharing if both guest and host have it enabled. + if (!backdoor.GetGUISetting(VMWBackdoor::POINTER_GRAB_UNGRAB)) + value = false; + + settings.SetBool("mouse_enabled", value); this->Invalidate(); } break; case CLIPBOARD_SHARING: { - bool sharing_enabled = settings.GetBool("clip_enabled", true); - settings.SetBool("clip_enabled", !sharing_enabled); - SetClipboardSharing(!sharing_enabled); + bool value = settings.GetBool("clip_enabled", true); + value = !value; + // Only enable clipboard sharing if both guest and host have it enabled. + if (!backdoor.GetGUISetting(VMWBackdoor::CLIP_BOARD_SHARING)) + value = false; + + settings.SetBool("clip_enabled", value); + SetClipboardSharing(value); this->Invalidate(); } break; + case TIMESYNC_HOST: + { + bool value = settings.GetBool("timesync_enabled", true); + value = !value; + // Only enable timesync if both guest and host have it enabled. + if (!backdoor.GetGUISetting(VMWBackdoor::TIME_SYNC)) + value = false; + settings.SetBool("timesync_enabled", value); + SetTimeSynchronization(value); + } + break; + case REMOVE_FROM_DESKBAR: RemoveMyself(true); break; @@ -254,10 +276,10 @@ VMWAddOnsTray::AttachedToWindow() SetLowColor(ViewColor()); - if (backdoor.InVMware()) + if (backdoor.InVMware()) { SetClipboardSharing(settings.GetBool("clip_enabled", true)); - - clock_sync = new BMessageRunner(this, new BMessage(CLOCK_POLL), CLOCK_POLL_DELAY); + SetTimeSynchronization(settings.GetBool("timesync_enabled", true)); + } } void @@ -274,6 +296,18 @@ VMWAddOnsTray::SetClipboardSharing(bool enable) } } + +void +VMWAddOnsTray::SetTimeSynchronization(bool enable) +{ + delete clock_sync; + clock_sync = NULL; + + if (enable) + clock_sync = new BMessageRunner(this, new BMessage(CLOCK_POLL), CLOCK_POLL_DELAY); +} + + int32 removeFromDeskbar(void *) { @@ -316,20 +350,33 @@ VMWAddOnsTray::RemoveMyself(bool askUser) } } -VMWAddOnsMenu::VMWAddOnsMenu(VMWAddOnsTray* tray, bool in_vmware) +VMWAddOnsMenu::VMWAddOnsMenu(VMWAddOnsTray* tray, VMWBackdoor& backdoor) :BPopUpMenu("tray_menu", false, false) { BMenuItem* menu_item; SetFont(be_plain_font); - if (in_vmware) { + if (backdoor.InVMware()) { menu_item = new BMenuItem("Enable mouse sharing", new BMessage(MOUSE_SHARING)); - menu_item->SetMarked(settings.GetBool("mouse_enabled", true));; + if (backdoor.GetGUISetting(VMWBackdoor::POINTER_GRAB_UNGRAB)) + menu_item->SetMarked(settings.GetBool("mouse_enabled", true)); + else + menu_item->SetMarked(false); AddItem(menu_item); menu_item = new BMenuItem("Enable clipboard sharing", new BMessage(CLIPBOARD_SHARING)); - menu_item->SetMarked(settings.GetBool("clip_enabled", true)); + if (backdoor.GetGUISetting(VMWBackdoor::CLIP_BOARD_SHARING)) + menu_item->SetMarked(settings.GetBool("clip_enabled", true)); + else + menu_item->SetMarked(false); + AddItem(menu_item); + + menu_item = new BMenuItem("Enable time synchronization", new BMessage(TIMESYNC_HOST)); + if (backdoor.GetGUISetting(VMWBackdoor::TIME_SYNC)) + menu_item->SetMarked(settings.GetBool("timesync_enabled", true)); + else + menu_item->SetMarked(false); AddItem(menu_item); if (!tray->cleanup_in_process) diff --git a/vmware_tray/VMWAddOnsTray.h b/vmware_tray/VMWAddOnsTray.h index 953e1b1..519b6c9 100644 --- a/vmware_tray/VMWAddOnsTray.h +++ b/vmware_tray/VMWAddOnsTray.h @@ -36,6 +36,7 @@ class VMWAddOnsTray: public BView { void init(); void RemoveMyself(bool askUser); void SetClipboardSharing(bool enable); + void SetTimeSynchronization(bool enable); BBitmap* icon_all; BBitmap* icon_mouse; @@ -52,7 +53,7 @@ class VMWAddOnsTray: public BView { class VMWAddOnsMenu: public BPopUpMenu { public: - VMWAddOnsMenu(VMWAddOnsTray* tray, bool in_vmware); + VMWAddOnsMenu(VMWAddOnsTray* tray, VMWBackdoor& backdoor); virtual ~VMWAddOnsMenu(); };