2017-09-12 50 views
1

XShmGetImageを使用してデスクトップイメージを取得する簡単なプログラムを以下に試しました。エラーが表示されずにXShmGetImageが表示されない

#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."); 

     } 
    } 

出力:

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. 

残念ながら、XShmGetImageは失敗し、何の情報は表示されません。助けてください。

答えて

0

私の側からは大失敗があった。実際には、正常に動作し、XShmGetImage API()の戻り値を誤解しました。

正しいものは

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"); 
    } 
です
関連する問題