XShmGetImage失败,未显示任何错误

时间:2017-09-12 15:40:54

标签: x11 xlib xcb

我尝试过以下简单的程序来使用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失败,并且没有显示任何信息。请帮忙。

1 个答案:

答案 0 :(得分: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");
   }