[fdo] Programming problems in Dual Head Mode.

Chenxiao Zhao cxzhao at atsig.com
Thu Dec 1 20:06:44 PST 2005


(Hope this is the right place to post this message.)
Hi all,

I am working on a small movie player which can play full screen movie 
using Xserver.  It works fine in Single Head Mode. But is I set the 
Xserver in Dual Head Mode. I can't see any thing on both screens. The 
Code to Init the display is shown as below:

>   display = XOpenDisplay(NULL);
>    if (display == NULL)
>     fprintf(stderr, "Can not open display\n");
>
>  if (!XMBXDHQueryExtension(display, &eventBase, &errorBase))
>   {
>     printf("XMBXDHQueryExtension failed\n");
>     exit(0);
>   }
>
>   if (!XMBXDHQueryVersion(display, &major, &minor, &patch) ||
>         major < 1 ||
>         minor < 0 ||
>         patch < 0)
>   {
>         printf("XMBXDHQueryVersion or version check failed\n");
>         exit(0);
>   }
>
>   if(!XMBXDHMode(display, MBX_DUAL_HEAD, PDP_DMT, 1))
>   {
>         printf("Can not Enter Dual Head Mode.\n");
>         exit(0);
>  
>   }
>   int count = ScreenCount(display);
>   printf("number of screens = %d\n", count);
>   screen = DefaultScreen(display);
>   printf("screen = %d\n", screen);
>  
>   hwidth = 640;
>   hheight = 480;
>
>   /* Make the window */
>   window = XCreateSimpleWindow (display, RootWindow(display, screen),
>                                  0, 0, hwidth, hheight,0,0,0);
>
>   XSelectInput(display, window, KeyPressMask | StructureNotifyMask);
>
>   /* Map window. */
>
>   XMapWindow(display, window);
>
>   /* Wait for map. */
>   do
>   {
>     XNextEvent(display, &xev);
>   }
>   while (xev.type != MapNotify || xev.xmap.event != window);
>
>   gc = DefaultGC(display, screen);
>
>   yuv_height = hheight;
>   yuv_width = hwidth;
>
>   XvQueryAdaptors(display, RootWindow(display, screen), &numAdaptors, 
> &info);
>   for(i = 0; i < numAdaptors; i++) {
>         if(info[i].type & XvImageMask) { 
>             /* Adaptor has XvImage support */
>             formats = XvListImageFormats(display, info[i].base_id, 
> &numImages);
>
>             for(j = 0; j < numImages; j++) {
>                 if(formats[j].id == GUID_MBX1_PLANAR) {
>                     /* It supports our format */
>             adaptor = i;
>                     for(k = 0; k < info[i].num_ports; k++) {
>                         /* try to grab a port */
>                         if(Success == XvGrabPort(display, 
> info[i].base_id + k,
>                                         CurrentTime))
>                         {
>                             portNum = info[i].base_id + k;
>                             break;
>                         }
>                     }
>                 }
>                 if(portNum != -1) break;
>             }
>             XFree(formats);
>         }
>
>    }
>    if (adaptor == -1 ) {
>     printf("no suitable Xv adaptor found");
>     exit(1);
>    }
>    if (portNum == -1 ) {
>      printf("no free Xv adaptor ports found");
>      exit(1);
>    }
>    CompletionType = XShmGetEventBase(display) + ShmCompletion;
>    ximage = (XvImage *)  XvShmCreateImage(display, portNum,
>         GUID_MBX1_PLANAR,0, yuv_width, yuv_height, (char *) &shminfo1);
>    shminfo1.shmid = shmget (IPC_PRIVATE, ximage->data_size, 
> IPC_CREAT|0777);
>    shminfo1.shmaddr = ximage->data = shmat (shminfo1.shmid, 0, 0);
>    shminfo1.readOnly = False;
>    if(!XShmAttach (display, &shminfo1)) {
>        printf("XShmAttach failed!\n");
>    }
>    shmctl (shminfo1.shmid, IPC_RMID, 0);
>    XSync(display,False);

I use tinyX as the Xserver and the xfbdev as the card for the second 
screen.  After the Initialization, Both Screen as a respond. I mean both 
of them have been waked up. but when I am trying to write image to the 
first screen by

> XvShmPutImage(display, portNum,
>               window ,
>               gc,  ximage, 0, 0,
>               yuv_width, yuv_height, 0, 0,
>               hwidth, hheight, False);
>    XFlush(display);

I got nothing. What did I forget to do to get this work?

Many thanks.

Regards.

Ken





More information about the freedesktop mailing list