Minor optimization of macOS automatic Window menu

This commit is contained in:
ManoloFLTK 2024-02-27 13:46:41 +01:00
parent 4863f959c8
commit 746cbf861a
3 changed files with 9 additions and 23 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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);