From 746cbf861a5a441695b2fc653ed8327a9b409035 Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Tue, 27 Feb 2024 13:46:41 +0100 Subject: [PATCH] Minor optimization of macOS automatic Window menu --- src/Fl_MacOS_Sys_Menu_Bar.mm | 28 +++++-------------- src/Fl_cocoa.mm | 2 +- .../Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H | 2 +- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/src/Fl_MacOS_Sys_Menu_Bar.mm b/src/Fl_MacOS_Sys_Menu_Bar.mm index 3221a38aa..bacabc7da 100644 --- a/src/Fl_MacOS_Sys_Menu_Bar.mm +++ b/src/Fl_MacOS_Sys_Menu_Bar.mm @@ -447,6 +447,7 @@ static int process_sys_menu_shortcuts(int event) Fl_MacOS_Sys_Menu_Bar_Driver::Fl_MacOS_Sys_Menu_Bar_Driver() : Fl_Sys_Menu_Bar_Driver() { window_menu_items = NULL; + first_window_menu_item = 0; Fl::add_handler(process_sys_menu_shortcuts); } @@ -625,50 +626,35 @@ void Fl_MacOS_Sys_Menu_Bar_Driver::create_window_menu(void) } if (!window_menu_items_count) { window_menu_items_count = 6; - window_menu_items = (Fl_Menu_Item*)malloc(window_menu_items_count * sizeof(Fl_Menu_Item)); + window_menu_items = (Fl_Menu_Item*)calloc(window_menu_items_count, sizeof(Fl_Menu_Item)); } rank = fl_sys_menu_bar->Fl_Menu_::insert(rank, "Window", 0, NULL, window_menu_items, FL_SUBMENU_POINTER); localized_Window = NSLocalizedString(@"Window", nil); - memset(window_menu_items, 0, sizeof(Fl_Menu_Item)); window_menu_items[0].label("Minimize"); window_menu_items[0].callback(minimize_win_cb); window_menu_items[0].shortcut(FL_COMMAND+'m'); window_menu_items[0].flags = FL_MENU_DIVIDER; - rank = 1; + first_window_menu_item = 1; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_12 if (fl_mac_os_version >= 101200 && window_menu_style() != Fl_Sys_Menu_Bar::tabbing_mode_none) { - memset(window_menu_items + 1, 0, sizeof(Fl_Menu_Item)); window_menu_items[1].label("Show Previous Tab"); window_menu_items[1].callback(previous_tab_cb); window_menu_items[1].shortcut(FL_SHIFT+FL_CTRL+0x9); - memset(window_menu_items+2, 0, sizeof(Fl_Menu_Item)); window_menu_items[2].label("Show Next Tab"); window_menu_items[2].callback(next_tab_cb); window_menu_items[2].shortcut(FL_CTRL+0x9); - memset(window_menu_items+3, 0, sizeof(Fl_Menu_Item)); window_menu_items[3].label("Move Tab To New Window"); window_menu_items[3].callback(move_tab_cb); - memset(window_menu_items+4, 0, sizeof(Fl_Menu_Item)); window_menu_items[4].label("Merge All Windows"); window_menu_items[4].callback(merge_all_windows_cb); window_menu_items[4].flags = FL_MENU_DIVIDER; - rank = 5; + first_window_menu_item = 5; } #endif - memset(window_menu_items+rank, 0, sizeof(Fl_Menu_Item)); - window_menu_items[rank-1].user_data(&window_menu_style_); fl_sys_menu_bar->menu_end(); fl_sys_menu_bar->update(); } -int Fl_MacOS_Sys_Menu_Bar_Driver::find_first_window() -{ - int count = window_menu_items->size(), i; - for (i = 0; i < count; i++) { - if (window_menu_items[i].user_data() == &window_menu_style_) break; - } - return i < count ? i : -1; -} void Fl_MacOS_Sys_Menu_Bar_Driver::new_window(Fl_Window *win) { @@ -694,7 +680,7 @@ void Fl_MacOS_Sys_Menu_Bar_Driver::new_window(Fl_Window *win) void Fl_MacOS_Sys_Menu_Bar_Driver::remove_window(Fl_Window *win) { if (!window_menu_style()) return; - int index = find_first_window() + 1; + int index = first_window_menu_item; if (index < 1) return; while (true) { Fl_Menu_Item *item = window_menu_items + index; @@ -705,7 +691,7 @@ void Fl_MacOS_Sys_Menu_Bar_Driver::remove_window(Fl_Window *win) if (count - index - 1 > 0) memmove(item, item + 1, (count - index - 1)*sizeof(Fl_Menu_Item)); memset(window_menu_items + count - 2, 0, sizeof(Fl_Menu_Item)); if (doit) { // select Fl::first_window() in Window menu - item = window_menu_items + find_first_window() + 1; + item = window_menu_items + first_window_menu_item; while (item->label() && item->user_data() != Fl::first_window()) item++; if (item->label()) { ((Fl_Window*)item->user_data())->show(); @@ -722,7 +708,7 @@ void Fl_MacOS_Sys_Menu_Bar_Driver::remove_window(Fl_Window *win) void Fl_MacOS_Sys_Menu_Bar_Driver::rename_window(Fl_Window *win) { if (!window_menu_style()) return; - int index = find_first_window() + 1; + int index = first_window_menu_item; if (index < 1) return; while (true) { Fl_Menu_Item *item = window_menu_items + index; diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 39705d278..875109e45 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1395,7 +1395,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; update_e_xy_and_e_xy_root(nsw); if (fl_sys_menu_bar && Fl_MacOS_Sys_Menu_Bar_Driver::window_menu_style()) { // select the corresponding Window menu item - int index = Fl_MacOS_Sys_Menu_Bar_Driver::driver()->find_first_window() + 1; + int index = Fl_MacOS_Sys_Menu_Bar_Driver::driver()->first_window_menu_item; while (index > 0) { Fl_Menu_Item *item = Fl_MacOS_Sys_Menu_Bar_Driver::driver()->window_menu_items + index; if (!item->label()) break; diff --git a/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H b/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H index c670a643b..684ae91f6 100644 --- a/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H +++ b/src/drivers/Cocoa/Fl_MacOS_Sys_Menu_Bar_Driver.H @@ -22,6 +22,7 @@ class Fl_MacOS_Sys_Menu_Bar_Driver : public Fl_Sys_Menu_Bar_Driver { public: Fl_Menu_Item *window_menu_items; + int first_window_menu_item; Fl_MacOS_Sys_Menu_Bar_Driver(); virtual ~Fl_MacOS_Sys_Menu_Bar_Driver(); void update() FL_OVERRIDE; @@ -39,7 +40,6 @@ public: void replace(int index, const char *name) FL_OVERRIDE; void mode(int i, int fl) FL_OVERRIDE; void create_window_menu() FL_OVERRIDE; - int find_first_window(); void new_window(Fl_Window *win); void remove_window(Fl_Window *win); void rename_window(Fl_Window *win);