Minor optimization of macOS automatic Window menu
This commit is contained in:
parent
4863f959c8
commit
746cbf861a
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user