LINUX.ORG.RU

Сообщения Vitaly1988

 

gtk_cell_renderer_activate

Здравствуйте! Необходимо, чтобы в 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
()

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

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

Vitaly1988
()

gtk_main()

Зравствуйте! Вот работающая программка на основе 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
()

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

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

Vitaly1988
()

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

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

 

Vitaly1988
()

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

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

Vitaly1988
()

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

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

Vitaly1988
()

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

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

Vitaly1988
()

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

Здравствуйте. Ниже приведены программы записи и чтения одномерного массива из 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

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

Vitaly1988
()

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

Добрый день! Пишу 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

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

Vitaly1988
()

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

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

Vitaly1988
()

OpenGL + Ubuntu 10.10 + ?GPU?

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

Vitaly1988
()

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

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

#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

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

Vitaly1988
()

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