Skip to content

Commit 2745a4e

Browse files
committed
Remove Menu enabled state API and implementation
Eliminates the SetEnabled and IsEnabled methods from the Menu class and its C API, along with related internal state and logic on all platforms. Menu items retain their enabled state, but menus themselves are no longer globally enabled/disabled. This simplifies the menu API and implementation.
1 parent 2e3acb5 commit 2745a4e

File tree

6 files changed

+25
-137
lines changed

6 files changed

+25
-137
lines changed

src/capi/menu_c.cpp

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -885,29 +885,6 @@ bool native_menu_close(native_menu_t menu) {
885885
}
886886
}
887887

888-
void native_menu_set_enabled(native_menu_t menu, bool enabled) {
889-
if (!menu)
890-
return;
891-
892-
try {
893-
auto menu_ptr = static_cast<Menu*>(menu);
894-
menu_ptr->SetEnabled(enabled);
895-
} catch (...) {
896-
// Ignore exceptions
897-
}
898-
}
899-
900-
bool native_menu_is_enabled(native_menu_t menu) {
901-
if (!menu)
902-
return false;
903-
904-
try {
905-
auto menu_ptr = static_cast<Menu*>(menu);
906-
return menu_ptr->IsEnabled();
907-
} catch (...) {
908-
return false;
909-
}
910-
}
911888

912889
// New menu event listener API implementation
913890
int native_menu_add_listener(native_menu_t menu,

src/capi/menu_c.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -506,22 +506,6 @@ bool native_menu_open(native_menu_t menu);
506506
FFI_PLUGIN_EXPORT
507507
bool native_menu_close(native_menu_t menu);
508508

509-
/**
510-
* Set the enabled state of the menu
511-
* @param menu The menu
512-
* @param enabled true to enable, false to disable
513-
*/
514-
FFI_PLUGIN_EXPORT
515-
void native_menu_set_enabled(native_menu_t menu, bool enabled);
516-
517-
/**
518-
* Check if the menu is enabled
519-
* @param menu The menu
520-
* @return true if enabled, false otherwise
521-
*/
522-
FFI_PLUGIN_EXPORT
523-
bool native_menu_is_enabled(native_menu_t menu);
524-
525509
/**
526510
* Add event listener for a menu
527511
* @param menu The menu

src/menu.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -686,22 +686,6 @@ class Menu : public EventEmitter<MenuEvent>, public NativeObjectProvider {
686686
*/
687687
bool Close();
688688

689-
/**
690-
* @brief Enable or disable the entire menu.
691-
*
692-
* When disabled, all menu items become non-interactive.
693-
*
694-
* @param enabled true to enable the menu, false to disable it
695-
*/
696-
void SetEnabled(bool enabled);
697-
698-
/**
699-
* @brief Check if the menu is currently enabled.
700-
*
701-
* @return true if the menu is enabled, false if disabled
702-
*/
703-
bool IsEnabled() const;
704-
705689
protected:
706690
/**
707691
* @brief Internal method to get the platform-specific native menu object.

src/platform/linux/menu_linux.cpp

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ class MenuItem::Impl {
6565
title_(""),
6666
tooltip_(""),
6767
type_(type),
68-
enabled_(true),
6968
state_(MenuItemState::Unchecked),
7069
radio_group_(-1),
7170
accelerator_("", KeyboardAccelerator::None) {}
@@ -76,7 +75,6 @@ class MenuItem::Impl {
7675
std::shared_ptr<Image> image_;
7776
std::optional<std::string> tooltip_;
7877
MenuItemType type_;
79-
bool enabled_;
8078
MenuItemState state_;
8179
int radio_group_;
8280
KeyboardAccelerator accelerator_;
@@ -197,14 +195,16 @@ void MenuItem::RemoveAccelerator() {
197195
}
198196

199197
void MenuItem::SetEnabled(bool enabled) {
200-
pimpl_->enabled_ = enabled;
201198
if (pimpl_->gtk_menu_item_) {
202199
gtk_widget_set_sensitive(pimpl_->gtk_menu_item_, enabled ? TRUE : FALSE);
203200
}
204201
}
205202

206203
bool MenuItem::IsEnabled() const {
207-
return pimpl_->enabled_;
204+
if (pimpl_->gtk_menu_item_) {
205+
return gtk_widget_get_sensitive(pimpl_->gtk_menu_item_) == TRUE;
206+
}
207+
return true;
208208
}
209209

210210
void MenuItem::SetState(MenuItemState state) {
@@ -261,7 +261,7 @@ void MenuItem::RemoveSubmenu() {
261261
}
262262

263263
bool MenuItem::Trigger() {
264-
if (!pimpl_->enabled_)
264+
if (!IsEnabled())
265265
return false;
266266
if (pimpl_->gtk_menu_item_) {
267267
g_signal_emit_by_name(pimpl_->gtk_menu_item_, "activate");
@@ -277,12 +277,11 @@ void* MenuItem::GetNativeObjectInternal() const {
277277
// Private implementation class for Menu
278278
class Menu::Impl {
279279
public:
280-
Impl(MenuId id, GtkWidget* menu) : id_(id), gtk_menu_(menu), enabled_(true) {}
280+
Impl(MenuId id, GtkWidget* menu) : id_(id), gtk_menu_(menu) {}
281281

282282
MenuId id_;
283283
GtkWidget* gtk_menu_;
284284
std::vector<std::shared_ptr<MenuItem>> items_;
285-
bool enabled_;
286285
};
287286

288287
Menu::Menu() {
@@ -441,17 +440,6 @@ bool Menu::Close() {
441440
return false;
442441
}
443442

444-
void Menu::SetEnabled(bool enabled) {
445-
pimpl_->enabled_ = enabled;
446-
if (pimpl_->gtk_menu_) {
447-
gtk_widget_set_sensitive(pimpl_->gtk_menu_, enabled ? TRUE : FALSE);
448-
}
449-
}
450-
451-
bool Menu::IsEnabled() const {
452-
return pimpl_->enabled_;
453-
}
454-
455443
void* Menu::GetNativeObjectInternal() const {
456444
return (void*)pimpl_->gtk_menu_;
457445
}

src/platform/macos/menu_macos.mm

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ - (void)menuDidClose:(NSMenu*)menu {
195195
std::optional<std::string> tooltip_;
196196
KeyboardAccelerator accelerator_;
197197
bool has_accelerator_;
198-
bool enabled_;
199198
MenuItemState state_;
200199
int radio_group_;
201200
std::shared_ptr<Menu> submenu_;
@@ -209,7 +208,6 @@ - (void)menuDidClose:(NSMenu*)menu {
209208
type_(type),
210209
accelerator_("", KeyboardAccelerator::None),
211210
has_accelerator_(false),
212-
enabled_(true),
213211
state_(MenuItemState::Unchecked),
214212
radio_group_(-1),
215213
submenu_opened_listener_id_(0),
@@ -382,12 +380,11 @@ - (void)menuDidClose:(NSMenu*)menu {
382380
}
383381

384382
void MenuItem::SetEnabled(bool enabled) {
385-
pimpl_->enabled_ = enabled;
386383
[pimpl_->ns_menu_item_ setEnabled:enabled];
387384
}
388385

389386
bool MenuItem::IsEnabled() const {
390-
return pimpl_->enabled_;
387+
return [pimpl_->ns_menu_item_ isEnabled];
391388
}
392389

393390
void MenuItem::SetState(MenuItemState state) {
@@ -528,7 +525,7 @@ - (void)menuDidClose:(NSMenu*)menu {
528525
}
529526

530527
bool MenuItem::Trigger() {
531-
if (!pimpl_->enabled_)
528+
if (!IsEnabled())
532529
return false;
533530

534531
// Call the block directly instead of going through target-action
@@ -549,15 +546,11 @@ - (void)menuDidClose:(NSMenu*)menu {
549546
NSMenu* ns_menu_;
550547
NSMenuDelegateImpl* delegate_;
551548
std::vector<std::shared_ptr<MenuItem>> items_;
552-
bool enabled_;
553-
bool visible_;
554549

555550
Impl(MenuId id, NSMenu* menu)
556551
: id_(id),
557552
ns_menu_(menu),
558-
delegate_([[NSMenuDelegateImpl alloc] init]),
559-
enabled_(true),
560-
visible_(false) {
553+
delegate_([[NSMenuDelegateImpl alloc] init]) {
561554
[ns_menu_ setDelegate:delegate_];
562555
}
563556

@@ -735,14 +728,11 @@ - (void)menuDidClose:(NSMenu*)menu {
735728
clickCount:1
736729
pressure:1.0];
737730

738-
pimpl_->visible_ = true;
739-
740731
@autoreleasepool {
741732
NSView* dummy_view = [[NSView alloc] init];
742733
[NSMenu popUpContextMenu:pimpl_->ns_menu_ withEvent:event forView:dummy_view];
743734
}
744735

745-
pimpl_->visible_ = false;
746736
return true;
747737
}
748738

@@ -762,8 +752,6 @@ - (void)menuDidClose:(NSMenu*)menu {
762752

763753
NSPoint point = NSMakePoint(x, final_y);
764754

765-
pimpl_->visible_ = true;
766-
767755
// Use dispatch to ensure menu popup happens on the main run loop
768756
dispatch_async(dispatch_get_main_queue(), ^{
769757
[pimpl_->ns_menu_ popUpMenuPositioningItem:nil atLocation:point inView:content_view];
@@ -778,24 +766,8 @@ - (void)menuDidClose:(NSMenu*)menu {
778766
}
779767

780768
bool Menu::Close() {
781-
if (pimpl_->visible_) {
782-
[pimpl_->ns_menu_ cancelTracking];
783-
pimpl_->visible_ = false;
784-
return true;
785-
}
786-
return false;
787-
}
788-
789-
void Menu::SetEnabled(bool enabled) {
790-
pimpl_->enabled_ = enabled;
791-
// Enable/disable all items
792-
for (auto& item : pimpl_->items_) {
793-
item->SetEnabled(enabled);
794-
}
795-
}
796-
797-
bool Menu::IsEnabled() const {
798-
return pimpl_->enabled_;
769+
[pimpl_->ns_menu_ cancelTracking];
770+
return true;
799771
}
800772

801773
void* Menu::GetNativeObjectInternal() const {

src/platform/windows/menu_windows.cpp

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ class MenuItem::Impl {
9797
std::optional<std::string> tooltip_;
9898
KeyboardAccelerator accelerator_;
9999
bool has_accelerator_;
100-
bool enabled_;
101100
MenuItemState state_;
102101
int radio_group_;
103102
std::shared_ptr<Menu> submenu_;
@@ -108,7 +107,6 @@ class MenuItem::Impl {
108107
type_(type),
109108
accelerator_("", KeyboardAccelerator::None),
110109
has_accelerator_(false),
111-
enabled_(true),
112110
state_(MenuItemState::Unchecked),
113111
radio_group_(-1) {}
114112

@@ -195,14 +193,19 @@ void MenuItem::RemoveAccelerator() {
195193
}
196194

197195
void MenuItem::SetEnabled(bool enabled) {
198-
pimpl_->enabled_ = enabled;
199196
if (pimpl_->parent_menu_) {
200197
EnableMenuItem(pimpl_->parent_menu_, pimpl_->id_, enabled ? MF_ENABLED : MF_GRAYED);
201198
}
202199
}
203200

204201
bool MenuItem::IsEnabled() const {
205-
return pimpl_->enabled_;
202+
if (pimpl_->parent_menu_) {
203+
UINT state = GetMenuState(pimpl_->parent_menu_, pimpl_->id_, MF_BYCOMMAND);
204+
if (state != (UINT)-1) {
205+
return !(state & MF_GRAYED);
206+
}
207+
}
208+
return true;
206209
}
207210

208211
void MenuItem::SetState(MenuItemState state) {
@@ -267,7 +270,7 @@ void MenuItem::RemoveSubmenu() {
267270
}
268271

269272
bool MenuItem::Trigger() {
270-
if (!pimpl_->enabled_)
273+
if (!IsEnabled())
271274
return false;
272275

273276
try {
@@ -288,12 +291,10 @@ class Menu::Impl {
288291
MenuId id_;
289292
HMENU hmenu_;
290293
std::vector<std::shared_ptr<MenuItem>> items_;
291-
bool enabled_;
292-
bool visible_;
293294
int window_proc_handle_id_;
294295

295296
Impl(MenuId id, HMENU menu)
296-
: id_(id), hmenu_(menu), enabled_(true), visible_(false), window_proc_handle_id_(-1) {}
297+
: id_(id), hmenu_(menu), window_proc_handle_id_(-1) {}
297298

298299
~Impl() {
299300
// Unregister window procedure handler
@@ -320,8 +321,6 @@ class Menu::Impl {
320321

321322
if (popup_menu == hmenu_) {
322323
// This is our menu being opened
323-
visible_ = true;
324-
325324
// Emit menu opened event
326325
try {
327326
menu->Emit<MenuOpenedEvent>(id_);
@@ -335,8 +334,6 @@ class Menu::Impl {
335334

336335
if (popup_menu == hmenu_) {
337336
// This is our menu being closed
338-
visible_ = false;
339-
340337
// Emit menu closed event
341338
try {
342339
menu->Emit<MenuClosedEvent>(id_);
@@ -568,30 +565,16 @@ bool Menu::Open() {
568565
}
569566

570567
bool Menu::Close() {
571-
if (pimpl_->visible_) {
572-
// Send WM_CANCELMODE to close any open menus
573-
HWND host_window = WindowMessageDispatcher::GetInstance().GetHostWindow();
574-
if (host_window) {
575-
// This will close the menu and trigger WM_UNINITMENUPOPUP
576-
SendMessage(host_window, WM_CANCELMODE, 0, 0);
577-
}
568+
// Send WM_CANCELMODE to close any open menus
569+
HWND host_window = WindowMessageDispatcher::GetInstance().GetHostWindow();
570+
if (host_window) {
571+
// This will close the menu and trigger WM_UNINITMENUPOPUP
572+
SendMessage(host_window, WM_CANCELMODE, 0, 0);
578573
return true;
579574
}
580575
return false;
581576
}
582577

583-
void Menu::SetEnabled(bool enabled) {
584-
pimpl_->enabled_ = enabled;
585-
// Enable/disable all items
586-
for (auto& item : pimpl_->items_) {
587-
item->SetEnabled(enabled);
588-
}
589-
}
590-
591-
bool Menu::IsEnabled() const {
592-
return pimpl_->enabled_;
593-
}
594-
595578
void* Menu::GetNativeObjectInternal() const {
596579
return pimpl_->hmenu_;
597580
}

0 commit comments

Comments
 (0)