title: Compilation for GTK+ using OpenGL
body: <p><strong>Context</strong>: I am learning development of GUI using GTK+. I also wanted to draw lines and circles on the GUI. So I started with the tutorials and I am stuck with the part of GtkGLArea. I am following the code given in the <a href="https://developer.gnome.org/gtk3/unstable/GtkGLArea.html" rel="nofollow noreferrer">GTK+ documentation</a> </p>
  
  <p><strong>The error</strong>: </p>
  
  <pre><code>glTrial.cpp:32:13: error: variable or field ‘on_realize’ declared void
   on_realize (GtkGLarea *area)
               ^
  glTrial.cpp:32:13: error: ‘GtkGLarea’ was not declared in this scope
  glTrial.cpp:32:24: error: ‘area’ was not declared in this scope
   on_realize (GtkGLarea *area)
  </code></pre>
  
  <p>I believe I am not compiling properly and the compiler is not able to find correct headers. </p>
  
  <p><strong>Compilation</strong>: </p>
  
  <pre><code>g++ -std=c++14 \`pkg-config --cflags gtk+-3.0\` -o glTrial glTrial.cpp \`pkg-config --libs gtk+-3.0\` 
  </code></pre>
  
  <p><strong>The code</strong>:</p>
  
  <pre><code>#include &lt;gtk/gtk.h&gt;
  #include &lt;gtkgl-2.0/gtkgl/gdkgl.h&gt;
  #include &lt;gtkgl-2.0/gtkgl/gtkglarea.h&gt;
  
  static void
  print_hello (GtkWidget *widget,
           gpointer user_data)
  {
    g_print ("Hello World\n");
  }
  
  static gboolean
  render (GtkGLArea *area, GdkGLContext *context)
  {
    // inside this function it's safe to use GL; the given
    // #GdkGLContext has been made current to the drawable
    // surface used by the #GtkGLArea and the viewport has
    // already been set to be the size of the allocation
  
    // we can start by clearing the buffer
    //glClearColor (0, 0, 0, 0);
    // glClear (GL_COLOR_BUFFER_BIT);
  
    // draw your object
    // draw_an_object ();
  
    // we completed our drawing; the draw commands will be
    // flushed at the end of the signal emission chain, and
    // the buffers will be drawn on the window
    return TRUE;
  }
  static void
  on_realize (GtkGLarea *area)
  {
    // We need to make the context current if we want to
    // call GL API
    gtk_gl_area_make_current (area);
  
    // If there were errors during the initialization or
    // when trying to make the context current, this
    // function will return a #GError for you to catch
    if (gtk_gl_area_get_error (area) != NULL)
      return;
  
    // You can also use gtk_gl_area_set_error() in order
    // to show eventual initialization errors on the
    // GtkGLArea widget itself
    GError *internal_error = NULL;
    init_buffer_objects (&amp;error);
    if (error != NULL)
      {
        gtk_gl_area_set_error (area, error);
        g_error_free (error);
        return;
      }
  
    init_shaders (&amp;error);
    if (error != NULL)
      {
        gtk_gl_area_set_error (area, error);
        g_error_free (error);
        return;
      }
  }
  
  static void
  activate (GtkApplication* app,
        gpointer user_data)
  {
    GtkWidget *window;
    GtkWidget *grid;
    GtkWidget *button;
    GtkWidget *gl_area =gtk_gl_area_new();
  
    /* Create a new window, and set its title */
    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Window");
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    //  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
  
    /* Here we construct the container that is going to pack the buttons*/
    grid = gtk_grid_new();
  
    /* Pack the container in the window */
    gtk_container_add (GTK_CONTAINER (window), grid);
  
  
    button = gtk_button_new_with_label ("Quit");
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  
    gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 2, 1);
  
    button = gtk_button_new_with_label ("Hello");
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (print_hello), NULL);
  
    gtk_grid_attach (GTK_GRID (grid), button, 0, 1, 2, 1);
  
    /* Trial for GL area*/
    g_signal_connect (gl_area, "render", G_CALLBACK(render), NULL);
    gtk_grid_attach (GTK_GRID (grid), gl_area, 0, 2, 10, 10);
  
    gtk_widget_show_all (window);
  }
  
  
  int
  main (int argc,
        char **argv)
  {
    GtkApplication *app;
    int status;
    g_application_run (G_APPLICATION (app), argc, argv);
    //  app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK (activate), NULL);
    status = g_application_run (G_APPLICATION (app), argc, argv);
    g_object_unref (app);
    return status;
  
  }
  </code></pre>