LINUX.ORG.RU

Сообщения Vitaly1988

 

gtk_cell_renderer_activate

Форум — Development

Здравствуйте! Необходимо, чтобы в dconf-editor-e значения ключей можно было отредактировать не только кликом по строке в области столбца «Значение», но и без использования мыши. Для этого к GtkTreeView я подключил обработчик сигнала «row-activated», который срабатывает при нажатии, например, кнопки Enter. Вопрос: как вызвать из этого обработчика то событие, которое возникает при клике мышью? Код, приведенный ниже, работает на чекбаттонах и не работает на комбобоксах и спинбаттонах. Спасибо.

static void on_key_tree_view_row_activated(GtkTreeView       *tree_view,
                                           GtkTreePath       *path,
                                           GtkTreeViewColumn *column,
                                           gpointer           user_data)
{
 printf("key row-activated\n");	
 GdkRectangle rect;
 gtk_tree_view_get_cell_area (tree_view, path, column, &rect);
 gchar *path_string = gtk_tree_path_to_string (path);
 
 
 
 GtkCellRenderer *cell = NULL;
 GdkEvent *event = gdk_event_new(GDK_BUTTON_PRESS);
 /* Get the second column */
 GtkTreeViewColumn *key_column = gtk_tree_view_get_column( GTK_TREE_VIEW( tree_view ), 1 );

 /* Get renderers in that column */
 GList *list = gtk_cell_layout_get_cells( GTK_CELL_LAYOUT( key_column ) );
 g_assert (g_list_length (list) == 1);

 cell = g_list_nth_data (list, 0);
 g_assert (cell);

 gboolean event_was_handled = 
 gtk_cell_renderer_activate 
   //gtk_cell_renderer_start_editing
                           (cell,
                            event,
                            GTK_WIDGET(tree_view),
                            path_string,
                            &rect,
                            &rect,
                            GTK_CELL_RENDERER_SELECTED);
 g_list_free( list );
 g_free(path_string);                           
 printf("event was %s handled\n", event_was_handled ? "":"not");

}

 

Vitaly1988
()

выбрать ноутбук

Форум — Linux-hardware

Здравствуйте! Помогите с выбором ноутбука из этих двух Fujitsu LIFEBOOK AH544/G32 vs Lenovo THINKPAD Edge E540. Или посоветуйте что-нибудь получше за ту же цену(~25тыс руб). Основные параметры: core i5, матовый экран(14-15,6 дюймов), максимальный объем оперативной памяти 16ГБ. Fujitsu вроде как предпочтительнее из-за дискретной видеокарты, но не будет ли у него проблем с ubuntu? Спасибо.

Vitaly1988
()

gtk_main()

Форум — Development

Зравствуйте! Вот работающая программка на основе GTK3 и EGL:

#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>

#include <GLES2/gl2.h>
#define GL_GLEXT_PROTOTYPES
#include <GLES2/gl2ext.h>
#include <EGL/egl.h>
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>

#include <cairo.h>

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

static void
die (const char *msg)
{
  fprintf (stderr, "%s\n", msg);
  exit (1);
}

static GLuint
compile_shader (GLenum type, const GLchar* source)
{
  GLuint shader;
  GLint compiled;

  if (!(shader = glCreateShader(type)))
    return shader;

  glShaderSource (shader, 1, &source, 0);
  glCompileShader (shader);

  glGetShaderiv (shader, GL_COMPILE_STATUS, &compiled);
  if (!compiled) {
    GLint info_len = 0;
    fprintf (stderr, "Shader failed to compile\n");
    glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &info_len);

    if (info_len > 0) {
      char *info_log = (char*) malloc (info_len);
      glGetShaderInfoLog (shader, info_len, NULL, info_log);

      fprintf (stderr, "%s\n", info_log);
      free (info_log);
    }
  }

  return shader;
}
#define COMPILE_SHADER(Type,Src) compile_shader (Type, #Src)

static GLuint
create_program (GLuint vshader, GLuint fshader)
{
  GLuint program;
  GLint linked;

  program = glCreateProgram();
  glAttachShader(program, vshader);
  glAttachShader(program, fshader);
  glLinkProgram(program);

  glGetProgramiv (program, GL_LINK_STATUS, &linked);
  if (!linked) {
    GLint info_len = 0;
    fprintf (stderr, "Program failed to link\n");
    glGetProgramiv (program, GL_INFO_LOG_LENGTH, &info_len);

    if (info_len > 0) {
      char *info_log = (char*) malloc (info_len);
      glGetProgramInfoLog (program, info_len, NULL, info_log);

      fprintf (stderr, "%s\n", info_log);
      free (info_log);
    }
  }

  return program;
}


static void
create_egl_for_drawable (EGLDisplay edpy, GdkWindow *drawable, EGLSurface *surface, EGLContext *context)
{
  EGLConfig econfig;
  EGLint num_configs;
  const EGLint attribs[] = {
    EGL_BUFFER_SIZE, 32,
    EGL_RED_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_BLUE_SIZE, 8,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_SURFACE_TYPE, GDK_IS_WINDOW (drawable) ? EGL_WINDOW_BIT : EGL_PIXMAP_BIT,
    EGL_NONE
  };
  const EGLint ctx_attribs[] = {
    EGL_CONTEXT_CLIENT_VERSION, 2,
    EGL_NONE
  };

  if (!eglChooseConfig(edpy, attribs, &econfig, 1, &num_configs) || !num_configs)
    die ("Could not find EGL config");

  if (!(*surface = eglCreateWindowSurface (edpy, econfig, GDK_WINDOW_XID (drawable), NULL)))
    die ("Could not create EGL surface");

  if (!(*context = eglCreateContext (edpy, econfig, EGL_NO_CONTEXT, ctx_attribs)))
    die ("Could not create EGL context");
}

static GQuark
drawable_egl_quark (void)
{
  static GQuark quark = 0;
  if (G_UNLIKELY (!quark))
    quark = g_quark_from_string ("egl_drawable");
  return quark;
}

typedef struct {
  EGLDisplay display;
  EGLSurface surface;
  EGLContext context;
} drawable_egl_t;

static void
drawable_egl_destroy (drawable_egl_t *e)
{
  eglDestroyContext (e->display, e->context);
  eglDestroySurface (e->display, e->surface);
  g_slice_free (drawable_egl_t, e);
}

static drawable_egl_t *
drawable_get_egl (GdkWindow *drawable)
{
  drawable_egl_t *e;

  if (G_UNLIKELY (!(e = (drawable_egl_t *) g_object_get_qdata ((GObject *) drawable, drawable_egl_quark ())))) {
    e = g_slice_new (drawable_egl_t);
    e->display = eglGetDisplay (GDK_WINDOW_XDISPLAY (drawable));
    create_egl_for_drawable (e->display, drawable, &e->surface, &e->context);
    g_object_set_qdata_full (G_OBJECT (drawable), drawable_egl_quark (), e, (GDestroyNotify) drawable_egl_destroy);
  }

  return e;
}

static void
drawable_make_current (GdkWindow *drawable)
{
  drawable_egl_t *e = drawable_get_egl (drawable);
  eglMakeCurrent(e->display, e->surface, e->surface, e->context);
}

static void
drawable_swap_buffers (GdkWindow *drawable)
{
  drawable_egl_t *e = drawable_get_egl (drawable);
  eglSwapBuffers (e->display, e->surface);
}

static void
setup_texture (void)
{
#define FONTSIZE 256
#define FONTFAMILY "serif"
#define TEXT "ab"
  int width = 0, height = 0;
  cairo_surface_t *image = NULL;
  cairo_t *cr;
  int i;

  for (i = 0; i < 2; i++) {
    cairo_text_extents_t extents;

    if (image)
      cairo_surface_destroy (image);

    image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
    cr = cairo_create (image);
    cairo_set_source_rgb (cr, 1., 1., 1.);
    cairo_paint (cr);
    cairo_set_source_rgb (cr, 0., 0., 0.);

    cairo_select_font_face (cr, FONTFAMILY, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
    cairo_set_font_size (cr, FONTSIZE);
    cairo_text_extents (cr, TEXT, &extents);
    width = ceil (extents.x_bearing + extents.width) - floor (extents.x_bearing);
    height = ceil (extents.y_bearing + extents.height) - floor (extents.y_bearing);
    cairo_move_to (cr, -floor (extents.x_bearing), -floor (extents.y_bearing));
    cairo_show_text (cr, TEXT);
    cairo_destroy (cr);
  }


  glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, cairo_image_surface_get_data (image));
  cairo_surface_write_to_png (image, "glyph.png");

  cairo_surface_destroy (image);
}


GLuint texture;
static
gboolean expose_cb (GtkWidget *widget,
		    GdkEventExpose *event,
		    gpointer user_data)
{
  GtkAllocation allocation;
  static int i = 0;
  double theta = M_PI / 360.0 * i;
  GLfloat mat[] = { +cos(theta), +sin(theta), 0., 0.,
		    -sin(theta), +cos(theta), 0., 0.,
			     0.,          0., 1., 0.,
			     0.,          0., 0., 1., };

  drawable_make_current (gtk_widget_get_window(widget));

  glBindTexture (GL_TEXTURE_2D, texture);
  gtk_widget_get_allocation (widget, &allocation);
  glViewport(0, 0, allocation.width, allocation.height);
  glClearColor(0., 1., 0., 0.);
  glClear(GL_COLOR_BUFFER_BIT);

  glUniformMatrix4fv (GPOINTER_TO_INT (user_data), 1, GL_FALSE, mat);

  glDrawArrays (GL_TRIANGLE_FAN, 0, 4);

  drawable_swap_buffers (gtk_widget_get_window(widget));

  i++;

  return TRUE;
}

static gboolean
step (gpointer data)
{
  gdk_window_invalidate_rect (GDK_WINDOW (data), NULL, TRUE);
  return TRUE;
}

static void
egl_init (GtkWidget* widget)
{
  GLuint vshader, fshader, program, a_pos_loc, a_tex_loc;
  const GLfloat w_vertices[] = { -0.50, -0.50, +0.00,
				 +1.00, +0.00,
				 +0.50, -0.50, +0.00,
				 +0.00, +0.00,
				 +0.50, +0.50, +0.00,
				 +0.00, +1.00,
				 -0.50, +0.50, +0.00,
				 +1.00, +1.00 };
  
  eglInitialize (eglGetDisplay (gdk_x11_display_get_xdisplay (gtk_widget_get_display (widget))), NULL, NULL);
  if (!eglBindAPI (EGL_OPENGL_ES_API))
    die ("Failed to bind OpenGL ES API");

  drawable_make_current (gtk_widget_get_window(widget));

  vshader = COMPILE_SHADER (GL_VERTEX_SHADER,
      attribute vec4 a_position;
      attribute vec2 a_texCoord;
      uniform mat4 u_matViewProjection;
      varying vec2 v_texCoord;
      void main()
      {
	gl_Position = u_matViewProjection * a_position;
	v_texCoord = a_texCoord;
      }
  );
  fshader = COMPILE_SHADER (GL_FRAGMENT_SHADER,
      uniform sampler2D tex;
      varying vec2 v_texCoord;
      void main()
      {
	gl_FragColor = texture2D(tex, v_texCoord);
	gl_FragColor.a = .5;
      }
  );
  program = create_program (vshader, fshader);

  glUseProgram(program);
  glUniform1i(glGetUniformLocation(program, "tex"), 0);
  glActiveTexture (GL_TEXTURE0);

  glGenTextures (1, &texture);
  glBindTexture (GL_TEXTURE_2D, texture);
  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

  setup_texture ();

  a_pos_loc = glGetAttribLocation(program, "a_position");
  a_tex_loc = glGetAttribLocation(program, "a_texCoord");

  glVertexAttribPointer(a_pos_loc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), w_vertices);
  glVertexAttribPointer(a_tex_loc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), &w_vertices[3]);

  glEnableVertexAttribArray(a_pos_loc);
  glEnableVertexAttribArray(a_tex_loc);

  gtk_widget_set_app_paintable (widget, TRUE);
  gtk_widget_set_double_buffered (widget, FALSE);
  gtk_widget_set_redraw_on_allocate (widget, TRUE);
  g_signal_connect (G_OBJECT (widget), "draw", G_CALLBACK (expose_cb), GINT_TO_POINTER (glGetUniformLocation (program, "u_matViewProjection")));

  g_timeout_add (10, step, gtk_widget_get_window(widget));
  gtk_main ();

}

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

  GtkWidget *window = GTK_WIDGET (gtk_window_new (GTK_WINDOW_TOPLEVEL));
  g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
  gtk_widget_show_all (window);
  egl_init(window);
  return 0;
}

Вот как компилировать:

gcc gltext3.c -o text -lX11 -lEGL -lGLESv2 -lm `pkg-config --cflags --libs gtk+-3.0 egl`

Все работает, в окошке видна вращающаяся текстура на зеленом фоне. Но если перенести вызов gtk_main() из функции egl_init() в функцию main() сразу после вызова egl_init(). То вращающаяся текстура исчезает. Почему так?

 ,

Vitaly1988
()

Отслеживание перемещений мыши и блокировка курсора?

Форум — Development

Здравствуйте! У меня Gtk-приложение. Хочу, чтобы при клике по GtkEntry, дальнейшие перемещения курсора блокировались до повторного щелчка мышью. А во время блокировки считывать перемещения мыши, менять значение и устанавливать его в GtkEntry. Пробовал отслеживать перемещения в пределах GtkEntry и возвращать курсор в исходное положение средствами gtk, но иногда курсор вырывается за пределы GtkEntry. Наверно, есть более низкоуровневые способы. Подскажите, пожалуйста.

Vitaly1988
()

Как изменить тип GTK_WINDOW_TOPLEVEL на GTK_WINDOW_POPUP?

Форум — Development

Здравствуйте! Как в GTK изменить тип уже отображенного окна с GTK_WINDOW_TOPLEVEL на GTK_WINDOW_POPUP?

 

Vitaly1988
()

Трансляция сообщений из udp порта в виртуальный com-порт

Форум — Development

Пожалуйста, подскажите, как использовать socat или может netcat или что-то еще для передачи поступающей по udp информации в виртуальный последовательный порт(например, /tmp/gps).

Vitaly1988
()

Полноэкранный режим не работает без эффектов Compiz

Форум — Development

Здравствуйте! Разрабатываю полноэкранное приложение. Использую gtk_window_fullscreen. При включении режима «Без эффектов» в Compiz приложение запускается с небольшим смещением главного окна вправо и вниз. Слева и сверху виден рабочий стол. Что делать?

Vitaly1988
()

Горизонтальный GtkTreeView?

Форум — Development

Как поменять ориентацию GtkTreeView, чтобы столбцы располагались по строкам?

Vitaly1988
()

Чтение многомерного массива из отраженого файла

Форум — Development

Здравствуйте. Ниже приведены программы записи и чтения одномерного массива из mmap файла. Как мне прочитать многомерный(трехмерный, например) массив данных из файла? Заранее спасибо.

WRITE

#define width 20
#define FILEPATH "/tmp/data.txt"
int main(int argc, char *argv[])
{
unsigned char Dekart[width];
int i;
for (i=0;i<width; i++)	Dekart[i] =(unsigned char)rand()%255;
int fd = open(FILEPATH, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); // дескриптор файла
int file_size = sizeof(Dekart);
lseek(fd, file_size+1, SEEK_SET); // перемещаемся в конец
write(fd, "\0", 1); // делаем запись
void* file_memory = mmap(NULL, file_size, PROT_WRITE, MAP_SHARED, fd, 0);// указатель на отображенный в памяти файл
close(fd);
memcpy(file_memory, Dekart, file_size); //копируем из Dekart в file_memory
munmap(file_memory, file_size);
}

READ

#define width 20
#define FILEPATH "/tmp/data.txt"

int main(int argc, char *argv[])
{
int i;
unsigned char *Dekart;
int fd = open(FILEPATH, O_RDWR, S_IRUSR|S_IWUSR);// открываем файл для чтения
if (fd<0)  printf ("%s\n", "У нас проблемы");
else
{
Dekart = mmap(0, sizeof(Dekart), PROT_READ, MAP_SHARED, fd, 0);// отображаем его содержимое в память и получаем указатель на него
close(fd);// освобождаем дескриптор
for (i=0;i<width; i++)	printf("%d\n", Dekart[i]);
}
}

Vitaly1988
()

Экранная лупа в Ubuntu

Форум — Development

Если зажать клавишу Win и покрутить колесо мыши, то получается эффект экранной лупы. Хочу воспроизвести этот эффект в программе, но с переназначенными клавишами. Например, при зажатии клавиши A и перемещении курсора вверх-вниз. ?

Vitaly1988
()

Графика на встроенной видеокарте

Форум — Development

Добрый день! Пишу gtk-шное приложение под Ubuntu 10.10, в котором необходима визуализация данных. Процессор - Intel Core(TM)2 Duo L9400 1,86 GHz Видеокарта - Intel® GMA X4500 integrated in Intel® GS45 ОЗУ - 1.85 ГБ Размеры области вывода 1024x1024 пикселей. Использую OpenGL. Пробовал разные способы отрисовки (треугольники, точки, массивы точек, VBO, текстуры) и остановился на glDrawPixel(). Приемлемая скорость отрисовки... Но хотелось бы лучше) Подскажите, есть ли какие-либо другие, более быстрые методы? Может быть и не OpenGL-ые... Заранее спасибо!

Vitaly1988
()

Задержка в gstreamer по rtsp

Форум — Development

Здравствуйте! Пишу программу на gtk, в которой в drawing_area необходимо выводить изображение с видеосервера по rtsp. Использую библиотеку gstreamer. Но видео воспроизводится с задержкой примерно в 3 секунды. Хотя, например, в VLC проигрывателе в настройках есть такая опция rtsp-cashing, изменяя числовой параметр которой можно регулировать эту самую задержку. Вопрос: есть ли что-то подобное в gstreamer? И если нет, то посоветуйте плееры с такой функцией, код которых можно без особых проблем впихнуть в свое gtk-приложение. Спасибо.

Vitaly1988
()

Ошибка при многократном открытии файлов

Форум — Development

Есть около миллиона файлов на жестком диске, рассортированных по папкам. Каждый файл объемом по 4кБ. В своей программе осуществляю последовательное открытие файлов(fopen(«/mnt/papki»,«r»)), чтение оттуда(fgets()) и закрытие(fclose()). После прочтения из последнего(миллионного) файла, считывание начинается сначала. И так программа нормально работает в течение 3,5-4 часов, проходя один цикл примерно за 10 минут. Потом fopen возвращает NULL при открытии некоторых файлов( хотя в предыдущих циклах успешно их открывала...) Почему?

Vitaly1988
()

OpenGL + Ubuntu 10.10 + ?GPU?

Форум — Linux-hardware

Здравствуйте! Написал программу, используя библиотеку gtkglext. На встроенной видеокарте Intel G33 работает корректно, но хотелось бы побыстрее... Попробовал поставить ATI Radeon X300. На открытом драйвере есть косяки: например, команда рисования линии пунктирами glLineStipple не воспринимается. Скачал пропиетарный драйвер, но, как оказалось, он подходит только для старых версий Ubuntu (8.*). Подскажите пожалуйста недорогую видекарту, чтобы не было проблем с драйверами под Ubuntu 10.10 и был заметен прирост производительности.

Vitaly1988
()

Растровое изображение по полярным координатам точек в OpenGL

Форум — Development

Привет всем! Мне необходимо вывести постоянно обновляющееся растровое изображение круга, заданное полярными координатами. Моя программа:

#include <glade/glade.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gtk/gtk.h>
#include <gtk/gtkgl.h>
#include <GL/gl.h>

#define PI          (3.14159265358979323846)
#define DEGRA       (0.01745329251994329547)

#define r_screen  380 	// радиус круга на экране
#define r0	 1024	//количество точек в радиусе
#define fi0	 4096 	//количество углов

int i,r,fi;	// счетчики

GLfloat Polar[fi0][r0];			// матрица с полярными координатами точек
GLfloat Dekart[r_screen*2][r_screen*2]; // матрица с декартовыми координатами точек

int x_coords[fi0][r0];
int y_coords[fi0][r0];

GLint vertices[r_screen*r_screen*4*3]; //вершинный массив
GLfloat colors[r_screen*r_screen*4*4]; //цветовой массив

  GdkGLConfig *glconfig;
  GladeXML *xml;
  GtkWidget *window1;
  GtkWidget *drawingarea1;



//---------------Запонение массивов с координатами------------------//
void coordinates()
{
  for (fi = fi0; fi < fi0; fi++) //вычисляем значения cos и sin для всех углов fi
  {
    double cosinus=cos(2*PI*fi/fi0); 
    double   sinus=sin(2*PI*fi/fi0);
    
    for (r = 0; r < r0; r++)//вычисляем декартовы координаты всех точек на углу fi
    {
     x_coords[fi][r]=(int)round((r*cosinus*r_screen/r0)+r_screen); 
     y_coords[fi][r]=(int)round((r*sinus*r_screen/r0)+r_screen);
    }
  }
}


//-------------------Заполнение массивов для OpenGL-------------------//
void checkImage()
{
if (fi==0) { fi=fi0;}
else {fi--;}
   
    for (r = 0; r < r0; r++)
    {
     Polar[fi][r]=rand()%255;
	int x=x_coords[fi][r];
	int y=y_coords[fi][r];
	Dekart[x][y]=Polar[fi][r];// присвоение элементу массива Dekart[x][y]
							// значения соответствующего элемента массива Polar[fi][r]
	int n=x+y*r_screen*2; //номер точки в массивах для OpenGL
	vertices[n*3]  =x-r_screen;	//x
	vertices[n*3+1]=y-r_screen;	//y
	vertices[n*3+2]=0;		//z

 	colors[n*4] = Dekart[x][y]/255;		//R
	colors[n*4+1]=0;			//G
	colors[n*4+2]=0;			//B
	colors[n*4+3]=1;			//A  
    }

}
//-----------------------Обновление--------------------------------//
static gboolean idle (GtkWidget *widget)
{
  gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
  gdk_window_process_updates (widget->window, FALSE);
  return TRUE;
}


//-----------------------REALISE-------------------------------------//
void on_drawingarea1_realize (GtkWidget *widget, gpointer   user_data)
{ 
coordinates();

  GdkGLContext  *glcontext  = gtk_widget_get_gl_context  (widget);
  GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);

  if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
    return;

	  glViewport (0, 0, 800, 800);
	  glMatrixMode (GL_PROJECTION);
	  glLoadIdentity (); 
	  glOrtho (-800/2, 800/2, -800/2, 800/2, -50, 50);
	  glMatrixMode (GL_MODELVIEW);
	  glLoadIdentity(); 
	  glTranslatef(-10,0,0);
 	  g_timeout_add_full (GDK_PRIORITY_REDRAW,0,
                                 (GSourceFunc) idle,
                                 widget,
                                 NULL);
  gdk_gl_drawable_gl_end (gldrawable);
}
//---------------------EXPOSE-EVENT-----------------------------//
gboolean
on_drawingarea1_expose_event (GtkWidget       *widget,
                              GdkEventExpose  *event,
                              gpointer         user_data)
{  
  GdkGLContext  *glcontext  = gtk_widget_get_gl_context  (widget);
  GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);

  /*** OpenGL BEGIN ***/
  if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
    return FALSE;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
  checkImage();
  glVertexPointer (3,GL_INT,0,vertices);
  glColorPointer  (4,GL_FLOAT, 0,colors);
  glDrawArrays (GL_POINTS, 0, r_screen*r_screen*4);
glDisableClientState (GL_VERTEX_ARRAY);
glDisableClientState (GL_COLOR_ARRAY);

  /* Swap buffers */
  if (gdk_gl_drawable_is_double_buffered (gldrawable))
  gdk_gl_drawable_swap_buffers (gldrawable);
  else
  glFlush ();

  gdk_gl_drawable_gl_end (gldrawable);
  /*** OpenGL END ***/

  return TRUE;
}

//----------------------------MAIN-----------------------------------//
int main (int   argc,      char *argv[])
{
  gtk_init (&argc, &argv);
  gtk_gl_init (&argc, &argv);
  glconfig = gdk_gl_config_new_by_mode (
					GDK_GL_MODE_RGB    |
                                        GDK_GL_MODE_DEPTH  |
                                        GDK_GL_MODE_DOUBLE
				       );
 xml = glade_xml_new ("simple.glade", NULL, NULL);
 glade_xml_signal_autoconnect (xml);

 window1 = glade_xml_get_widget (xml, "window1");
 gtk_window_set_decorated(GTK_WINDOW (window1), FALSE);
 gtk_window_fullscreen(GTK_WINDOW (window1));
 drawingarea1 = glade_xml_get_widget (xml, "drawingarea1");
 gtk_widget_set_gl_capability (drawingarea1,
                                glconfig,
                                NULL,
                                TRUE,
                                GDK_GL_RGBA_TYPE);
  gtk_widget_show (window1);
  gtk_main ();
  return 0;
}
В функции checkImage() я заполняю массив Polar[fi][r](fi - угол, r - радиус в полярной системе координат) рандомными данными для текущего угла fi. Затем преобразовываю полярные координаты в прямоугольные x и y с помощью заранее посчитанных и округленных до int значений в функции coordinates(). По полученным значениям x и у присваиваем элементам массива Dekart[x][y] соответствующие значения элементов Polar[fi][r]. Потом выводим Dekart[x][y] в OpenGL точками с соответствующими градациями красного.

А проблема в том, что ОпенГЛ ничего не рисует...)

Vitaly1988
()

Рисование поверх окна gtk

Форум — Development

Подскажите, есть ли способ рисовать на поверхности gtk окна, например, в Cairo?

Vitaly1988
()

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