Можно как-то выяснить, заслонило ли мое окно полностью какое-то чужое? Самое лучшее, чтобы это был сигнал, но хот бы функцию найти тоже пойдет. Из разделов про GtkWidget и GtkWindow как будто все перепробовал.
Пока решил дело через сигнал «focus-out-event», но это не совсем то, к тому же если у чужого окна стоит режим «поверх всех» прием с «focus-out-event» только раз срабатывает.
В гтк-проекте, работающем под виндами сделан глобальный доступ к событиям мышки(клики) методом из директ икс - DirectInput: нужно было ловить евенты даже вне основного окна программы. Спасибо людям из форума за подсказки. Только силами гтк я это решить не сумел.
Метод DirectInput работает так: когда с мышкой что-то происходит, движение или клики, то DirectInput меняет содержимое одной несложной структуры и все. Т.е. для получения данных о событиях нужно лишь периодически опрашивать эту структуру. Мне в нужны точные измерения, поэтому иногда опрос стоит 100 раз в секунду. А лучше бы и чаще но возникают тормоза. Опрос пока что сделал через таймер g_timeout_add_full. До использования DirectInput контроль над мышкой был только над рабочим окном проги, сигналы ловил элементарно через g_signal_connect ...
Поэтому вопрос, а можно как-то сделать, чтобы гтк сама следила за изменением некой структуры и подавала сигнал, когда там что-то меняется? А то мне кажется, что через таймер как-то неэффективно.
P.S. про g_signal_new читал но не понял с какого боку его туда прикрутить и вообще то ли это...
Написан эмулятор велокомпьютера, на С +GTK, но оказалось, что надо чтобы работало и под виндами, для этого использовалась оболочка Code Blocks.
Программа должна часто получать нажатия любой кнопки мышки, но когда она не в фокусе (хоть и на первом плане всегда) клики уже не ловит. В общем, нужно перехватывать клики даже вне рабочего окна GTK, т.е. глобально. Даже, может подошло бы перехватить не клик, а хоткей клавиатуры, хотя это хуже.
В самом GTK ничего для этого не нашел, пока вижу вариант через использование RegisterHotKey, но как нормально принять
сигнал от нажатого хоткея? Если использую пример из мсдн
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx
вот этот кусок вызывает вечный цикл с 99% загрузкой цпу, но хоткей, правда перехватывается. Очень плохо знаком с winAPI, как там это работает непонятно, у них это не создает цикла, очевидно. Даже не знаю куда рыть, может с этим RegisterHotKey вообще тупиковое направление?
Ситуация такая: пишу на обычном С + gtk любительское приложение для электронной книги с экраном e-ink. На самой книге стоит Linux-2.6.24, также есть GTK+. Компиляция делается через Cross-tools Arm компилятор.
Одно из «родных» для книжки окошек никакими силами не удается перекрыть моему приложению. Это маленькая панелкька, отображающая время и заряд батареи. Оно реально мешается, закрывает часть и так небольшой площади экрана.
Как-то можно его подавить\отключить? Опционально, в настройках книги конечно же отключения нет, но вообще эта панелько пропадает когда запускаются некоторые родные программы книги. Я предполагаю, что эта панелька является GtkWindow с включенной gtk_window_set_keep_above() т.е. поверх всех окон. А может и нет. Делал для своего окна так же плюс постоянный gtk_window_present() для клавиатурного фокуса - но не помогает, все равно выползает. Нас сам процесс может как-то повлиять?
Одна из частей моей программы представляет собой небольшой файловый броузер, в общем это просто небольшое окно со списком файлов\каталогов. Можно выделенной строкой «двигаться» по списку, входить в другие папки. Если список не помещается в окно, появляется вертикальная прокрутка, размер окна не меняется. Программа запоминает последний выделенный файл и при запуске ставит выделение сразу на него. Это все работает.
Проблема вот в чем:
Если выделенная строка была внизу достаточно длинного списка и произошел выход из программы, то при следующем запуске видно только начало списка, а область с выделением не видно, т.к. она где-то внизу, хоть и в фокусе. Чтобы она появилась, достаточно хоть раз нажать стрелку «вверх» или «вниз».
Как сдвинуть область с выделением в окно сразу(программно)?
Я в курсе, как прокручивать регуляторы с помощью GtkAdjustment, но это слишком уж мудрено; - список переменной длины и позиция выделенной строки тоже произвольная. Пытался иммитировать всякие сигналы, перебрал, пожалуй все для использованных в окне виджетов... не помогло. Как симмитировать нажатия «вверх» или «вниз» не нашел, но это уже и так костыли.
Может есть какая-то функция в GTK ? Просматривал разделы:
GtkScrolledWindow
GtkTreeView
GtkWindow
GtkTreeModel
GtkTreeSelection
GtkTreeViewColumn
но не смог подобрать что-то.
Пишу небольшой специфичный просмотрщик картинок на GTK, и в какой-то момент там нужно удалять белые поля(типа бордюра) по периметру. В общем, белый прямоугольник, на нем рисунок в произвольном месте произвольного размера, картинки есессно в разных форматах, jpg png, итд... Бордюр бывает разный... Проблема только одна - как определить координаты прямоугольника с рисунком? Сама обрезка делается легко через
gdk_pixbuf_new_subpixbuf()
надо только знать координаты зоны.
Может есть какой-то обходной путь? Например, отрезать сверху небольшой прямоугольник, проверить, есть ли в нем что-то кроме белого цвета, вроде того.
Вот это
http://developer.gnome.org/gdk-pixbuf/2.23/ и
http://developer.gnome.org/gtk3/3.0/
мусолил-мусолил, не нашел или не смог понять.
Упрощаю задачу: как узнать, что прямоугольник в pixbuf содержит только один цвет?