Когда какое-то приложение в OS X имеет несколько окон (много открытых документов, каждый в собственном окне), кажется, что все они имеют одинаковое системное меню, по крайней мере, в FLTK. Есть ли способ найти последнее выбранное окно для отправки в него события из меню?Окна FLTK в Mac OS X используют одно и то же системное меню
Вот моя настройка (Mac OS X 10.6.2, FLTK 1.3.3): есть класс Shell
с системным меню. Каждый раз, когда новый документ открыт, новый Shell
создан:
#ifdef __APPLE__
void Shell::macOpen(const char *fileName)
{
// If there are empty shell, open the model in it
if (s_empty != 0)
{
...
s_empty = 0;
}
// Otherwise, create new shell with the model
else
{
char *args[1];
args[0] = (char *) fileName;
new Shell(1, args, s_conf, s_dct, fileName, 1);
}
}
#endif
Тогда я уследить на самой последней выбранной Shell
спасительной его в static Shell *Shell::s_current
:
int Shell::handle(int event)
{
...
case FL_FOCUS:
#ifdef __APPLE__
// We just selected some shell, it is current.
s_current = this;
cout << "Select shell with address: [" << s_current << "]" << endl;
#endif
return 1;
...
}
Эта часть, кажется, работает, как я могу увидеть следы каждый раз, когда я выбрать несколько Shell
:
Select shell with address: [0x8206db0]
Select shell with address: [0x82375f0]
Select shell with address: [0x5d20650]
Select shell with address: [0x82375f0]
Теперь, учитывая:
Shell *Shell::currentShell(Fl_Widget *w)
{
cout << "Widget address: [" << w << "]" << endl;
Shell *result = 0;
if (w != 0)
{
result = (Shell *) w->window();
cout << "Widget wingow address: [" << result << "]" << endl;
}
#ifdef __APPLE__
else
{
result = s_current;
cout << "Last selected shell address: [" << result << "]" << endl;
}
#endif
return result;
}
У меня есть обратный вызов:
void Shell::shortcutCB(Fl_Widget *w, void *data)
{
cout << "Shortcut" << endl;
Shell *ref = currentShell(w);
if (ref != 0)
{
...
}
}
Когда этот обратный вызов выполняется из меню и больше Shell
s открыты, я получаю следующее сообщение об ошибке:
Bus error
без следов от либо Shell::shortcutCB
, либо Shell::currentShell
. Когда открыт только Shell
, все работает отлично. Когда больше Shell
s открыты, и я закрываю все, кроме одного, ошибка возникает снова. Нет проблем, когда один и тот же обратный вызов вызывается из какого-то виджета в пределах Shell
или доставляется с клавиатуры.