2009-01-19 7 views
1

De l'XDrawString man page il semble qu'il aceepts signé 32 bits coordonnées x et y16 limite de bits sur des arguments XDrawString

int XDrawString(Display *display, Drawable d, GC gc, int x, int y, char *string, int length);

Notez comment x et y sont int (ie: 32 bit signé Entier sur gcc/linux2.6-i386 au moins)

Le problème est que quand je passe y = 32767 (2^15-1) la chaîne est tracée à l'emplacement correct mais tout ce qui est au-dessus de cette valeur n'est pas tracée .

Je suppose que des entiers internes de 32 bits ne sont pas utilisés mais plutôt des entiers signés de 16 bits pour les coordonnées. Etant donné que les pages de manuel semblent indiquer que la fonction accepte des entiers de 32 bits, existe-t-il une option de compilation qui doit être activée pour permettre l'utilisation des entiers plus longs? Ou est-ce une limmitation de Xlib?

Répondre

4

Le protocole X11 spécifie 16 bits.

Jetez un oeil à la définition de xPolyTextReq dans <X11/Xproto.h>

typedef struct { 
    CARD8 reqType; 
    CARD8 pad; 
    CARD16 length B16; 
    Drawable drawable B32; 
    GContext gc B32; 
    INT16 x B16, y B16;   /* items (xTextElt) start after struct */ 
} xPolyTextReq; 
+0

Y at-il de toute façon de contourner cela? – hhafez

+0

Pas que je sache - en regardant la source Xlib suggère que toutes les coordonnées sont de 16 bits. Je ne vois pas pourquoi vous auriez besoin de coordonnées plus grandes que ça ... – Alnitak

+0

J'en ai besoin;) Ce n'est pas une coordonnée absolue sur un écran mais sur un scrolling de widgets – hhafez

Questions connexes