here ou not here ?

Bernard Siaud alias Troumad liste at siaud.org
Mon Nov 16 10:11:24 PST 2009


Hello

I post here, but I have no answer.
I do not know if I really post when he should.

I mentioned the problem of man xrandr I find wrong for panning option.

Now, I test the option scale for xrandr. And I found some problems with 
maximizing windows. Whenever I change the scale of the two screens to 
display the same as another.
1) VGA1 1440x900 and LVDS1 1280x800
xrandr --output LVDS1 --scale 1.125x1.125
Sometimes the maximized window does not fill the screen.
2) VGA1 1280x1024 and LVDS1 1280x800
xrandr --output VGA1 --scale 1.000000x0.781250
Each time the bottom of the maximized window is too low. As the height 
of the screen was still 1024. I think.

I made a small program to automate this :
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> struct ecran
> {
>  char nom[16];
>  char mode[16];
>  unsigned short x,y;
>  struct ecran * suiv;
> };
>
> int main()
> {
>  FILE * sortie;
>  char ch[512],mode[16],nom[16];
>  unsigned short i,j;
>  unsigned short xv,yv,xp,yp;
>  unsigned short x,y;
>  struct ecran * debut = NULL, *actuelle;
>  
>  
>  system("/usr/bin/xrandr > /tmp/xrandr.sortie");
>  
>  sortie=fopen("/tmp/xrandr.sortie","r");
>  
>  while( fgets(ch,127,sortie)!=NULL)
>  {
>   /* printf("%hu => ",ch[0]);
>   printf("%s",ch); */
>   if (ch[0]!=' ')
>   {
>    sscanf(ch,"%s",nom);
>    printf("\"%s\"\n",nom);
>    if (strcmp(nom,"Screen")!=0)
>    {
>     if (debut==NULL)
>     {
>      actuelle=(struct ecran *)malloc(sizeof(struct ecran));
>      debut=actuelle;
>     }
>     else
>     {
>      actuelle->suiv=(struct ecran *)malloc(sizeof(struct ecran));
>      actuelle=actuelle->suiv;
>     }
>     actuelle->suiv=NULL;
>     actuelle->x=0;
>     strncpy(actuelle->nom,nom,15);
>    }
>   }
>   else
>   {
>    for(i=0;ch[i]==' ';i++);
>    sscanf(ch+i,"%s",mode);
>    if (strstr(ch+i,"+")!=NULL)
>    {
>     strncpy(actuelle->mode,mode,15);
>     sscanf(mode,"%hux%hu",&actuelle->x,&actuelle->y);
>     if (strstr(ch+i,"*")==NULL)
>     {
>      sprintf(ch,"xrandr --output %s --mode %s",nom,mode);
>      system(ch);
>     }
>     printf(ch);printf("\n");
>     if (strcmp(nom,"VGA1")!=0)
>     {
>      xv=actuelle->x;
>      yv=actuelle->y;
>     }
>     else if (strcmp(nom,"LVDS1")!=0)
>     {
>      xp=actuelle->x;
>      yp=actuelle->y;
>     }
>    }
>    if (actuelle->x==0)
>     if (strstr(ch+i,"*")!=NULL)
>     {
>      strncpy(actuelle->mode,mode,15);
>      sscanf(mode,"%hux%hu",&actuelle->x,&actuelle->y);
>      if (strcmp(nom,"VGA1")!=0)
>      {
>       xv=actuelle->x;
>       yv=actuelle->y;
>      }
>      else if (strcmp(nom,"LVDS1")!=0)
>      {
>       xp=actuelle->x;
>       yp=actuelle->y;
>      }
>     }
>   }
>  }
>  
>  printf("Choix de vos écrans\n");
>  actuelle=debut;
>  i=0;
>  do
>  {
>   if (actuelle->x!=0)
>   {
>    i++;
>    printf ("%hu) sortie %s mode %s\n",i,actuelle->nom,actuelle->mode);
>   }
>   actuelle=actuelle->suiv;
>  }
>  while (actuelle != NULL);
>  
>  if (i>1)
>  {
>   printf("Choix de l'écran du vidéo projecteur (de 1 à %hu)",i);
>   scanf("%hu",&j);
>   while (j>i || i==0)
>   {
>    printf("Mauvais choix : %hu !\nChoix de l'écran du vidéo projecteur 
> (de 1 à %hu)",j,i);
>   }
>   if (i>2)
>   {
>    printf("Choix de l'écran du portable (de 1 à %hu, mais pas %hu)",i,j);
>    scanf("%hu",&x);
>    while (x>i || x==0 || x==j)
>    {
>     printf("Mauvais choix : %hu !\nChoix de l'écran du vidéo 
> projecteur (de 1 à %hu pas %hu)",x,i,j);
>    }
>   }
>   else
>   {
>    if (j==1) x=2;
>    else x=1;
>   }
>  
>   actuelle=debut;
>   i=0;
>   do
>   {
>    if (actuelle->x!=0)
>    {
>     i++;
>     if (i==j) // vidéoprojecteur
>     {
>      xv=actuelle->x;
>      yv=actuelle->y;
>     }
>     else if (i==x) // écran
>     {
>      xp=actuelle->x;
>      yp=actuelle->y;
>      strcpy(nom,actuelle->nom);
>     }
>    }
>    actuelle=actuelle->suiv;
>   }
>   while (actuelle!=NULL);
>  
>   sprintf(ch,"xrandr  --output %s --pos 0x0 --panning 0x0 --scale 1x1 
> --transform 1,0,0,0,1,0,0,0,1 --output LVDS1 --pos 0x0 --panning 0x0 
> --scale 1x1   --transform 1,0,0,0,1,0,0,0,1",nom);
>   system(ch);
>   sprintf(ch,"xrandr --output %s --scale 1x1",nom); /* Je ne comprends 
> pas pourquoi je dois mettre cette ligne ! Bug de xrandr ? */
>   system(ch);
>   sprintf(ch,"xrandr --output %s --scale 
> %fx%f",nom,(float)xv/xp,(float)yv/yp);
>   system(ch);
> }
>  else
>   printf("Je n'ai trouvé qu'une seule sortie écran");
> }


-- 
Amicalement vOOotre, Troumad Alias Bernard SIAUD, http://troumad.org
N'envoyez que des documents avec des formats ouverts, comme 
http://fr.openoffice.org
Adresse electronique speciale liste


More information about the xorg-devel mailing list