LINUX.ORG.RU

Как определить: Widget перекрыт окнами и не виден юзеру?

 ,


0

1

Подскажите кто хорошо знает Gtk/Gdk, какой сигнал отлавливать, когда окно Gtk.Window с виджетом Gtk.DrawingArea перекрывается другим окном и виджет становится не видимым пользователю.

Виджет использую для вывода видео-потока и хочу останавливать поток во всех случаях, когда юзер: открыл другое окно поверх, переключился на другую вкладку, свернул приложение и т.д., т.е. когда он не видит вывод видео.

Дело в том, что видео жрет ресурсы, а смысл их если юзер его не видит.

Курю документацию:
http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk::Widget

Но сигналов много, а описаны плохо. Запутался.

p.s. Попутный вопрос по ruby: я показываю видео в отдельном потоке Thread.new do обработка видео end. Но все равно gtk-приложение тормозит, отзывчивость снижена, менюшки медленно открываются. Как еще сильнее запихать видео в фон? Какие есть способы кроме рубиевского Thread?

★★★★★

Ответ на: комментарий от backbone

Мне нужно понять, какой сигнал отлавливать.

Novator ★★★★★
() автор топика
Ответ на: комментарий от ananas

а что gstreamer или mplayer какой через GtkSocket

Я gstreamer и использую. Он выводит в GtkDrawingArea.
Про GtkSocket/GtkPlu g ничего не знал, но щас почитал.

Вопрос-то не в этом. Вопрос вот в чем. Мне нужно остановить поток. Причем мне нужно остановить поток (PipeLine.pause) в тот момент, когда:
а) юзер открыл сверху другое окно и перекрыл видео-область
б) юзер переключился на другую вкладку
в) юзер свернул приложение

Полагаю, что нужно ловить разные сигналы. Какие?

Novator ★★★★★
() автор топика
Ответ на: комментарий от geekless

Никак.

Так не бывает, ты прямо как не российский программист. Слова «никак» нет в лексиконе российского программиста. Есть «через пень-колоду, но можно палюбому» )

Novator ★★★★★
() автор топика
Ответ на: комментарий от Novator

«через пень-колоду, но можно палюбому»

Ок, ты сам попросил...

Берешь все toplevel окна, отображаешь их координаты на коорддинаты своего окна и проверяешь — остались не перекрытые сегменты или нет. Да, полностью вручную.

geekless ★★
()
Ответ на: комментарий от geekless

О, вот это интересно!
А как узнать, какие окна сверху над моим?
(Z-порядок как определяется в Gtk/Gdk?)

Novator ★★★★★
() автор топика
Ответ на: ХОРОШО!!! от Novator

как отловить потерю фокуса?

Скажи, это правда так трудно — открыть http://developer.gnome.org/gtk/2.24/GtkWidget.html , нажать ctrl+f и поискать focus?

Ответ: focus-out-event

А как узнать, какие окна сверху над моим? (Z-порядок как определяется в Gtk/Gdk?)

Дергай иксы напрямую.

geekless ★★
()
Ответ на: комментарий от geekless

Берешь все toplevel окна, отображаешь их координаты на коорддинаты своего окна и проверяешь — остались не перекрытые сегменты или нет. Да, полностью вручную.

это ты загнул. expose или configure и смотреть gdk_window_get_state()

ananas ★★★★★
()
Ответ на: комментарий от Novator

Я gstreamer и использую. Он выводит в GtkDrawingArea.
Про GtkSocket/GtkPlu g ничего не знал, но щас почитал.

тогда осталось почитать про GstXOverlay

ananas ★★★★★
()

А как это будет работать с композитингом? С ним же любое окно может быть видно в любой момент, независимо от стэкинг ордера.

Вообще иксы шлют expose, но они шлют его всему окну, пусть и с координатами области, где его видно. И с композитингом тут всё сложно.

x3al ★★★★★
()
Ответ на: комментарий от ananas

Эх, ребята-ребята, опять всё пришлось самому искать.

Отлавливаем перекрытие видео-области другим(и) окном/окнами:

      area.signal_connect('visibility_notify_event') do |widget, event_visibility|
        case event_visibility.state
          when Gdk::EventVisibility::UNOBSCURED, Gdk::EventVisibility::PARTIAL
            play_pipeline
          when Gdk::EventVisibility::FULLY_OBSCURED
            stop_pipeline
        end
      end

Отлавливаем сворачивание главного окна:

    window.signal_connect('window-state-event') do |widget, event_window_state|
      if (event_window_state.changed_mask == Gdk::EventWindowState::ICONIFIED) \
        and ((event_window_state.new_window_state & Gdk::EventWindowState::ICONIFIED)>0)
      then
        stop_pipeline
      end
    end

Отлавливаем переключение блокнота на другую вкладку:

    notebook.signal_connect('switch-page') do |widget, page, page_num|
      sw = $notebook.get_nth_page(page_num)
      treeview = sw.children[0]
      stop_pipeline if treeview.is_a? PandoraGUI::SubjTreeView
    end

Теперь по второму вопросу нужно мне объяснить:
Как в gstreamer работать с потоками? Как выделить обработку потока в отдельный цикл Gtk (не Gtk.mainloop)?

Novator ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.