LINUX.ORG.RU

Сообщения mm35

 

[GTK] Видимое окно или нет?

Можно как-то выяснить, заслонило ли мое окно полностью какое-то чужое? Самое лучшее, чтобы это был сигнал, но хот бы функцию найти тоже пойдет. Из разделов про GtkWidget и GtkWindow как будто все перепробовал.

Пока решил дело через сигнал «focus-out-event», но это не совсем то, к тому же если у чужого окна стоит режим «поверх всех» прием с «focus-out-event» только раз срабатывает.

 

mm35
()

(GTK) Сигнал вместо таймера

В гтк-проекте, работающем под виндами сделан глобальный доступ к событиям мышки(клики) методом из директ икс - DirectInput: нужно было ловить евенты даже вне основного окна программы. Спасибо людям из форума за подсказки. Только силами гтк я это решить не сумел. Метод DirectInput работает так: когда с мышкой что-то происходит, движение или клики, то DirectInput меняет содержимое одной несложной структуры и все. Т.е. для получения данных о событиях нужно лишь периодически опрашивать эту структуру. Мне в нужны точные измерения, поэтому иногда опрос стоит 100 раз в секунду. А лучше бы и чаще но возникают тормоза. Опрос пока что сделал через таймер g_timeout_add_full. До использования DirectInput контроль над мышкой был только над рабочим окном проги, сигналы ловил элементарно через g_signal_connect ...

Поэтому вопрос, а можно как-то сделать, чтобы гтк сама следила за изменением некой структуры и подавала сигнал, когда там что-то меняется? А то мне кажется, что через таймер как-то неэффективно.

P.S. про g_signal_new читал но не понял с какого боку его туда прикрутить и вообще то ли это...

mm35
()

Хоткеи в Win для GTK приложения

Написан эмулятор велокомпьютера, на С +GTK, но оказалось, что надо чтобы работало и под виндами, для этого использовалась оболочка Code Blocks. Программа должна часто получать нажатия любой кнопки мышки, но когда она не в фокусе (хоть и на первом плане всегда) клики уже не ловит. В общем, нужно перехватывать клики даже вне рабочего окна GTK, т.е. глобально. Даже, может подошло бы перехватить не клик, а хоткей клавиатуры, хотя это хуже. В самом GTK ничего для этого не нашел, пока вижу вариант через использование RegisterHotKey, но как нормально принять сигнал от нажатого хоткея? Если использую пример из мсдн http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx

    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
            printf("WM_HOTKEY received\n");
        }
    }
вот этот кусок вызывает вечный цикл с 99% загрузкой цпу, но хоткей, правда перехватывается. Очень плохо знаком с winAPI, как там это работает непонятно, у них это не создает цикла, очевидно. Даже не знаю куда рыть, может с этим RegisterHotKey вообще тупиковое направление?

mm35
()

[GTK] подавление всплывающего окна

Ситуация такая: пишу на обычном С + gtk любительское приложение для электронной книги с экраном e-ink. На самой книге стоит Linux-2.6.24, также есть GTK+. Компиляция делается через Cross-tools Arm компилятор. Одно из «родных» для книжки окошек никакими силами не удается перекрыть моему приложению. Это маленькая панелкька, отображающая время и заряд батареи. Оно реально мешается, закрывает часть и так небольшой площади экрана. Как-то можно его подавить\отключить? Опционально, в настройках книги конечно же отключения нет, но вообще эта панелько пропадает когда запускаются некоторые родные программы книги. Я предполагаю, что эта панелька является GtkWindow с включенной gtk_window_set_keep_above() т.е. поверх всех окон. А может и нет. Делал для своего окна так же плюс постоянный gtk_window_present() для клавиатурного фокуса - но не помогает, все равно выползает. Нас сам процесс может как-то повлиять?

 

mm35
()

прыжок к выделенной строчке в списке (GTK)

Одна из частей моей программы представляет собой небольшой файловый броузер, в общем это просто небольшое окно со списком файлов\каталогов. Можно выделенной строкой «двигаться» по списку, входить в другие папки. Если список не помещается в окно, появляется вертикальная прокрутка, размер окна не меняется. Программа запоминает последний выделенный файл и при запуске ставит выделение сразу на него. Это все работает. Проблема вот в чем: Если выделенная строка была внизу достаточно длинного списка и произошел выход из программы, то при следующем запуске видно только начало списка, а область с выделением не видно, т.к. она где-то внизу, хоть и в фокусе. Чтобы она появилась, достаточно хоть раз нажать стрелку «вверх» или «вниз». Как сдвинуть область с выделением в окно сразу(программно)?

Я в курсе, как прокручивать регуляторы с помощью GtkAdjustment, но это слишком уж мудрено; - список переменной длины и позиция выделенной строки тоже произвольная. Пытался иммитировать всякие сигналы, перебрал, пожалуй все для использованных в окне виджетов... не помогло. Как симмитировать нажатия «вверх» или «вниз» не нашел, но это уже и так костыли. Может есть какая-то функция в GTK ? Просматривал разделы: GtkScrolledWindow GtkTreeView GtkWindow GtkTreeModel GtkTreeSelection GtkTreeViewColumn но не смог подобрать что-то.

mm35
()

Обрезка (crop) изображения в GTK.

Пишу небольшой специфичный просмотрщик картинок на GTK, и в какой-то момент там нужно удалять белые поля(типа бордюра) по периметру. В общем, белый прямоугольник, на нем рисунок в произвольном месте произвольного размера, картинки есессно в разных форматах, jpg png, итд... Бордюр бывает разный... Проблема только одна - как определить координаты прямоугольника с рисунком? Сама обрезка делается легко через

gdk_pixbuf_new_subpixbuf() 
надо только знать координаты зоны. Может есть какой-то обходной путь? Например, отрезать сверху небольшой прямоугольник, проверить, есть ли в нем что-то кроме белого цвета, вроде того. Вот это http://developer.gnome.org/gdk-pixbuf/2.23/ и http://developer.gnome.org/gtk3/3.0/ мусолил-мусолил, не нашел или не смог понять. Упрощаю задачу: как узнать, что прямоугольник в pixbuf содержит только один цвет?

mm35
()

как вывести картинку в GTK повторно?

Можно ли как-то сменить картинку на виджете не разрушая его, допустим, чтобы по кнопке «Up» чтобы грузился «2.png» ?

#include <gtk/gtk.h> #include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk/gdkkeysyms.h>

static GdkPixbuf *image; static GtkWidget *win;

//реакция на кнопки static void which_key_press (GtkWidget *widget, GdkEventKey *event, gpointer data) { switch (event->keyval){    case GDK_Up: //?????             break;    case GDK_Down: //?????          break;       default:       break; } }

int main (int argc, char **argv) {    gtk_init (&argc, &argv);

   image=gdk_pixbuf_new_from_file («1.png», NULL);           win = gtk_window_new(GTK_WINDOW_TOPLEVEL);    gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER_ALWAYS);    gtk_container_add (GTK_CONTAINER (win), gtk_image_new_from_pixbuf (image));        g_signal_connect (GTK_OBJECT(win), «destroy», gtk_main_quit, NULL);    g_signal_connect (G_OBJECT (win), «key_press_event»,          G_CALLBACK (which_key_press), NULL);

   gtk_widget_show_all(win);    gtk_main();    return 0; }

mm35
()

RSS подписка на новые темы