Linux 在Ubuntu上使用特殊游标重新启动freeglut/OpenGL C应用程序失败

Linux 在Ubuntu上使用特殊游标重新启动freeglut/OpenGL C应用程序失败,linux,opengl,ubuntu,x11,freeglut,Linux,Opengl,Ubuntu,X11,Freeglut,我有一个freeglut应用程序,可以根据用户需求关闭和重新打开。它在Windows和Ubuntu上运行良好,除非我指定鼠标光标的外观。下面是一个最低限度的工作示例: #include <stdio.h> #include <unistd.h> #include <GL/freeglut.h> void keyboard(unsigned char key, const int x, const int y); void display(void); voi

我有一个freeglut应用程序,可以根据用户需求关闭和重新打开。它在Windows和Ubuntu上运行良好,除非我指定鼠标光标的外观。下面是一个最低限度的工作示例:

#include <stdio.h>
#include <unistd.h>
#include <GL/freeglut.h>

void keyboard(unsigned char key, const int x, const int y);
void display(void);
void closeme(void);
void init_main(int argc, char **argv);

int win_main_no = 0;

int main(int argc, char **argv)
{
    init_main(argc, argv);
    printf("'%s': passed line %i\n", __func__, __LINE__);

    sleep(1);

    init_main(argc, argv);
    printf("'%s': passed line %i\n", __func__, __LINE__);

    return EXIT_SUCCESS;
}

void init_main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

    glutCreateWindow("GLUT Test");

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glutSetCursor(GLUT_CURSOR_CROSSHAIR); /**< this is the problem */

    glClearColor(0., 0., 0., 0.);
    glClearDepth(1.);

    win_main_no = glutGetWindow();

    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
    glutKeyboardFunc(keyboard);
    glutDisplayFunc(display);
    glutCloseFunc(closeme);
    glutMainLoop();
}

void closeme(void)
{
    printf("'%s': passed line %i\n", __func__, __LINE__);
    glutDestroyWindow(win_main_no);
    glutLeaveMainLoop();
}

void keyboard(unsigned char key, const int x, const int y)
{
    switch(key)
    {
        case 27:
        printf("'%s': passed line %i\n", __func__, __LINE__);
        glutLeaveMainLoop();
        printf("'%s': passed line %i\n", __func__, __LINE__);
        break;
    }
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5, 5, -5, 5, -2, 2);

    glColor3f(1., 0., 0.);

    glBegin(GL_POLYGON);
        glVertex2d(-.5, .5);
        glVertex2d(-.5, -.5);
        glVertex2d(.5, -.5);
        glVertex2d(.5, .5);
    glEnd();

    glRasterPos3d(1.05, 0., 0.);
    glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'x');
    glRasterPos3d(0., 0., 1.05);
    glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'y');
    glRasterPos3d(0., 1.05, 0.);
    glutBitmapCharacter(GLUT_BITMAP_8_BY_13, 'z');

    glFlush();
    glutSwapBuffers();
}
或者Linux

gcc -O0 -g -Wall -std=c99 -o test test.c -lGL -lGLU -lglut
在64位WINDOWS 7、freeglut 2.8.0上,输出读取

'keyboard': passed line 61
'keyboard': passed line 63
'closeme': passed line 51
'main': passed line 15
'keyboard': passed line 61
'keyboard': passed line 63
'closeme': passed line 51
'main': passed line 20
但在UBUNTU 64位14.04上,存储库中的freeglut:

'keyboard': passed line 61
'keyboard': passed line 63
'closeme': passed line 51
'main': passed line 15
X Error of failed request:  BadCursor (invalid Cursor parameter)
Major opcode of failed request:  2 (X_ChangeWindowAttributes)
  Resource id in failed request:  0x460000a
  Serial number of failed request:  64
  Current serial number in output stream:  67
'closeme': passed line 51

除了告诉在Linux上不要使用游标的标志之外,还有什么方法可以防止这种情况发生吗?这条消息“无效光标参数”让我感到困惑,因为同一个标志在第一次运行时起作用。是否需要在关闭窗口时以某种方式重置此设置?

这是freeglut中的一个错误

下载源代码,看看freeglut_cursor.c,想知道当X11显示器关闭时谁会清理光标缓存。遗憾的是,答案是没有人


您可以轻松地自己修复它,并可以选择向freeglut维护人员提交补丁,或者只是向他们提交一个bug。

这是freeglut中的一个bug

下载源代码,看看freeglut_cursor.c,想知道当X11显示器关闭时谁会清理光标缓存。遗憾的是,答案是没有人


您可以轻松地自己修复它,并且可以选择向freeglut维护人员提交补丁,或者只向他们提交一个bug。

修复,svn版本1749。X错误是由于重新使用以前连接到X服务器时留下的过时缓存游标造成的

顺便说一句,sourceforge上还有一个bug跟踪器,您可以在其中提交bug:

如果bug是紧急的,将bug提交给跟踪器,并向freeglut开发者邮件列表发送一封包含bug编号/url的电子邮件可能是最好的组合


干杯。

已修复,svn版本1749。X错误是由于重新使用以前连接到X服务器时留下的过时缓存游标造成的

顺便说一句,sourceforge上还有一个bug跟踪器,您可以在其中提交bug:

如果bug是紧急的,将bug提交给跟踪器,并向freeglut开发者邮件列表发送一封包含bug编号/url的电子邮件可能是最好的组合


干杯。

谢谢,很快。谢谢,很快。
'keyboard': passed line 61
'keyboard': passed line 63
'closeme': passed line 51
'main': passed line 15
X Error of failed request:  BadCursor (invalid Cursor parameter)
Major opcode of failed request:  2 (X_ChangeWindowAttributes)
  Resource id in failed request:  0x460000a
  Serial number of failed request:  64
  Current serial number in output stream:  67
'closeme': passed line 51