2017-09-12 4 views
1

J'ai essayé ci-dessous un programme simple pour utiliser XShmGetImage pour obtenir l'image du bureau.XShmGetImage échoue sans aucune erreur affichée

#include <X11/Xlib.h> 
#include <X11/Xatom.h> 
#include <X11/Xutil.h> 
#include <X11/extensions/XShm.h> 
#include <X11/extensions/Xfixes.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 

int main(int argc, const char *argv[]) 
{ 
    int screen; 
    Window root; 
    Display* display; 
    XImage* img, 

    int shm=0; 
    XShmSegmentInfo shminfo; 

    /* My Desktop Screen Resolution */ 

    int width=1360; 
    int height=768; 

    display = XOpenDisplay(getenv("DISPLAY")); 

    shm = XShmQueryExtension(display); 

    if (shm) { 
     printf ("Ha... QueryExtension Successful..\n"); 
     int scr = XDefaultScreen (display); 
     printf ("\n Screen Number is %d ", scr); 
     img = XShmCreateImage (display, DefaultVisual(display, scr), 
          DefaultDepth (display, scr), 
         ZPixmap, 
         NULL, 
         &shminfo, 
         width, 
         height); 
     printf ("\n Bytes Per Line %d ", img->bytes_per_line); 

     shminfo.shmid = shmget (IPC_PRIVATE, img->bytes_per_line * img->height, IPC_CREAT | 0777); 

     if (shminfo.shmid == -1) { 
      printf ("\n Can not get the shared Memory ..."); 
     } else { 
      printf ("\n Greate I am able to get shared memory.."); 
     } 

     shminfo.shmaddr = img->data =shmat (shminfo.shmid, 0,0); 
     shminfo.readOnly = False; 

     if (!XShmAttach (display, &shminfo)) { 
      printf ("\n i am unable to attach now.."); 
     } else { 
      printf ("\n Super.. i am able to attach Shared memory to extension "); 
     } 


     if (!XShmGetImage (display, RootWindow(display, DefaultScreen(display)), img, 0,0, AllPlanes)){ 
      printf ("\n Now you should have your image in XImage"); 
     } else { 
      printf ("\n Ooops.. Something wrong."); 

     } 
    } 

Sortie:

Ha... QueryExtension Successful.. 
Screen Number is 0 
Bytes Per Line 5440 
Greate I am able to get shared memory.. 
Super.. i am able to attach Shared memory to extension 
Ooops.. Something wrong. 

Malheureusement, XShmGetImage échoue, et aucune information est affichée. S'il vous plaît aider.

Répondre

0

Il y avait une erreur de mon côté. En fait, cela fonctionne correctement et j'ai mal interprété la valeur de retour de l'API XShmGetImage().

L'une est correcte

if (!XShmGetImage (display, RootWindow(display, DefaultScreen(display)), img, 0,0, AllPlanes)){ 
      printf ("\n Ooops.. Something wrong."); 

     } else { 
      printf ("\n Now you should have your image in XImage"); 
    }