2016-05-01 3 views
0

Когда какое-то приложение в 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 или доставляется с клавиатуры.

ответ

0

Решена проблема со следующими 3 шага:

  1. Декларирование Ману бар в OS X также статический (здесь был сбой):

    #ifdef __APPLE__ 
        static Fl_Sys_Menu_Bar *s_menubar; 
    #else 
        Fl_Sys_Menu_Bar *m_menubar; 
    #endif 
    
  2. Сохранить текущий Shell::s_current не только на FL_FOCUS но в любом событии, обрабатываемом Shell, то есть каждый раз, когда он возвращает 1:

    int Shell::handle(int event) 
    { 
        int result = 0; 
        switch (event) 
        { 
         // Set result = 1 when handling the event 
         ... 
        } 
    #ifdef __APPLE__ 
        if (result == 1) 
        { 
         // We just selected some shell, it is current. 
         s_current = this; 
         cout << "Select shell with address: [" << s_current << "]" << endl; 
        } 
    #endif 
        return result; 
    } 
    
  3. Использование Shell::s_current для обратных вызовов меню на OS X, независимо от создания виджета вызова:

    Shell *Shell::currentShell(Fl_Widget *w) 
    { 
        Shell *result = 0; 
    #ifdef __APPLE__ 
        result = s_current; 
        cout << "Last selected shell address: [" << result << "]" << endl; 
    #else 
        cout << "Widget address: [" << w << "]" << endl; 
        if (w != 0) 
        { 
         result = (Shell *) w->window(); 
         cout << "Widget wingow address: [" << result << "]" << endl; 
        } 
    #endif 
        return result; 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^