LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1968|回复: 0

介意gtk的overhead的人写的仅仅用gdk加上glib的应用

[复制链接]
发表于 2009-10-16 11:19:22 | 显示全部楼层 |阅读模式
该代码来自于Mihai Draghicioiu,我做了一些改动,主要是expose事件的响应。
假设源码文件名称为puregdk.c,使用
gcc puregdk.c -o puregdk`pkg-config --cflags --libs gtkglext-1.0`
编译。
在winxp mingw上测试通过。另外需要安装gtkglext软件包。
  1. #include <stdlib.h>
  2. #include <glib.h>
  3. #include <gdk/gdk.h>
  4. #include <gdk/gdkgl.h>
  5. #include <GL/gl.h>
  6. GdkGLWindow *glwin = NULL;
  7. GdkGLContext *glcontext = NULL;
  8. GMainLoop *mainloop = NULL;
  9. static void do_draw()
  10. {
  11.         glClearColor(1.0, .5, .2, 1.0);
  12.         glClear(GL_COLOR_BUFFER_BIT);
  13.         glMatrixMode(GL_PROJECTION);
  14.         glLoadIdentity();
  15.         glOrtho(0, 800, 600, 0, -1, 1);
  16.         glMatrixMode(GL_MODELVIEW);
  17.         glLoadIdentity();
  18.         glBegin(GL_QUADS);
  19.         glVertex2i(100, 100);
  20.         glVertex2i(400, 100);
  21.         glVertex2i(400, 500);
  22.         glVertex2i(100, 500);
  23.         glEnd();
  24. }
  25. static void event_func(GdkEvent *ev, gpointer data)
  26. {
  27.         static int oldw = 0, oldh = 0;
  28.         switch(ev->type) {
  29.         case GDK_MAP:
  30.                 break;
  31.         case GDK_DELETE:
  32.                 g_main_loop_quit(mainloop);
  33.                 break;
  34.         case GDK_KEY_PRESS:
  35.                 g_print("key pressed\n");
  36.                 break;
  37.         case GDK_EXPOSE:
  38.                 g_print("expose event\n");
  39.                 if(gdk_gl_drawable_gl_begin(gdk_window_get_gl_drawable(ev->any.window),
  40.                                         glcontext)) {
  41.                         do_draw();
  42.                         if(gdk_gl_drawable_is_double_buffered(gdk_window_get_gl_drawable(ev->any.window)))
  43.                                 gdk_gl_drawable_swap_buffers(gdk_window_get_gl_drawable(ev->any.window));
  44.                         else
  45.                                 glFlush();
  46.                         gdk_gl_drawable_gl_end(gdk_window_get_gl_drawable(ev->any.window));
  47.                 }
  48.                 break;
  49.         case GDK_CONFIGURE:
  50.                 g_print( "configure event\n");
  51.                 if (oldw != ev->configure.width || oldh != ev->configure.height){
  52.                         gdk_window_enable_synchronized_configure( ev->configure.window);
  53.                         if(gdk_gl_drawable_gl_begin(gdk_window_get_gl_drawable(ev->configure.window),
  54.                                                 glcontext)) {
  55.                                 glViewport(0, 0, ev->configure.width, ev->configure.height);
  56.                                 do_draw();
  57.                                
  58.                                 if(gdk_gl_drawable_is_double_buffered(gdk_window_get_gl_drawable(ev->configure.window)))
  59.                                         gdk_gl_drawable_swap_buffers(gdk_window_get_gl_drawable(ev->configure.window));
  60.                                 else
  61.                                         glFlush();
  62.                                 gdk_gl_drawable_gl_end(gdk_window_get_gl_drawable(ev->configure.window));
  63.                         }
  64.                         gdk_window_configure_finished( ev->configure.window);
  65.                         oldw = ev->configure.width;
  66.                         oldh = ev->configure.height;
  67.                 }
  68.                 break;
  69.         }
  70. }
  71. int main(int argc, char **argv)
  72. {
  73.         gdk_init(&argc, &argv);
  74.         gdk_gl_init(&argc, &argv);
  75.         int config_attributes[] = {
  76.                 GDK_GL_DOUBLEBUFFER,
  77.                 GDK_GL_RGBA,
  78.                 GDK_GL_RED_SIZE,        1,
  79.                 GDK_GL_GREEN_SIZE,      1,
  80.                 GDK_GL_BLUE_SIZE,       1,
  81.                 GDK_GL_DEPTH_SIZE,      12,
  82.                 GDK_GL_ATTRIB_LIST_NONE
  83.         };
  84.         GdkGLConfig *glc = gdk_gl_config_new(config_attributes);
  85.         GdkWindowAttr attr;
  86.         attr.title = argv[0];
  87.         attr.event_mask = GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK |
  88.                                 GDK_EXPOSURE_MASK;
  89.         attr.window_type = GDK_WINDOW_TOPLEVEL;
  90.         attr.wclass = GDK_INPUT_OUTPUT;
  91.         attr.width = 800;
  92.         attr.height = 600;
  93.         GdkWindow *win = gdk_window_new(NULL, &attr, 0);
  94.         gdk_window_show(win);
  95.         glwin = gdk_window_set_gl_capability(win, glc, NULL);
  96.         glcontext = gdk_gl_context_new(GDK_GL_DRAWABLE(glwin), NULL, TRUE,
  97.                         GDK_GL_RGBA_TYPE);
  98.         gdk_event_handler_set(event_func, NULL, NULL); // this is used by GTK+ internally. We just use it for ourselves here
  99.         mainloop = g_main_loop_new(g_main_context_default(), FALSE);
  100.         g_main_loop_run(mainloop);
  101.         gdk_gl_window_destroy(glwin);
  102.         gdk_window_destroy(win);
  103.         return 0;
  104. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表