Более опытные товарищи поправят, если такой способ существует на чистом gtk, я бы посоветовал копать в сторону clutter, может там что-нибудь такое можно.
>Более опытные товарищи поправят, если такой способ существует на чистом gtk, я бы посоветовал копать в сторону clutter, может там что-нибудь такое можно.
Клаттер двигает готовые окошки и их модифицирует. Это ВМ такой. Рисование все происходит в кайро.
Ошибся. Clutter — свободная графическая библиотека для создания аппаратно ускоренных пользовательских интерфейсов. Он использует OpenGL или OpenGL ES для рендеринга. Mutter тут ну вообще никаким боком.
Я, наверно, не совсем точно сформулировал вопрос. Расскажу подробно: у меня есть gtk-окно cо всякими виджетами и drawingarea, в которой я рисую openGL-ем. Так вот, в области этой самой drawingarea мне надо добавить еще несколько линий и окружностей, позиции и размер которых можно менять. Это я и хочу сделать с помощью Cairo
1. Ну ты сам про него начал.
2. Цитато - Mutter is the window manager for which GNOME Shell is a plugin in GNOME 3, replacing Metacity[1]. Mutter is the Short form of Metacity Clutter[2]. It uses a graphics library called Clutter. It also supports OpenGL by Clutter.
Я не претендую на абсолютную правду, но Клаттер вроде бы расчитан на работу с Actors и основной его функционал - вертеть, крутить и тп эти самые экторы. А рисовать эти ЭКторы предлагается с помощью кайро. И они очень похожи на ГТК шные виджеты.
Я и сам такое делал, но поверх openGL'я рисовать при помощи cairo не советую, если у вас графика «тяжелая», лучше использовать «рисовалку» gtk, которая, хоть и deprecated, зато позволяет использовать маску XOR, благодаря чему подложку не надо перерисовывать.
>Клаттер не ВМ, я и спросил, мб с Mutter перепутал, единственный ВМ с похожим названием.
Я имел ввиду что клаттер «двигает» акторы. ВМ надо было взять в ковычечки.
Что касается аппаратно ускоренной библиотеки создания пользовательских интерфейсов, то это таки правда:) Вопрос что библиотека делает для создания этих интерфейсов, а для чего используются другие библиотеки.
Собственно, фиг с ним, более интересным для меня было то, что клаттер использует гобжекты.
Куда только не засовывал рисование этих линий...) Упростил свой код: рисую прямоугольник в openGL, прямоугольник в Cairo и линию в GDK. Если можно, посмотрите, пожалуйста, в чем проблема..
А в чем проблема-то? Вообще не рисует, или не рисует только что-то определенное? Функция on_drawingarea1_realize, я так понимаю, сигнал realize обрабатывает? Может, стоит этот сигнал «выбросить», а ее поставить на обработку сигнала configure?
Мерцает он у вас потому, что вы зачем-то обрабатываете сигнал idle. Уберите его, перерисовывать картинку надо только когда вам ее действительно надо перерисовывать, а не 100500 раз в секунду.
Скорость отрисовки и так маленькая по сравнению с необходимой. Пробовал рисовать эти линии в OpenGL, но я не очищаю цветовой буфер, чтобы сохранить на экране уже нарисованные объекты. Поэтому при поворотах и движении этих линий, за ними остаются ненужные следы - на месте предыдущего положения..
пробовал включать буфер аккумулятора, чтобы иметь возможность очищать цветовой буфер, но так все ужасно тормозит из-за большого количества рисуемых объектов
Мне тут недавно подсказали вместо списков VBO использовать, скорость сильно возросла: картинка из ~18млн треугольников вращается вполне сносно, без тормозов.
Встроенная видеокарта Intel gma x4500. VBO вроде бы поддерживается, но нет своей памяти - берет ее из оперативки... Особого прироста производительности не заметил.
Есть идея перенести рисование в OpenGl непосредственно в главное окно(если такое возможно???), а в drawingarea рисовать эти самые линии заливая всю незарисованную область прозрачным фоном. Как Вы думаете, поможет?
The program 'simple' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadMatch (invalid parameter attributes)'.
(Details: serial 1748 error_code 8 request_code 155 minor_code 11)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
Посмотрите здесь (файлы opengl.c и tracking.c), может поможет..
Есть идея перенести рисование в OpenGl непосредственно в главное окно(если такое возможно???), а в drawingarea рисовать эти самые линии заливая всю незарисованную область прозрачным фоном.
Не получится. Либо рисуете openGL'ем в отдельном glut'овом окне, либо - при помощи gtgglext'а в drawingarea.