Hello,

I use Xm to create a spash screen and sometimes, this piece of code aborts with :

X Error of failed request:  BadFont (invalid Font parameter)
  Major opcode of failed request:  55 (X_CreateGC)
  Resource id in failed request:  0x0
  Serial number of failed request:  14896
  Current serial number in output stream:  14906

In this code, XtAPpPending() randomly triggers BadFont error. XCreateGC is only called by XpmCreatePixmapFromData() (libXpm 3.5.12). I suppose I have done a mistake but I don't understand my error.

        All suggestions are welcome.

        Best regards,

        JB

Faulty code:
(of course, all variables are declared, complete source code is available at http://www.rpl2.fr/cgi-bin/cvsweb/rpl/src/encart.c?rev=1.66;content-type=text%2Fplain)

display = XOpenDisplay(NULL);
if (display != NULL)
{
    objet_principal = XtVaOpenApplication(&app, "rpl",
            NULL, 0, &argc, argv, NULL, overrideShellWidgetClass, NULL);
    XSynchronize(XtDisplay(objet_principal), False);

    old_message_handler = XtAppSetWarningHandler(app,_XtWarningHandler);

    form = XtVaCreateManagedWidget("rplSplashScreen",
            xmFormWidgetClass, objet_principal,
            NULL);

    XtVaGetValues(objet_principal,
            XmNmwmDecorations, &decor,
            XmNmwmFunctions, &fonctions,
            NULL);
    decor &= ~(MWM_DECOR_ALL + MWM_DECOR_MAXIMIZE + MWM_DECOR_RESIZEH
            + MWM_DECOR_TITLE + MWM_DECOR_MENU + MWM_DECOR_BORDER);
    fonctions &= ~(MWM_FUNC_ALL + MWM_FUNC_RESIZE + MWM_FUNC_CLOSE
            + MWM_FUNC_MINIMIZE + MWM_FUNC_MAXIMIZE);

    XtVaSetValues(objet_principal,
            XmNmwmDecorations, decor,
            XmNmwmFunctions, fonctions,
            NULL);

    cadre = XtVaCreateManagedWidget("rplExternalFrame",
            xmFrameWidgetClass, form,
            XmNtopAttachment, XmATTACH_FORM,
            XmNbottomAttachment, XmATTACH_FORM,
            XmNleftAttachment, XmATTACH_FORM,
            XmNrightAttachment, XmATTACH_FORM,
            XmNtopOffset, 5,
            XmNleftOffset, 5,
            XmNrightOffset, 5,
            XmNbottomOffset, 5,
            XmNmarginWidth, 5,
            XmNmarginHeight, 5,
            NULL);

    if ((erreur = XpmCreatePixmapFromData(XtDisplay(form),
            DefaultRootWindow(XtDisplay(form)), rpl_xpm,
            &pixmap_rpl, &pixmap_rpl_masque, NULL)) != 0)
    {
        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
        return;
    }

    pixmap = XtVaCreateManagedWidget("rplPixmap",
            xmLabelWidgetClass, cadre,
            XmNlabelType, XmPIXMAP,
            XmNlabelPixmap, pixmap_rpl,
            NULL);
    largeur = WidthOfScreen(XtScreen(form));
    hauteur = HeightOfScreen(XtScreen(form));
    offset_x = 0;
    offset_y = 0;
    sscanf(rpl_xpm[0], "%d %d", &largeur_xpm, &hauteur_xpm);

    largeur_popup = (Position) (largeur_xpm + 28);
    hauteur_popup = (Position) (hauteur_xpm + 28);

    XtVaSetValues(objet_principal,
            XmNx, offset_x + ((largeur - largeur_popup) / 2),
            XmNy, offset_y + ((hauteur - hauteur_popup) / 2),
            NULL);

    XtRealizeWidget(objet_principal);
    XFlush(XtDisplay(form));
    attente.tv_sec = 0;
    attente.tv_nsec = 1000;

    gettimeofday(&horodatage_initial, NULL);

    do
    {
// XtAppPEnding randomly triggers BadFont error !

        if (XtAppPending(app) != 0)
        {
            XtAppNextEvent(app, &evenement);
            XtDispatchEvent(&evenement);
        }
        nanosleep(&attente, NULL);
        gettimeofday(&horodatage_final, NULL);

        temps_ecoule.tv_sec = horodatage_final.tv_sec
                - horodatage_initial.tv_sec;
        temps_ecoule.tv_usec = horodatage_final.tv_usec
                - horodatage_initial.tv_usec;

        if (temps_ecoule.tv_usec < 0)
        {
            temps_ecoule.tv_usec += 1000000;
            temps_ecoule.tv_sec--;
        }
    } while (((((double) temps_ecoule.tv_usec) / ((double) 1000000))
            < (((double) duree) / ((double) 1000000)));

    XtUnrealizeWidget(objet_principal);
    while(XtAppPending(app) == 0)
    {
        nanosleep(&attente, NULL);
    }

    while(XtAppPending(app) != 0)
    {
        XtAppNextEvent(app, &evenement);
        XtDispatchEvent(&evenement);
        nanosleep(&attente, NULL);
    }

    XtDestroyWidget(pixmap);
    XtDestroyWidget(cadre);
    XtDestroyWidget(form);
    XtDestroyWidget(objet_principal);

    XmDestroyPixmap(XtScreen(form), pixmap_rpl);
    XmDestroyPixmap(XtScreen(form), pixmap_rpl_masque);

    XtAppSetWarningHandler(app, old_message_handler);
    XtDestroyApplicationContext(app);
    XCloseDisplay(display);

_______________________________________________
[email protected]: X.Org support
Archives: http://lists.freedesktop.org/archives/xorg
Info: https://lists.x.org/mailman/listinfo/xorg
Your subscription address: %(user_address)s

Reply via email to