2)
https://bugzilla.gnome.org/show_bug.cgi?id=6897593) gcc -o glx glx.o `pkg-config --cflags --libs gtk+-3.0 gl` -lX11
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
GLXContext context;
int
area_start(GtkWidget * widget, void *data)
{
   GdkWindow *window;
   Display *display;
   int id;
   window = gtk_widget_get_window(widget);
   display = gdk_x11_display_get_xdisplay(gdk_window_get_display(window));
   id = gdk_x11_window_get_xid(window);
   if (glXMakeCurrent(display, id, context) == TRUE) {
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_LEQUAL);
      glEnable(GL_CULL_FACE);
      glCullFace(GL_BACK);
      glDisable(GL_DITHER);
      glShadeModel(GL_SMOOTH);
   }
   return TRUE;
}
int
area_expose(GtkWidget * widget, cairo_t * cr, void *data)
{
   GdkWindow *window;
   Display *display;
   int id;
   window = gtk_widget_get_window(widget);
   display = gdk_x11_display_get_xdisplay(gdk_window_get_display(window));
   id = gdk_x11_window_get_xid(window);
   if (glXMakeCurrent(display, id, context) == TRUE) {
      glClear(GL_DEPTH_BUFFER_BIT);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(0, 100, 100, 0, -1, 1);
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      glClearColor(0, 0, 0, 1);
      glClear(GL_COLOR_BUFFER_BIT);
      glColor3f(1, 1, 1);
      glBegin(GL_TRIANGLES);
      glVertex2f(10, 10);
      glVertex2f(10, 90);
      glVertex2f(90, 90);
      glEnd();
      glXSwapBuffers(display, id);
   }
   return TRUE;
}
int
area_configure(GtkWidget * widget, GdkEvent * event, void *data)
{
   GtkAllocation allocation;
   GdkWindow *window;
   Display *display;
   int id;
   window = gtk_widget_get_window(widget);
   display = gdk_x11_display_get_xdisplay(gdk_window_get_display(window));
   id = gdk_x11_window_get_xid(window);
   if (glXMakeCurrent(display, id, context) == TRUE) {
      gtk_widget_get_allocation(widget, &allocation);
      glViewport(0, 0, allocation.width, allocation.height);
   }
   return TRUE;
}
int
main(int argc, char **argv)
{
   GtkWidget *window;
   GtkWidget *area;
   GdkVisual *visual;
   GdkScreen *screen;
   XVisualInfo *xvisual;
   Colormap xcolormap;
   Display *display;
   Window root;
   int xscreen;
   int attributes[] = { GLX_RGBA, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1,
      GLX_BLUE_SIZE, 1, GLX_DOUBLEBUFFER, True, GLX_DEPTH_SIZE, 12,
      None
   };
   gtk_init(&argc, &argv);
   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title(GTK_WINDOW(window), "GLX");
   area = gtk_drawing_area_new();
   gtk_widget_set_double_buffered(area, FALSE);
   display = gdk_x11_get_default_xdisplay();
   xscreen = DefaultScreen(display);
   screen = gdk_screen_get_default();
   xvisual = glXChooseVisual(display, xscreen, attributes);
   visual = gdk_x11_screen_lookup_visual(screen, xvisual->visualid);
   root = RootWindow(display, xscreen);
   xcolormap = XCreateColormap(display, root, xvisual->visual, AllocNone);
   gtk_widget_set_visual(window, visual);
   context = glXCreateContext(display, xvisual, NULL, TRUE);
   free(xvisual);
   gtk_container_add(GTK_CONTAINER(window), area);
   gtk_widget_set_size_request(area, 100, 100);
   g_signal_connect(area, "draw", G_CALLBACK(area_expose), window);
   g_signal_connect(area, "configure-event", G_CALLBACK(area_configure),
          window);
   g_signal_connect(area, "realize", G_CALLBACK(area_start), window);
   gtk_widget_set_events(GTK_WIDGET(area), GDK_EXPOSURE_MASK |
              GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
              GDK_POINTER_MOTION_MASK |
              GDK_POINTER_MOTION_HINT_MASK | GDK_KEY_PRESS_MASK
              | GDK_KEY_RELEASE_MASK);
   gtk_widget_show(area);
   gtk_widget_show(window);
   gtk_main();
   glXDestroyContext(display, context);
   XFreeColormap(display, xcolormap);
   XFree(xvisual);
   g_object_unref(G_OBJECT(visual));
   return 0;
}
I'm
not sure this is the kind of feedback you're expected for but this is
what I'm thinking about GtkGLArea. The only problem about my example is
that you need "-lX11" in gcc and the X11's lib is really difficult to
compile for Windows.