2015-08-31 4 views
0

Пока я это понимаю, событие X11 FocusIn запускается всякий раз, когда окно фокусируется. Это окно, в которое отправляется ввод с клавиатуры. У меня возникли проблемы с запуском этого события. Я создаю окно FocusChangeMask для создания окна. Я создал точку останова внутри моего обработчика событий, где предполагается событие FocusIn, и оно не останавливается.X11 FocusIn не работает

У меня есть 2 отдельных окна, прозрачный один и один непрозрачный. В настоящее время у меня есть это, поэтому прозрачное окно всегда находится поверх прозрачного окна. Всякий раз, когда я переключаю фокус и затем переключаюсь обратно в прозрачное окно, непрозрачное окно находится прямо под ним. Это заставляет другие окна застревать между прозрачным и непрозрачным окном.

Я заметил, что всякий раз, когда я фокусируюсь на непрозрачном окне, которое находится под ним, запускается событие FocusIn. Я не могу получить прозрачное окно для запуска события. Это связано с тем, что окно находится в 32-битном цвете?

Что мне не хватает?

while(!renderer->stop) 
    { 
     XNextEvent(renderer->x_display, &event); 
     switch(event.type) 
     { 
      case Expose: 
      if (event.xexpose.window == gstreamer_window) 
      { 
       XRaiseWindow(renderer->x_display, renderer->opengl_window); 
      } 
      break; 

      case FocusIn: 
      if (event.xfocus.window == renderer->opengl_window) 
      { 
       XRaiseWindow(renderer->x_display, gstreamer_window); 
      } 
      break; 

      case ConfigureNotify: 
      if (event.xconfigure.window == renderer->opengl_window) 
      { 
       XMoveWindow(renderer->x_display, gstreamer_window, 
          event.xconfigure.x, event.xconfigure.y - top_border_offset); 
      } 
      break; 
     } 
    } 

Вот как я создал окно.

XSetWindowAttributes swa; 
    swa.event_mask = ExposureMask | PointerMotionMask | KeyPressMask | FocusChangeMask; 
    swa.colormap = XCreateColormap(x_display, XDefaultRootWindow(x_display), visual, AllocNone); 
    swa.background_pixel = 0; 
    swa.border_pixel = 0; 

    /* Create a window */ 
    opengl_window = XCreateWindow (
       x_display, parent, 
       0, 0, m_plane_width, m_plane_height, 0, 
       depth, InputOutput, 
       visual, CWEventMask | CWBackPixel | CWColormap | CWBorderPixel, 
       &swa); 

ответ

0

Кажется, что я установил FocusChangeMask в неправильном месте. Добавив строку XSelectInput(x_display, opengl_window, FocusChangeMask) , она теперь вызывает событие FocusIn. Он запускал другой дисплей, потому что у него была маска, но этого не было.

0

Это не ясно из вашего вопроса, окно, упомянутое в вашем вопросе, являются ли главными окнами приложений уровня, или вторичными, вспомогательные окна, которые являются дочерними окнами ваших окон верхнего уровня приложения.

Но во всех случаях правильная обработка входного фокуса требует, чтобы вы указали оконному менеджеру точно, как ваше приложение ожидает обработки фокуса ввода.

Для получения дополнительной информации см. section 4.1.7 of the ICCCM specification. К сожалению, недостаточно просто закодировать цикл событий, который обрабатывает сообщения FocusIn и ожидает, что они упадут с неба. Во-первых, вам нужно сообщить своему оконному менеджеру, как именно вы собираетесь обрабатывать переключение ввода фокуса, а затем отвечать на сообщения диспетчера окон, как описано в спецификации ICCCM; возможно, путем явной отправки запросов SetInputFocus для ваших собственных окон приложений.

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